From 4253befd6e3f1777700745f57038486ffafeaf7f Mon Sep 17 00:00:00 2001 From: mufazalov Date: Wed, 3 Jul 2024 17:42:11 +0300 Subject: [PATCH] fix: fix node LoadAverage calculation --- .../FullNodeViewer/FullNodeViewer.tsx | 2 +- src/containers/Nodes/getNodesColumns.tsx | 13 ++++++------- .../Versions/NodesTable/NodesTable.tsx | 11 +++++------ .../reducers/clusterNodes/clusterNodes.tsx | 15 ++++----------- src/store/reducers/nodes/types.ts | 1 + src/store/reducers/nodes/utils.ts | 5 +++-- src/utils/nodes.ts | 19 +++++++++++++++++++ 7 files changed, 39 insertions(+), 27 deletions(-) diff --git a/src/components/FullNodeViewer/FullNodeViewer.tsx b/src/components/FullNodeViewer/FullNodeViewer.tsx index 667c33def..5cdd3b1f5 100644 --- a/src/components/FullNodeViewer/FullNodeViewer.tsx +++ b/src/components/FullNodeViewer/FullNodeViewer.tsx @@ -35,7 +35,7 @@ export const FullNodeViewer = ({node, className}: FullNodeViewerProps) => { {label: 'Rack', value: node?.Rack}, ); - const averageInfo = node?.LoadAverage?.map((load, loadIndex) => ({ + const averageInfo = node?.LoadAveragePercents?.map((load, loadIndex) => ({ label: LOAD_AVERAGE_TIME_INTERVALS[loadIndex], value: ( diff --git a/src/containers/Nodes/getNodesColumns.tsx b/src/containers/Nodes/getNodesColumns.tsx index 53bb70217..73cd56517 100644 --- a/src/containers/Nodes/getNodesColumns.tsx +++ b/src/containers/Nodes/getNodesColumns.tsx @@ -136,13 +136,12 @@ const cpuColumn: NodesColumn = { const loadAverageColumn: NodesColumn = { name: NODES_COLUMNS_IDS.LoadAverage, header: 'Load average', - sortAccessor: ({LoadAverage = []}) => - LoadAverage.slice(0, 1).reduce((acc, item) => acc + item, 0), + sortAccessor: ({LoadAveragePercents = []}) => LoadAveragePercents[0], defaultOrder: DataTable.DESCENDING, render: ({row}) => - row.LoadAverage && row.LoadAverage.length > 0 ? ( + row.LoadAveragePercents && row.LoadAveragePercents.length > 0 ? ( - row.LoadAverage && row.LoadAverage.length > 0 ? ( + row.LoadAveragePercents && row.LoadAveragePercents.length > 0 ? ( ) : ( '—' diff --git a/src/containers/Versions/NodesTable/NodesTable.tsx b/src/containers/Versions/NodesTable/NodesTable.tsx index bcb892824..d2e0ef04c 100644 --- a/src/containers/Versions/NodesTable/NodesTable.tsx +++ b/src/containers/Versions/NodesTable/NodesTable.tsx @@ -51,12 +51,12 @@ const columns: Column[] = [ align: DataTable.LEFT, }, { - name: 'uptime', + name: 'Uptime', header: 'Uptime', sortAccessor: ({StartTime}) => StartTime && -StartTime, width: 120, align: DataTable.LEFT, - render: ({row}) => row.uptime, + render: ({row}) => row.Uptime, }, { name: 'MemoryUsed', @@ -90,15 +90,14 @@ const columns: Column[] = [ { name: 'LoadAverage', header: 'Load average', - sortAccessor: ({LoadAverage = []}) => - LoadAverage.slice(0, 1).reduce((acc, item) => acc + item, 0), + sortAccessor: ({LoadAveragePercents = []}) => LoadAveragePercents[0], defaultOrder: DataTable.DESCENDING, width: 140, resizeMinWidth: 140, render: ({row}) => - row.LoadAverage && row.LoadAverage.length > 0 ? ( + row.LoadAveragePercents && row.LoadAveragePercents.length > 0 ? ( ({ @@ -13,12 +11,7 @@ export const clusterNodesApi = api.injectEndpoints({ try { const result = await window.api.getClusterNodes(); const {SystemStateInfo: nodes = []} = result; - const data: PreparedClusterNode[] = nodes.map((node) => { - return { - ...node, - uptime: calcUptime(node.StartTime), - }; - }); + const data: PreparedClusterNode[] = nodes.map(prepareNodeSystemState); return {data}; } catch (error) { return {error}; diff --git a/src/store/reducers/nodes/types.ts b/src/store/reducers/nodes/types.ts index 8800ce8d7..05e3e7a68 100644 --- a/src/store/reducers/nodes/types.ts +++ b/src/store/reducers/nodes/types.ts @@ -34,6 +34,7 @@ export interface NodesPreparedEntity { PoolStats?: TPoolStats[]; LoadAverage?: number[]; + LoadAveragePercents?: number[]; Tablets?: TFullTabletStateInfo[] | TComputeTabletStateInfo[]; Endpoints?: TEndpoint[]; diff --git a/src/store/reducers/nodes/utils.ts b/src/store/reducers/nodes/utils.ts index 0190b4edc..caec30288 100644 --- a/src/store/reducers/nodes/utils.ts +++ b/src/store/reducers/nodes/utils.ts @@ -2,17 +2,18 @@ import type {TComputeInfo, TComputeNodeInfo, TComputeTenantInfo} from '../../../ import type {TNodesInfo} from '../../../types/api/nodes'; import {calcUptime} from '../../../utils/dataFormatters/dataFormatters'; import {generateEvaluator} from '../../../utils/generateEvaluator'; -import {prepareNodeSystemState} from '../../../utils/nodes'; +import {calculateLoadAveragePercents, prepareNodeSystemState} from '../../../utils/nodes'; import type {NodesHandledResponse, NodesPreparedEntity} from './types'; -const prepareComputeNode = (node: TComputeNodeInfo, tenantName?: string) => { +const prepareComputeNode = (node: TComputeNodeInfo, tenantName?: string): NodesPreparedEntity => { return { ...node, // v2 response has tenant name, v1 - doesn't TenantName: node.Tenant ?? tenantName, SystemState: node?.Overall, Uptime: calcUptime(node?.StartTime), + LoadAveragePercents: calculateLoadAveragePercents(node), DC: node.DataCenter, }; diff --git a/src/utils/nodes.ts b/src/utils/nodes.ts index 93106d444..60c7f84bf 100644 --- a/src/utils/nodes.ts +++ b/src/utils/nodes.ts @@ -3,6 +3,7 @@ import {z} from 'zod'; import type {NodesPreparedEntity} from '../store/reducers/nodes/types'; import {ProblemFilterValues} from '../store/reducers/settings/settings'; import type {ProblemFilterValue} from '../store/reducers/settings/types'; +import type {TComputeNodeInfo} from '../types/api/compute'; import {EFlag} from '../types/api/enums'; import type {TSystemStateInfo} from '../types/api/nodes'; import type {TNodeInfo} from '../types/api/nodesList'; @@ -12,6 +13,8 @@ import type {NodesMap} from '../types/store/nodesList'; import {HOUR_IN_SECONDS} from './constants'; import {calcUptime} from './dataFormatters/dataFormatters'; +import {valueIsDefined} from '.'; + export enum NodesUptimeFilterValues { 'All' = 'All', 'SmallUptime' = 'SmallUptime', @@ -38,9 +41,22 @@ export const prepareNodesMap = (nodesList?: TNodeInfo[]) => { }, new Map()); }; +export function calculateLoadAveragePercents(node: TSystemStateInfo | TComputeNodeInfo = {}) { + const {LoadAverage, NumberOfCpus} = node; + + if (!valueIsDefined(LoadAverage) || !valueIsDefined(NumberOfCpus)) { + return undefined; + } + + return LoadAverage.map((value) => { + return (value * 100) / NumberOfCpus; + }); +} + export interface PreparedNodeSystemState extends TSystemStateInfo { Rack?: string; DC?: string; + LoadAveragePercents?: number[]; Uptime: string; } @@ -53,11 +69,14 @@ export const prepareNodeSystemState = ( const Uptime = calcUptime(systemState.StartTime); + const LoadAveragePercents = calculateLoadAveragePercents(systemState); + return { ...systemState, Rack, DC, Uptime, + LoadAveragePercents, }; };