Skip to content

Commit

Permalink
Adding compression details card
Browse files Browse the repository at this point in the history
Signed-off-by: Arun Kumar Mohan <amohan@redhat.com>
  • Loading branch information
aruniiird committed Jul 25, 2021
1 parent 22dd91f commit 37d31df
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 4 deletions.
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>
)}
</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];
};

0 comments on commit 37d31df

Please sign in to comment.