-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathFullNodeViewer.tsx
110 lines (92 loc) · 3.66 KB
/
FullNodeViewer.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import {Flex} from '@gravity-ui/uikit';
import type {PreparedNode} from '../../store/reducers/node/types';
import {cn} from '../../utils/cn';
import {useNodeDeveloperUIHref} from '../../utils/hooks/useNodeDeveloperUIHref';
import {InfoViewer} from '../InfoViewer/InfoViewer';
import type {InfoViewerItem} from '../InfoViewer/InfoViewer';
import {LinkWithIcon} from '../LinkWithIcon/LinkWithIcon';
import {PoolUsage} from '../PoolUsage/PoolUsage';
import {ProgressViewer} from '../ProgressViewer/ProgressViewer';
import {NodeUptime} from '../UptimeViewer/UptimeViewer';
import i18n from './i18n';
import './FullNodeViewer.scss';
const b = cn('full-node-viewer');
interface FullNodeViewerProps {
node?: PreparedNode;
className?: string;
}
const getLoadAverageIntervalTitle = (index: number) => {
return [i18n('la-interval-1m'), i18n('la-interval-5m'), i18n('la-interval-15m')][index];
};
export const FullNodeViewer = ({node, className}: FullNodeViewerProps) => {
const developerUIHref = useNodeDeveloperUIHref(node);
const commonInfo: InfoViewerItem[] = [];
if (node?.Tenants?.length) {
commonInfo.push({label: i18n('database'), value: node.Tenants[0]});
}
commonInfo.push(
{label: i18n('version'), value: node?.Version},
{
label: i18n('uptime'),
value: <NodeUptime StartTime={node?.StartTime} DisconnectTime={node?.DisconnectTime} />,
},
{label: i18n('dc'), value: node?.DataCenterDescription || node?.DC},
);
if (node?.Rack) {
commonInfo.push({label: i18n('rack'), value: node?.Rack});
}
if (developerUIHref) {
commonInfo.push({
label: i18n('links'),
value: <LinkWithIcon url={developerUIHref} title={i18n('developer-ui')} />,
});
}
const endpointsInfo = node?.Endpoints?.map(({Name, Address}) => ({
label: Name,
value: Address,
}));
const averageInfo = node?.LoadAveragePercents?.map((load, loadIndex) => ({
label: getLoadAverageIntervalTitle(loadIndex),
value: (
<ProgressViewer value={load} percents={true} colorizeProgress={true} capacity={100} />
),
}));
if (!node) {
return <div className="error">{i18n('no-data')}</div>;
}
return (
<div className={b(null, className)}>
<Flex wrap gap={2}>
<Flex direction="column" gap={2}>
<InfoViewer
title={i18n('title.common-info')}
className={b('section')}
info={commonInfo}
/>
{endpointsInfo && endpointsInfo.length ? (
<InfoViewer
title={i18n('title.endpoints')}
className={b('section')}
info={endpointsInfo}
/>
) : null}
</Flex>
<Flex direction="column" gap={2}>
<div>
<div className={b('section-title')}>{i18n('title.pools')}</div>
<div className={b('section', {pools: true})}>
{node?.PoolStats?.map((pool, poolIndex) => (
<PoolUsage key={poolIndex} data={pool} />
))}
</div>
</div>
<InfoViewer
title={i18n('title.load-average')}
className={b('section', {average: true})}
info={averageInfo}
/>
</Flex>
</Flex>
</div>
);
};