import React from 'react'; import { get } from 'lodash'; import { Progress, Row } from 'antd'; import { computePercentage } from 'src/utils'; import { cephStatusColorMap, cephStatusMap, getSuitableValue, } from 'resources/prometheus/monitoring'; import CircleChart from 'components/PrometheusChart/CircleWithRightLegend'; import { handleResponses } from 'components/PrometheusChart/utils/dataHandler'; import { ChartType } from 'components/PrometheusChart/utils/utils'; import globalRootStore from 'stores/root'; import { renderTopColumnChart, renderTopColumnExtra, renderTopProgress, } from './components/Tops'; import styles from './index.less'; export const physicalNodeLeftTopCardList = [ { title: t('Physical CPU Usage'), span: 12, createFetchParams: { metricKey: 'monitorOverview.physicalCPUUsage', }, renderContent: ({ data }) => { const used = get(data[0], 'y', 0); const total = get(data[1], 'y', 0); return (
{computePercentage(used, total)} % {`${used} / ${total}`}
); }, }, { title: t('Total Ram'), span: 12, createFetchParams: { metricKey: 'monitorOverview.physicalMemoryUsage', }, renderContent: (store) => { const { data } = store; const usedValue = get(data[0], 'y', 0); const totalValue = get(data[1], 'y', 0); const used = getSuitableValue(usedValue, 'memory'); const total = getSuitableValue(totalValue, 'memory'); return (
{computePercentage(usedValue, totalValue)} % {`${used} / ${total}`}
); }, }, { title: t('Physical Storage Usage'), span: 24, createFetchParams: { metricKey: 'monitorOverview.physicalStorageUsage', }, renderContent: (store) => { const { data } = store; const usedValue = get(data[0], 'y', 0); const totalValue = get(data[1], 'y', 0); const used = getSuitableValue(usedValue, 'disk'); const total = getSuitableValue(totalValue, 'disk'); const progressPercentage = computePercentage(usedValue, totalValue); return (
{`${t('Used')} ${used} / ${t('Total')} ${total}`} 80 ? globalCSS.warnDarkColor : globalCSS.primaryColor } showInfo={progressPercentage !== 100} />
); }, }, ]; export const physicalNodeRightTopCardList = [ { visibleHeight: 319, createFetchParams: { requestType: 'current', metricKey: 'monitorOverview.computeNodeStatus', }, handleDataParams: { formatDataFn: (responses) => { const status = [ { type: 'up', value: 0, }, { type: 'down', value: 0, }, ]; const result = get(responses[0], 'data.result', []); result.forEach((r) => { const idx = r.metric.adminState === 'enabled' ? 0 : 1; status[idx].value += parseInt(r.value[1], 10); }); return status; }, }, title: t('Compute Node status'), renderContent: ({ data }) => (
), }, ]; export const topCardList = [ { title: t('Host CPU Usage'), span: 12, createFetchParams: { metricKey: 'monitorOverview.topHostCPUUsage', }, handleDataParams: { typeKey: 'instance', }, renderContent: renderTopProgress, }, { title: t('Host Disk Average IOPS'), span: 12, createFetchParams: { metricKey: 'monitorOverview.topHostDiskIOPS', }, handleDataParams: { formatDataFn: (reps, tk, dk, mk) => { const data = []; reps.forEach((ret, resIdx) => { (ret.data.result || []).forEach((d) => { data.push({ x: d.metric.instance, y: parseFloat(get(d, 'value[1]', 0)), type: mk[resIdx], }); }); }); return data; }, modifyKeys: [t('read'), t('write')], }, extra: renderTopColumnExtra, renderContent: renderTopColumnChart, }, { title: t('Host Memory Usage'), span: 12, createFetchParams: { metricKey: 'monitorOverview.topHostMemoryUsage', }, handleDataParams: { typeKey: 'instance', }, renderContent: renderTopProgress, }, { title: t('Host Average Network IO'), span: 12, createFetchParams: { metricKey: 'monitorOverview.topHostInterface', }, handleDataParams: { formatDataFn: (reps, tk, dk, mk) => { const data = []; reps.forEach((ret, resIdx) => { (ret.data.result || []).forEach((d) => { data.push({ x: d.metric.instance, y: parseFloat(get(d, 'value[1]', 0)), type: mk[resIdx], }); }); }); return data; }, modifyKeys: [t('receive'), t('transmit')], }, extra: renderTopColumnExtra, renderContent: (p) => { const Cmp = renderTopColumnChart(p); return React.cloneElement(Cmp, { ...Cmp.props, scale: { y: { nice: true, formatter: (d) => getSuitableValue(d, 'traffic', 0), }, }, }); }, }, ]; export const storageLeftCardList = [ { title: t('Storage Cluster Status'), span: 24, createFetchParams: { metricKey: 'monitorOverview.cephHealthStatus', }, renderContent: (store) => { const data = get(store.data, 'y', 0); return (
{cephStatusMap[data]}
); }, }, { title: t('Storage Cluster Usage'), span: 12, createFetchParams: { metricKey: 'monitorOverview.cephStorageUsage', }, renderContent: (store) => { const { data } = store; const usedValue = get(data[0], 'y', 0); const totalValue = get(data[1], 'y', 0); const used = getSuitableValue(usedValue, 'disk'); const total = getSuitableValue(totalValue, 'disk'); return (
{computePercentage(usedValue, totalValue)} % {`${used} / ${total}`}
); }, }, { title: t('Disk allocation (GiB)'), span: 12, createFetchParams: { metricKey: 'monitorOverview.cephStorageAllocate', }, renderContent: (store) => { const { data } = store; const totalValue = parseFloat(get(data[1], 'y', 0).toFixed(2)); const usedValue = parseFloat( (totalValue - get(data[0], 'y', 0)).toFixed(2) ); return (
{computePercentage(usedValue, totalValue)} % {`${usedValue} GiB / ${totalValue} GiB`}
); }, hidden: !globalRootStore.checkEndpoint('cinder'), }, ]; export const storageRightChartList = [ { title: t('Storage Cluster IOPS'), createFetchParams: { requestType: 'range', metricKey: 'monitorOverview.cephStorageClusterIOPS', }, handleDataParams: { formatDataFn: handleResponses, modifyKeys: [t('read'), t('write')], }, span: 24, chartProps: { chartType: ChartType.MULTILINE, height: 318, scale: { y: { nice: true, }, }, }, }, ];