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 23, 2021
1 parent bef530b commit 304c28a
Show file tree
Hide file tree
Showing 4 changed files with 122 additions and 2 deletions.
Expand Up @@ -32,6 +32,13 @@
"Pool creation is not supported for OpenShift Container Storage's external mode.": "Pool creation is not supported for OpenShift Container Storage's external mode.",
"A BlockPool is a logical entity providing elastic capacity to applications and workloads. Pools provide a means of supporting policies for access data resilience and storage efficiency.": "A BlockPool is a logical entity providing elastic capacity to applications and workloads. Pools provide a means of supporting policies for access data resilience and storage efficiency.",
"BlockPool Creation Form": "BlockPool Creation Form",
"Compression status": "Compression status",
"Storage efficiency": "Storage efficiency",
"Compression eligibility": "Compression eligibility",
"Compression ratio": "Compression ratio",
"Compression savings": "Compression savings",
"<0><0><0> What does each state mean?</0></0><1><0>Starting replay:</0> Initiating image replication process.</1><2><0>Replaying:</0> Image replication is ongoing or idle between clusters.</2><3><0>Stopping replay:</0> Image replication process is shutting down.</3><4><0>Stopped:</0> Image replication process has shut down.</4><5><0>Error:</0> Image replication process stopped due to an error. </5><6><0>Unknown:</0> Unable to determine image state due to an error. Check your network connection and remote cluster RBD mirror daemon.</6></0>": "<0><0><0> What does each state mean?</0></0><1><0>Starting replay:</0> Initiating image replication process.</1><2><0>Replaying:</0> Image replication is ongoing or idle between clusters.</2><3><0>Stopping replay:</0> Image replication process is shutting down.</3><4><0>Stopped:</0> Image replication process has shut down.</4><5><0>Error:</0> Image replication process stopped due to an error. </5><6><0>Unknown:</0> Unable to determine image state due to an error. Check your network connection and remote cluster RBD mirror daemon.</6></0>",
"Raw capacity is the absolute total disk space available to the array subsystem": "Raw capacity is the absolute total disk space available to the array subsystem",
"Name": "Name",
"Bucket Name": "Bucket Name",
"Type": "Type",
Expand Down Expand Up @@ -266,7 +273,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 Container Storage can be configured to use compression. The efficiency rate reflects the actual compression ratio when using such a configuration.": "OpenShift Container Storage 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 @@ -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,102 @@
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: '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:
'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: '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 ? 'Disabled' : 'Enabled'}
</DetailItem>
</DetailsBody>
<DetailsBody>
{compressionEnabled && (
<div className="co-dashboard-card__body--top-margin">
<DetailItem isLoading={loading} title={t('ceph-storage-plugin~Storage efficiency')}>
<EfficiencyItemBody {...compressionEligibilityProps} />
<EfficiencyItemBody {...compressionRatioProps} />
<EfficiencyItemBody {...compressionSavingsProps} />
</DetailItem>
</div>
)}
</DetailsBody>
</DashboardCardBody>
</DashboardCard>
);
};
Expand Up @@ -32,6 +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 @@ -226,6 +230,9 @@ export const getPoolQuery = (poolNames: string[], queryName: StorageDashboardQue
[StorageDashboardQuery.POOL_MAX_CAPACITY_AVAILABLE]: `ceph_pool_max_avail * on (pool_id) group_left(name)ceph_pool_metadata{name=~'${names}'}`,
[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 304c28a

Please sign in to comment.