Skip to content

Commit 23f47f8

Browse files
fix: fix node LoadAverage calculation
1 parent 89703da commit 23f47f8

File tree

7 files changed

+39
-27
lines changed

7 files changed

+39
-27
lines changed

src/components/FullNodeViewer/FullNodeViewer.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export const FullNodeViewer = ({node, className}: FullNodeViewerProps) => {
3535
{label: 'Rack', value: node?.Rack},
3636
);
3737

38-
const averageInfo = node?.LoadAverage?.map((load, loadIndex) => ({
38+
const averageInfo = node?.LoadAveragePercents?.map((load, loadIndex) => ({
3939
label: LOAD_AVERAGE_TIME_INTERVALS[loadIndex],
4040
value: (
4141
<ProgressViewer value={load} percents={true} colorizeProgress={true} capacity={100} />

src/containers/Nodes/getNodesColumns.tsx

+6-7
Original file line numberDiff line numberDiff line change
@@ -136,13 +136,12 @@ const cpuColumn: NodesColumn = {
136136
const loadAverageColumn: NodesColumn = {
137137
name: NODES_COLUMNS_IDS.LoadAverage,
138138
header: 'Load average',
139-
sortAccessor: ({LoadAverage = []}) =>
140-
LoadAverage.slice(0, 1).reduce((acc, item) => acc + item, 0),
139+
sortAccessor: ({LoadAveragePercents = []}) => LoadAveragePercents[0],
141140
defaultOrder: DataTable.DESCENDING,
142141
render: ({row}) =>
143-
row.LoadAverage && row.LoadAverage.length > 0 ? (
142+
row.LoadAveragePercents && row.LoadAveragePercents.length > 0 ? (
144143
<ProgressViewer
145-
value={row.LoadAverage[0]}
144+
value={row.LoadAveragePercents[0]}
146145
percents={true}
147146
colorizeProgress={true}
148147
capacity={100}
@@ -179,10 +178,10 @@ const topNodesLoadAverageColumn: NodesColumn = {
179178
name: NODES_COLUMNS_IDS.TopNodesLoadAverage,
180179
header: 'Load',
181180
render: ({row}) =>
182-
row.LoadAverage && row.LoadAverage.length > 0 ? (
181+
row.LoadAveragePercents && row.LoadAveragePercents.length > 0 ? (
183182
<UsageLabel
184-
value={row.LoadAverage[0].toFixed()}
185-
theme={getLoadSeverityForNode(row.LoadAverage[0])}
183+
value={row.LoadAveragePercents[0].toFixed()}
184+
theme={getLoadSeverityForNode(row.LoadAveragePercents[0])}
186185
/>
187186
) : (
188187
'—'

src/containers/Versions/NodesTable/NodesTable.tsx

+5-6
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,12 @@ const columns: Column<PreparedClusterNode>[] = [
5151
align: DataTable.LEFT,
5252
},
5353
{
54-
name: 'uptime',
54+
name: 'Uptime',
5555
header: 'Uptime',
5656
sortAccessor: ({StartTime}) => StartTime && -StartTime,
5757
width: 120,
5858
align: DataTable.LEFT,
59-
render: ({row}) => row.uptime,
59+
render: ({row}) => row.Uptime,
6060
},
6161
{
6262
name: 'MemoryUsed',
@@ -90,15 +90,14 @@ const columns: Column<PreparedClusterNode>[] = [
9090
{
9191
name: 'LoadAverage',
9292
header: 'Load average',
93-
sortAccessor: ({LoadAverage = []}) =>
94-
LoadAverage.slice(0, 1).reduce((acc, item) => acc + item, 0),
93+
sortAccessor: ({LoadAveragePercents = []}) => LoadAveragePercents[0],
9594
defaultOrder: DataTable.DESCENDING,
9695
width: 140,
9796
resizeMinWidth: 140,
9897
render: ({row}) =>
99-
row.LoadAverage && row.LoadAverage.length > 0 ? (
98+
row.LoadAveragePercents && row.LoadAveragePercents.length > 0 ? (
10099
<ProgressViewer
101-
value={row.LoadAverage[0]}
100+
value={row.LoadAveragePercents[0]}
102101
percents={true}
103102
capacity={100}
104103
colorizeProgress={true}

src/store/reducers/clusterNodes/clusterNodes.tsx

+4-11
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
import type {TSystemStateInfo} from '../../../types/api/nodes';
2-
import {calcUptime} from '../../../utils/dataFormatters/dataFormatters';
1+
import type {PreparedNodeSystemState} from '../../../utils/nodes';
2+
import {prepareNodeSystemState} from '../../../utils/nodes';
33
import {api} from '../api';
44

5-
export interface PreparedClusterNode extends TSystemStateInfo {
6-
uptime: string;
7-
}
5+
export type PreparedClusterNode = PreparedNodeSystemState;
86

97
export const clusterNodesApi = api.injectEndpoints({
108
endpoints: (builder) => ({
@@ -13,12 +11,7 @@ export const clusterNodesApi = api.injectEndpoints({
1311
try {
1412
const result = await window.api.getClusterNodes();
1513
const {SystemStateInfo: nodes = []} = result;
16-
const data: PreparedClusterNode[] = nodes.map((node) => {
17-
return {
18-
...node,
19-
uptime: calcUptime(node.StartTime),
20-
};
21-
});
14+
const data: PreparedClusterNode[] = nodes.map(prepareNodeSystemState);
2215
return {data};
2316
} catch (error) {
2417
return {error};

src/store/reducers/nodes/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export interface NodesPreparedEntity {
3434

3535
PoolStats?: TPoolStats[];
3636
LoadAverage?: number[];
37+
LoadAveragePercents?: number[];
3738
Tablets?: TFullTabletStateInfo[] | TComputeTabletStateInfo[];
3839
Endpoints?: TEndpoint[];
3940

src/store/reducers/nodes/utils.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,18 @@ import type {TComputeInfo, TComputeNodeInfo, TComputeTenantInfo} from '../../../
22
import type {TNodesInfo} from '../../../types/api/nodes';
33
import {calcUptime} from '../../../utils/dataFormatters/dataFormatters';
44
import {generateEvaluator} from '../../../utils/generateEvaluator';
5-
import {prepareNodeSystemState} from '../../../utils/nodes';
5+
import {calculateLoadAveragePercents, prepareNodeSystemState} from '../../../utils/nodes';
66

77
import type {NodesHandledResponse, NodesPreparedEntity} from './types';
88

9-
const prepareComputeNode = (node: TComputeNodeInfo, tenantName?: string) => {
9+
const prepareComputeNode = (node: TComputeNodeInfo, tenantName?: string): NodesPreparedEntity => {
1010
return {
1111
...node,
1212
// v2 response has tenant name, v1 - doesn't
1313
TenantName: node.Tenant ?? tenantName,
1414
SystemState: node?.Overall,
1515
Uptime: calcUptime(node?.StartTime),
16+
LoadAveragePercents: calculateLoadAveragePercents(node),
1617

1718
DC: node.DataCenter,
1819
};

src/utils/nodes.ts

+19
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {z} from 'zod';
33
import type {NodesPreparedEntity} from '../store/reducers/nodes/types';
44
import {ProblemFilterValues} from '../store/reducers/settings/settings';
55
import type {ProblemFilterValue} from '../store/reducers/settings/types';
6+
import type {TComputeNodeInfo} from '../types/api/compute';
67
import {EFlag} from '../types/api/enums';
78
import type {TSystemStateInfo} from '../types/api/nodes';
89
import type {TNodeInfo} from '../types/api/nodesList';
@@ -12,6 +13,8 @@ import type {NodesMap} from '../types/store/nodesList';
1213
import {HOUR_IN_SECONDS} from './constants';
1314
import {calcUptime} from './dataFormatters/dataFormatters';
1415

16+
import {valueIsDefined} from '.';
17+
1518
export enum NodesUptimeFilterValues {
1619
'All' = 'All',
1720
'SmallUptime' = 'SmallUptime',
@@ -38,9 +41,22 @@ export const prepareNodesMap = (nodesList?: TNodeInfo[]) => {
3841
}, new Map());
3942
};
4043

44+
export function calculateLoadAveragePercents(node: TSystemStateInfo | TComputeNodeInfo = {}) {
45+
const {LoadAverage, NumberOfCpus} = node;
46+
47+
if (!valueIsDefined(LoadAverage) || !valueIsDefined(NumberOfCpus)) {
48+
return undefined;
49+
}
50+
51+
return LoadAverage.map((value) => {
52+
return (value * 100) / NumberOfCpus;
53+
});
54+
}
55+
4156
export interface PreparedNodeSystemState extends TSystemStateInfo {
4257
Rack?: string;
4358
DC?: string;
59+
LoadAveragePercents?: number[];
4460
Uptime: string;
4561
}
4662

@@ -53,11 +69,14 @@ export const prepareNodeSystemState = (
5369

5470
const Uptime = calcUptime(systemState.StartTime);
5571

72+
const LoadAveragePercents = calculateLoadAveragePercents(systemState);
73+
5674
return {
5775
...systemState,
5876
Rack,
5977
DC,
6078
Uptime,
79+
LoadAveragePercents,
6180
};
6281
};
6382

0 commit comments

Comments
 (0)