import type {Column} from '@gravity-ui/react-data-table'; import DataTable from '@gravity-ui/react-data-table'; import {EntityName} from '../../../../../components/EntityName/EntityName'; import {MultilineTableHeader} from '../../../../../components/MultilineTableHeader/MultilineTableHeader'; import {SpeedMultiMeter} from '../../../../../components/SpeedMultiMeter'; import {getDefaultNodePath} from '../../../../../routes'; import {useTopicDataAvailable} from '../../../../../store/reducers/capabilities/hooks'; import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../../../store/reducers/tenant/constants'; import {cn} from '../../../../../utils/cn'; import {EMPTY_DATA_PLACEHOLDER} from '../../../../../utils/constants'; import {formatBytes, formatDurationMs} from '../../../../../utils/dataFormatters/dataFormatters'; import {isNumeric} from '../../../../../utils/utils'; import {useDiagnosticsPageLinkGetter} from '../../DiagnosticsPages'; import { ReadLagsHeader, ReadSessionHeader, UncommitedMessagesHeader, UnreadMessagesHeader, WriteLagsHeader, } from '../Headers'; import { PARTITIONS_COLUMNS_IDS, PARTITIONS_COLUMNS_TITLES, PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS, PARTITIONS_READ_LAGS_SUB_COLUMNS_TITLES, PARTITIONS_WRITE_LAGS_SUB_COLUMNS_IDS, PARTITIONS_WRITE_LAGS_SUB_COLUMNS_TITLES, generalPartitionColumnsIds, } from '../utils/constants'; import type {PreparedPartitionDataWithHosts} from '../utils/types'; import {CommittedOffsetCell} from './CommittedOffsetCell'; import './Columns.scss'; const b = cn('ydb-diagnostics-partitions-columns'); export const PARTITIONS_COLUMNS_WIDTH_LS_KEY = 'partitionsColumnsWidth'; export const allColumns: Column[] = [ { name: PARTITIONS_COLUMNS_IDS.PARTITION_ID, header: ( ), sortAccessor: (row) => isNumeric(row.partitionId) && Number(row.partitionId), align: DataTable.LEFT, render: ({row}) => , }, { name: PARTITIONS_COLUMNS_IDS.STORE_SIZE, header: ( ), sortAccessor: (row) => isNumeric(row.storeSize) && Number(row.storeSize), align: DataTable.RIGHT, render: ({row}) => formatBytes(row.storeSize), }, { name: PARTITIONS_COLUMNS_IDS.WRITE_SPEED, header: PARTITIONS_COLUMNS_TITLES[PARTITIONS_COLUMNS_IDS.WRITE_SPEED], align: DataTable.LEFT, resizeMinWidth: 140, sortAccessor: (row) => row.writeSpeed.perMinute, render: ({row}) => , }, { name: PARTITIONS_COLUMNS_IDS.READ_SPEED, header: PARTITIONS_COLUMNS_TITLES[PARTITIONS_COLUMNS_IDS.READ_SPEED], align: DataTable.LEFT, resizeMinWidth: 140, sortAccessor: (row) => row.readSpeed?.perMinute, render: ({row}) => , }, { name: PARTITIONS_COLUMNS_IDS.WRITE_LAGS, header: , className: b('lags-header'), sub: [ { name: PARTITIONS_WRITE_LAGS_SUB_COLUMNS_IDS.PARTITION_WRITE_LAG, header: PARTITIONS_WRITE_LAGS_SUB_COLUMNS_TITLES[ PARTITIONS_WRITE_LAGS_SUB_COLUMNS_IDS.PARTITION_WRITE_LAG ], align: DataTable.RIGHT, render: ({row}) => formatDurationMs(row.partitionWriteLag), }, { name: PARTITIONS_WRITE_LAGS_SUB_COLUMNS_IDS.PARTITION_WRITE_IDLE_TIME, header: PARTITIONS_WRITE_LAGS_SUB_COLUMNS_TITLES[ PARTITIONS_WRITE_LAGS_SUB_COLUMNS_IDS.PARTITION_WRITE_IDLE_TIME ], align: DataTable.RIGHT, render: ({row}) => formatDurationMs(row.partitionWriteIdleTime), }, ], }, { name: PARTITIONS_COLUMNS_IDS.READ_LAGS, header: , className: b('lags-header'), sub: [ { name: PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS.CONSUMER_WRITE_LAG, header: PARTITIONS_READ_LAGS_SUB_COLUMNS_TITLES[ PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS.CONSUMER_WRITE_LAG ], align: DataTable.RIGHT, render: ({row}) => formatDurationMs(row.consumerWriteLag), }, { name: PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS.CONSUMER_READ_LAG, header: PARTITIONS_READ_LAGS_SUB_COLUMNS_TITLES[ PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS.CONSUMER_READ_LAG ], align: DataTable.RIGHT, render: ({row}) => formatDurationMs(row.consumerReadLag), }, { name: PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS.CONSUMER_READ_IDLE_TIME, header: PARTITIONS_READ_LAGS_SUB_COLUMNS_TITLES[ PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS.CONSUMER_READ_IDLE_TIME ], align: DataTable.RIGHT, render: ({row}) => formatDurationMs(row.consumerReadIdleTime), }, ], }, { name: PARTITIONS_COLUMNS_IDS.UNCOMMITED_MESSAGES, header: , align: DataTable.RIGHT, render: ({row}) => row.uncommitedMessages, }, { name: PARTITIONS_COLUMNS_IDS.UNREAD_MESSAGES, header: , align: DataTable.RIGHT, render: ({row}) => row.unreadMessages, }, { name: PARTITIONS_COLUMNS_IDS.START_OFFSET, header: ( ), sortAccessor: (row) => isNumeric(row.startOffset) && Number(row.startOffset), render: ({row}) => row.startOffset, }, { name: PARTITIONS_COLUMNS_IDS.END_OFFSET, header: ( ), sortAccessor: (row) => isNumeric(row.endOffset) && Number(row.endOffset), render: ({row}) => row.endOffset, }, { name: PARTITIONS_COLUMNS_IDS.COMMITED_OFFSET, header: ( ), sortAccessor: (row) => isNumeric(row.commitedOffset) && Number(row.commitedOffset), render: ({row}) => ( ), }, { name: PARTITIONS_COLUMNS_IDS.READ_SESSION_ID, header: , align: DataTable.LEFT, width: 150, render: ({row}) => row.readSessionId ? ( ) : ( EMPTY_DATA_PLACEHOLDER ), }, { name: PARTITIONS_COLUMNS_IDS.READER_NAME, header: ( ), align: DataTable.LEFT, width: 150, render: ({row}) => row.readerName ? ( ) : ( EMPTY_DATA_PLACEHOLDER ), }, { name: PARTITIONS_COLUMNS_IDS.PARTITION_HOST, header: ( ), align: DataTable.LEFT, width: 200, render: ({row}) => row.partitionNodeId && row.partitionHost ? ( ) : ( EMPTY_DATA_PLACEHOLDER ), }, { name: PARTITIONS_COLUMNS_IDS.CONNECTION_HOST, header: ( ), align: DataTable.LEFT, width: 200, render: ({row}) => row.connectionNodeId && row.connectionHost ? ( ) : ( EMPTY_DATA_PLACEHOLDER ), }, ]; interface NodeProps { host: string; id: string | number; } function Node({host, id}: NodeProps) { return ; } // Topics without consumers have partitions data with no data corresponding to consumers // These columns will be empty and should not be displayed export const generalColumns = allColumns.filter((column) => { return generalPartitionColumnsIds.includes( column.name as (typeof generalPartitionColumnsIds)[number], ); }); interface PartitionIdProps { id: string; } function PartitionId({id}: PartitionIdProps) { const getDiagnosticsPageLink = useDiagnosticsPageLinkGetter(); const topicDataAvailable = useTopicDataAvailable(); return ( ); }