diff --git a/src/components/StorageGroupInfo/StorageGroupInfo.tsx b/src/components/StorageGroupInfo/StorageGroupInfo.tsx index 2db2eab638..fee88b7bd4 100644 --- a/src/components/StorageGroupInfo/StorageGroupInfo.tsx +++ b/src/components/StorageGroupInfo/StorageGroupInfo.tsx @@ -36,9 +36,9 @@ export function StorageGroupInfo({data, className, ...infoViewerProps}: StorageG State, MissingDisks, Available, - LatencyPutTabletLog, - LatencyPutUserData, - LatencyGetFast, + LatencyPutTabletLogMs, + LatencyPutUserDataMs, + LatencyGetFastMs, } = data || {}; const storageGroupInfoFirstColumn = []; @@ -122,22 +122,22 @@ export function StorageGroupInfo({data, className, ...infoViewerProps}: StorageG value: , }); } - if (valueIsDefined(LatencyPutTabletLog)) { + if (valueIsDefined(LatencyPutTabletLogMs)) { storageGroupInfoSecondColumn.push({ label: storageGroupInfoKeyset('latency-put-tablet-log'), - value: formatToMs(LatencyPutTabletLog), + value: formatToMs(LatencyPutTabletLogMs), }); } - if (valueIsDefined(LatencyPutUserData)) { + if (valueIsDefined(LatencyPutUserDataMs)) { storageGroupInfoSecondColumn.push({ label: storageGroupInfoKeyset('latency-put-user-data'), - value: formatToMs(LatencyPutUserData), + value: formatToMs(LatencyPutUserDataMs), }); } - if (valueIsDefined(LatencyGetFast)) { + if (valueIsDefined(LatencyGetFastMs)) { storageGroupInfoSecondColumn.push({ label: storageGroupInfoKeyset('latency-get-fast'), - value: formatToMs(LatencyGetFast), + value: formatToMs(LatencyGetFastMs), }); } if (valueIsDefined(AllocationUnits)) { diff --git a/src/containers/Storage/StorageGroups/columns/columns.tsx b/src/containers/Storage/StorageGroups/columns/columns.tsx index 39cf8dc64b..570c09e71d 100644 --- a/src/containers/Storage/StorageGroups/columns/columns.tsx +++ b/src/containers/Storage/StorageGroups/columns/columns.tsx @@ -10,9 +10,12 @@ import {InternalLink} from '../../../../components/InternalLink'; import {UsageLabel} from '../../../../components/UsageLabel/UsageLabel'; import {VDiskWithDonorsStack} from '../../../../components/VDisk/VDiskWithDonorsStack'; import {getStorageGroupPath} from '../../../../routes'; +import {valueIsDefined} from '../../../../utils'; import {cn} from '../../../../utils/cn'; -import {stringifyVdiskId} from '../../../../utils/dataFormatters/dataFormatters'; +import {EMPTY_DATA_PLACEHOLDER} from '../../../../utils/constants'; +import {formatNumber, stringifyVdiskId} from '../../../../utils/dataFormatters/dataFormatters'; import {isSortableStorageProperty} from '../../../../utils/storage'; +import {formatToMs, parseUsToMs} from '../../../../utils/timeParsers'; import {bytesToGB, bytesToSpeed} from '../../../../utils/utils'; import {Disks} from '../../Disks/Disks'; import {getDegradedSeverity, getUsageSeverityForStorageGroup, isVdiskActive} from '../../utils'; @@ -183,6 +186,30 @@ const writeColumn: StorageGroupsColumn = { align: DataTable.RIGHT, }; +const latencyColumn: StorageGroupsColumn = { + name: STORAGE_GROUPS_COLUMNS_IDS.Latency, + header: STORAGE_GROUPS_COLUMNS_TITLES.Latency, + width: 100, + render: ({row}) => { + return valueIsDefined(row.LatencyPutTabletLogMs) + ? formatToMs(parseUsToMs(row.LatencyPutTabletLogMs)) + : EMPTY_DATA_PLACEHOLDER; + }, + align: DataTable.RIGHT, +}; + +const allocationUnitsColumn: StorageGroupsColumn = { + name: STORAGE_GROUPS_COLUMNS_IDS.AllocationUnits, + header: STORAGE_GROUPS_COLUMNS_TITLES.AllocationUnits, + width: 150, + render: ({row}) => { + return valueIsDefined(row.AllocationUnits) + ? formatNumber(row.AllocationUnits) + : EMPTY_DATA_PLACEHOLDER; + }, + align: DataTable.RIGHT, +}; + const getVDisksColumn = (data?: GetStorageColumnsData): StorageGroupsColumn => ({ name: STORAGE_GROUPS_COLUMNS_IDS.VDisks, header: STORAGE_GROUPS_COLUMNS_TITLES.VDisks, @@ -236,7 +263,7 @@ export const getStorageTopGroupsColumns: StorageColumnsGetter = () => { }); }; -export const getStorageGroupsColumns: StorageColumnsGetter = (data?: GetStorageColumnsData) => { +export const getStorageGroupsColumns: StorageColumnsGetter = (data) => { const columns = [ groupIdColumn, poolNameColumn, @@ -249,6 +276,8 @@ export const getStorageGroupsColumns: StorageColumnsGetter = (data?: GetStorageC usedSpaceFlagColumn, readColumn, writeColumn, + latencyColumn, + allocationUnitsColumn, getVDisksColumn(data), getDisksColumn(data), ]; diff --git a/src/containers/Storage/StorageGroups/columns/constants.ts b/src/containers/Storage/StorageGroups/columns/constants.ts index ce29bc6ad7..46dcefdfcb 100644 --- a/src/containers/Storage/StorageGroups/columns/constants.ts +++ b/src/containers/Storage/StorageGroups/columns/constants.ts @@ -23,6 +23,7 @@ export const STORAGE_GROUPS_COLUMNS_IDS = { Read: 'Read', Write: 'Write', Latency: 'Latency', + AllocationUnits: 'AllocationUnits', VDisks: 'VDisks', VDisksPDisks: 'VDisksPDisks', MissingDisks: 'MissingDisks', @@ -89,6 +90,9 @@ export const STORAGE_GROUPS_COLUMNS_TITLES = { get Latency() { return i18n('latency'); }, + get AllocationUnits() { + return i18n('allocation-units'); + }, get VDisks() { return i18n('vdisks'); }, diff --git a/src/containers/Storage/StorageGroups/columns/i18n/en.json b/src/containers/Storage/StorageGroups/columns/i18n/en.json index d1c3a8931c..79cc25af9a 100644 --- a/src/containers/Storage/StorageGroups/columns/i18n/en.json +++ b/src/containers/Storage/StorageGroups/columns/i18n/en.json @@ -15,6 +15,7 @@ "read": "Read", "write": "Write", "latency": "Latency", + "allocation-units": "Allocation Units", "vdisks": "VDisks", "vdisks-pdisks": "VDisks with PDisks" } diff --git a/src/store/reducers/storage/types.ts b/src/store/reducers/storage/types.ts index bdb6066a7b..c7466db829 100644 --- a/src/store/reducers/storage/types.ts +++ b/src/store/reducers/storage/types.ts @@ -88,9 +88,10 @@ export interface PreparedStorageGroup { State?: string; MissingDisks?: string | number; Available?: string; - LatencyPutTabletLog?: number; - LatencyPutUserData?: number; - LatencyGetFast?: number; + + LatencyPutTabletLogMs?: number; + LatencyPutUserDataMs?: number; + LatencyGetFastMs?: number; } export interface StorageSortParams { diff --git a/src/store/reducers/storage/utils.ts b/src/store/reducers/storage/utils.ts index 1bd9f000fe..3eb872ebc9 100644 --- a/src/store/reducers/storage/utils.ts +++ b/src/store/reducers/storage/utils.ts @@ -15,6 +15,7 @@ import {getColorSeverity, getSeverityColor} from '../../../utils/disks/helpers'; import {preparePDiskData, prepareVDiskData} from '../../../utils/disks/prepareDisks'; import {prepareNodeSystemState} from '../../../utils/nodes'; import {getUsage} from '../../../utils/storage'; +import {parseUsToMs} from '../../../utils/timeParsers'; import type { PreparedStorageGroup, @@ -247,7 +248,19 @@ export const prepareStorageResponse = (data: TStorageInfo): PreparedStorageRespo export function prepareGroupsResponse(data: StorageGroupsResponse): PreparedStorageResponse { const {FoundGroups, TotalGroups, StorageGroups = [], StorageGroupGroups} = data; const preparedGroups: PreparedStorageGroup[] = StorageGroups.map((group) => { - const {Usage, Read, Write, Used, Limit, MissingDisks, VDisks = [], Overall} = group; + const { + Usage, + Read, + Write, + Used, + Limit, + MissingDisks, + VDisks = [], + Overall, + LatencyPutTabletLog, + LatencyPutUserData, + LatencyGetFast, + } = group; const vDisks = VDisks.map((disk) => { const whiteboardVDisk = disk.Whiteboard; @@ -275,6 +288,11 @@ export function prepareGroupsResponse(data: StorageGroupsResponse): PreparedStor Write: Number(Write), Used: Number(Used), Limit: Number(Limit), + + LatencyPutTabletLogMs: parseUsToMs(LatencyPutTabletLog), + LatencyPutUserDataMs: parseUsToMs(LatencyPutUserData), + LatencyGetFastMs: parseUsToMs(LatencyGetFast), + Degraded: Number(MissingDisks), Overall, diff --git a/src/types/api/storage.ts b/src/types/api/storage.ts index 847c0e7c9c..2519496691 100644 --- a/src/types/api/storage.ts +++ b/src/types/api/storage.ts @@ -159,6 +159,25 @@ export interface TGroupsStorageGroupInfo { /** float */ DiskSpaceUsage?: number; + /** + * uint64 + * + * time in us + */ + LatencyPutTabletLog?: string; + /** + * uint64 + * + * time in us + */ + LatencyPutUserData?: string; + /** + * uint64 + * + * time in us + */ + LatencyGetFast?: string; + VDisks?: TStorageVDisk[]; } @@ -219,7 +238,13 @@ export type StorageV2SortValue = | 'Used' | 'Limit' | 'Read' - | 'Write'; + | 'Write' + + // These fields are not present in storage v2 + // So this sort does nothing + // Added them here for types compatibility + | 'AllocationUnits' + | 'Latency'; /** * Values to sort /storage/groups response @@ -230,9 +255,7 @@ export type GroupsSortField = | 'State' | 'Available' | 'DiskSpaceUsage' - | 'Encryption' - | 'AllocationUnits' - | 'Latency'; + | 'Encryption'; export type StorageV2Sort = BackendSortParam; export type GroupsSort = BackendSortParam; diff --git a/src/utils/storage.ts b/src/utils/storage.ts index 9aba431271..0df49d0da0 100644 --- a/src/utils/storage.ts +++ b/src/utils/storage.ts @@ -24,6 +24,9 @@ const STORAGE_SORT_VALUES: StorageV2SortValue[] = [ 'Limit', 'Read', 'Write', + + 'AllocationUnits', + 'Latency', ]; export const isSortableStorageProperty = (value: unknown): value is StorageV2SortValue =>