Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add compression card to pool dashboard #9507

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -240,6 +240,14 @@
"Create StorageSystem": "Create StorageSystem",
"StorageSystem is an entity of OpenShift Data Foundation. It represents all of the required storage and compute resources.": "StorageSystem is an entity of OpenShift Data Foundation. It represents all of the required storage and compute resources.",
"Not found": "Not found",
"Compression eligibility": "Compression eligibility",
"Compression eligibility indicates the percentage of incoming data that is compressible": "Compression eligibility indicates the percentage of incoming data that is compressible",
"Compression savings": "Compression savings",
"Compression savings indicates the total savings gained from compression for this pool, including replicas": "Compression savings indicates the total savings gained from compression for this pool, including replicas",
"Compression ratio": "Compression ratio",
"Compression ratio indicates the achieved compression on eligible data for this pool": "Compression ratio indicates the achieved compression on eligible data for this pool",
"Compression status": "Compression status",
"Storage efficiency": "Storage efficiency",
"Details": "Details",
"Replicas": "Replicas",
"Inventory": "Inventory",
Expand Down Expand Up @@ -349,7 +357,6 @@
"Many buckets have issues": "Many buckets have issues",
"Some buckets have issues": "Some buckets have issues",
"{{capacityRatio, number}}:1": "{{capacityRatio, number}}:1",
"Compression ratio": "Compression ratio",
"OpenShift Data Foundation can be configured to use compression. The efficiency rate reflects the actual compression ratio when using such a configuration.": "OpenShift Data Foundation can be configured to use compression. The efficiency rate reflects the actual compression ratio when using such a configuration.",
"Savings": "Savings",
"Savings shows the uncompressed and non-deduped data that would have been stored without those techniques.": "Savings shows the uncompressed and non-deduped data that would have been stored without those techniques.",
Expand Down Expand Up @@ -637,8 +644,6 @@
"Pool {{name}} was created with errors.": "Pool {{name}} was created with errors.",
"Delete": "Delete",
"StorageClasses": "StorageClasses",
"Compression status": "Compression status",
"Compression savings": "Compression savings",
"hr": "hr",
"min": "min",
"A minimal cluster deployment will be performed.": "A minimal cluster deployment will be performed.",
Expand Down
Expand Up @@ -11,8 +11,13 @@ import { StatusCard } from './status-card';
import { RawCapacityCard } from './raw-capacity-card';
import { UtilizationCard } from './utilization-card';
import { MirroringCard } from './mirroring-card';
import { CompressionDetailsCard } from './compression-details-card';

const leftCards = [{ Card: DetailsCard }, { Card: InventoryCard }];
const leftCards = [
{ Card: DetailsCard },
{ Card: InventoryCard },
{ Card: CompressionDetailsCard },
];
const mainCards = [{ Card: StatusCard }, { Card: RawCapacityCard }, { Card: UtilizationCard }];
const rightCards = [{ Card: MirroringCard }];

Expand Down
@@ -0,0 +1,112 @@
import * as React from 'react';
import { useTranslation } from 'react-i18next';
import { compose } from 'redux';

import { getInstantVectorStats } from '@console/internal/components/graphs/utils';

import DashboardCard from '@console/shared/src/components/dashboard/dashboard-card/DashboardCard';
import DashboardCardBody from '@console/shared/src/components/dashboard/dashboard-card/DashboardCardBody';
import DashboardCardHeader from '@console/shared/src/components/dashboard/dashboard-card/DashboardCardHeader';
import DashboardCardTitle from '@console/shared/src/components/dashboard/dashboard-card/DashboardCardTitle';
import DetailItem from '@console/shared/src/components/dashboard/details-card/DetailItem';
import DetailsBody from '@console/shared/src/components/dashboard/details-card/DetailsBody';
import { usePrometheusQueries } from '@console/shared/src/components/dashboard/utilization-card/prometheus-hook';
import {
humanizePercentage,
humanizeBinaryBytes,
humanizeNumber,
} from '@console/internal/components/utils';

import { BlockPoolDashboardContext } from './block-pool-dashboard-context';
import { EfficiencyItemBody } from '../common/storage-efficiency/storage-efficiency-card-item';

import { getPoolQuery, StorageDashboardQuery } from '../../../queries/ceph-queries';

const parser = compose((val) => val?.[0]?.y, getInstantVectorStats);

export const CompressionDetailsCard: React.FC = () => {
const { t } = useTranslation();
const { obj } = React.useContext(BlockPoolDashboardContext);

const compressionMode = obj.spec?.compressionMode;
const compressionEnabled = compressionMode !== 'none';
const { name } = obj.metadata;

// Compression Metrics
const queries = React.useMemo(
() => [
getPoolQuery([name], StorageDashboardQuery.POOL_COMPRESSION_SAVINGS),
getPoolQuery([name], StorageDashboardQuery.POOL_COMPRESSION_ELIGIBILITY),
getPoolQuery([name], StorageDashboardQuery.POOL_COMPRESSION_RATIO),
],
[name],
);

const [values, loading, loadError] = usePrometheusQueries(queries, parser as any);
const poolCompressionSavings = values?.[0];
const poolCompressionEligibility = values?.[1];
const poolCompressionRatio = values?.[2];

const compressionEligibilityProps = {
stats: Number(poolCompressionEligibility),
isLoading: loading,
error: loadError || !poolCompressionEligibility,
title: t('ceph-storage-plugin~Compression eligibility'),
getStats: () => humanizePercentage(poolCompressionEligibility).string,
infoText: t(
'ceph-storage-plugin~Compression eligibility indicates the percentage of incoming data that is compressible',
),
};

const compressionSavingsProps = {
stats: Number(poolCompressionSavings),
isLoading: loading,
error: loadError || !poolCompressionSavings,
title: t('ceph-storage-plugin~Compression savings'),
getStats: () => humanizeBinaryBytes(poolCompressionSavings).string,
infoText: t(
'ceph-storage-plugin~Compression savings indicates the total savings gained from compression for this pool, including replicas',
),
};

const compressionRatioProps = {
stats: Number(poolCompressionRatio),
isLoading: loading,
error: loadError || !poolCompressionRatio,
title: t('ceph-storage-plugin~Compression ratio'),
getStats: () => `${humanizeNumber(poolCompressionRatio).string}:1`,
infoText: t(
'ceph-storage-plugin~Compression ratio indicates the achieved compression on eligible data for this pool',
),
};

return (
<DashboardCard data-test-id="compression-details-card">
<DashboardCardHeader>
<DashboardCardTitle>{t('ceph-storage-plugin~Compression')}</DashboardCardTitle>
</DashboardCardHeader>
<DashboardCardBody>
<DetailsBody>
<DetailItem isLoading={!obj} title={t('ceph-storage-plugin~Compression status')}>
{!compressionEnabled
? t('ceph-storage-plugin~Disabled')
: t('ceph-storage-plugin~Enabled')}
</DetailItem>
</DetailsBody>
{compressionEnabled && (
<DetailsBody>
<div>
<DetailsBody>
<DetailItem isLoading={loading} title={t('ceph-storage-plugin~Storage efficiency')}>
<EfficiencyItemBody {...compressionEligibilityProps} />
<EfficiencyItemBody {...compressionRatioProps} />
<EfficiencyItemBody {...compressionSavingsProps} />
</DetailItem>
</DetailsBody>
</div>
</DetailsBody>
Comment on lines +97 to +107
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bipuladh , moved the <DetailsBody> into compressionEnabled true part.

)}
</DashboardCardBody>
</DashboardCard>
);
};
Expand Up @@ -32,7 +32,10 @@ export enum StorageDashboardQuery {
POOL_MAX_CAPACITY_AVAILABLE = 'POOL_MAX_CAPACITY_AVAILABLE',
POOL_UTILIZATION_IOPS_QUERY = 'POOL_UTILIZATION_IOPS_QUERY',
POOL_UTILIZATION_THROUGHPUT_QUERY = 'POOL_UTILIZATION_THROUGHPUT_QUERY',
// Pool Compression Details
POOL_COMPRESSION_SAVINGS = 'POOL_COMPRESSION_SAVINGS',
POOL_COMPRESSION_RATIO = 'POOL_COMPRESSION_RATIO',
POOL_COMPRESSION_ELIGIBILITY = 'POOL_COMPRESSION_ELIGIBILITY',
// Capacity Info Card
RAW_CAPACITY_TOTAL = 'RAW_TOTAL_CAPACITY',
RAW_CAPACITY_USED = 'RAW_CAPACITY_USED',
Expand Down Expand Up @@ -228,6 +231,8 @@ export const getPoolQuery = (poolNames: string[], queryName: StorageDashboardQue
[StorageDashboardQuery.POOL_UTILIZATION_IOPS_QUERY]: `(rate(ceph_pool_wr[1m]) + rate(ceph_pool_rd[1m])) * on (pool_id) group_left(name)ceph_pool_metadata{name=~'${names}'}`,
[StorageDashboardQuery.POOL_UTILIZATION_THROUGHPUT_QUERY]: `(rate(ceph_pool_wr_bytes[1m]) + rate(ceph_pool_rd_bytes[1m])) * on (pool_id) group_left(name)ceph_pool_metadata{name=~'${names}'}`,
[StorageDashboardQuery.POOL_COMPRESSION_SAVINGS]: `(ceph_pool_compress_under_bytes - ceph_pool_compress_bytes_used) * on (pool_id) group_left(name)ceph_pool_metadata{name=~'${names}'}`,
[StorageDashboardQuery.POOL_COMPRESSION_ELIGIBILITY]: `(((ceph_pool_compress_under_bytes > 0) / ceph_pool_stored_raw) * 100) * on (pool_id) group_left(name)ceph_pool_metadata{name=~'${names}'}`,
[StorageDashboardQuery.POOL_COMPRESSION_RATIO]: `((ceph_pool_compress_under_bytes / ceph_pool_compress_bytes_used > 0) and on(pool_id) (((ceph_pool_compress_under_bytes > 0) / ceph_pool_stored_raw) * 100 > 0.5)) * on (pool_id) group_left(name)ceph_pool_metadata{name=~'${names}'}`,
};
return queries[queryName];
};