Skip to content

Commit 01181c4

Browse files
feat: add absolute timestamp to uptime
1 parent 4ed2fab commit 01181c4

File tree

15 files changed

+130
-34
lines changed

15 files changed

+130
-34
lines changed

src/components/CellWithPopover/CellWithPopover.scss

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
.ydb-cell-with-popover {
2-
display: flex;
2+
display: inline-flex;
33

44
max-width: 100%;
55

6+
&_full-width {
7+
display: flex;
8+
}
9+
610
&__popover {
711
display: inline-block;
812
overflow: hidden;

src/components/CellWithPopover/CellWithPopover.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export function CellWithPopover({
2222
...props
2323
}: CellWithPopoverProps) {
2424
return (
25-
<div className={b({fullWidth}, wrapperClassName)}>
25+
<div className={b({'full-width': fullWidth}, wrapperClassName)}>
2626
<Popover
2727
delayClosing={DELAY_TIMEOUT}
2828
delayOpening={DELAY_TIMEOUT}

src/components/FullNodeViewer/FullNodeViewer.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {InfoViewer} from '../InfoViewer/InfoViewer';
55
import type {InfoViewerItem} from '../InfoViewer/InfoViewer';
66
import {PoolUsage} from '../PoolUsage/PoolUsage';
77
import {ProgressViewer} from '../ProgressViewer/ProgressViewer';
8+
import {NodeUptime} from '../UptimeViewer/UptimeViewer';
89

910
import './FullNodeViewer.scss';
1011

@@ -30,7 +31,10 @@ export const FullNodeViewer = ({node, className}: FullNodeViewerProps) => {
3031

3132
commonInfo.push(
3233
{label: 'Version', value: node?.Version},
33-
{label: 'Uptime', value: node?.Uptime},
34+
{
35+
label: 'Uptime',
36+
value: <NodeUptime StartTime={node?.StartTime} DisconnectTime={node?.DisconnectTime} />,
37+
},
3438
{label: 'DC', value: node?.DataCenterDescription || node?.DC},
3539
{label: 'Rack', value: node?.Rack},
3640
);

src/components/TooltipsContent/TabletTooltipContent/TabletTooltipContent.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import type {TTabletStateInfo} from '../../../types/api/tablet';
2-
import {getUptimeFromDateFormatted} from '../../../utils/dataFormatters/dataFormatters';
32
import {InfoViewer, createInfoFormatter, formatObject} from '../../InfoViewer';
3+
import {TabletUptime} from '../../UptimeViewer/UptimeViewer';
44

55
const formatTablet = createInfoFormatter<TTabletStateInfo>({
66
values: {
7-
ChangeTime: (value) => getUptimeFromDateFormatted(value),
7+
ChangeTime: (value) => {
8+
return <TabletUptime ChangeTime={value} />;
9+
},
810
},
911
labels: {
1012
TabletId: 'Tablet',
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import {DefinitionList} from '@gravity-ui/uikit';
2+
3+
import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants';
4+
import {
5+
formatDateTime,
6+
getDowntimeFromDateFormatted,
7+
getUptimeFromDateFormatted,
8+
} from '../../utils/dataFormatters/dataFormatters';
9+
import {CellWithPopover} from '../CellWithPopover/CellWithPopover';
10+
11+
import i18n from './i18n';
12+
13+
interface NodeUptimeProps {
14+
StartTime?: string;
15+
DisconnectTime?: string;
16+
}
17+
18+
export function NodeUptime({StartTime, DisconnectTime}: NodeUptimeProps) {
19+
let uptime: string | undefined;
20+
21+
if (DisconnectTime) {
22+
uptime = getDowntimeFromDateFormatted(DisconnectTime);
23+
} else {
24+
uptime = getUptimeFromDateFormatted(StartTime);
25+
}
26+
27+
if (!uptime) {
28+
return EMPTY_DATA_PLACEHOLDER;
29+
}
30+
return (
31+
<CellWithPopover
32+
placement={['top', 'auto']}
33+
content={
34+
<DefinitionList responsive>
35+
{StartTime ? (
36+
<DefinitionList.Item key={'StartTime'} name={i18n('start-time')}>
37+
{formatDateTime(StartTime, {withTimeZone: true})}
38+
</DefinitionList.Item>
39+
) : null}
40+
{DisconnectTime ? (
41+
<DefinitionList.Item key={'DisconnectTime'} name={i18n('disconnect-time')}>
42+
{formatDateTime(DisconnectTime, {withTimeZone: true})}
43+
</DefinitionList.Item>
44+
) : null}
45+
</DefinitionList>
46+
}
47+
>
48+
{uptime}
49+
</CellWithPopover>
50+
);
51+
}
52+
53+
interface TabletUptimeProps {
54+
ChangeTime?: string;
55+
}
56+
57+
export function TabletUptime({ChangeTime}: TabletUptimeProps) {
58+
const uptime = getUptimeFromDateFormatted(ChangeTime);
59+
60+
if (!uptime) {
61+
return EMPTY_DATA_PLACEHOLDER;
62+
}
63+
return (
64+
<CellWithPopover
65+
placement={['top', 'auto']}
66+
content={
67+
<DefinitionList responsive>
68+
<DefinitionList.Item key={'changeTime'} name={i18n('change-time')}>
69+
{formatDateTime(ChangeTime, {withTimeZone: true})}
70+
</DefinitionList.Item>
71+
</DefinitionList>
72+
}
73+
>
74+
{uptime}
75+
</CellWithPopover>
76+
);
77+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"start-time": "Start time",
3+
"disconnect-time": "Disconnect time",
4+
"change-time": "Change time"
5+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import {registerKeysets} from '../../../utils/i18n';
2+
3+
import en from './en.json';
4+
5+
const COMPONENT = 'ydb-uptime-viewer';
6+
7+
export default registerKeysets(COMPONENT, {en});

src/components/nodesColumns/columns.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {PoolsGraph} from '../PoolsGraph/PoolsGraph';
2323
import {ProgressViewer} from '../ProgressViewer/ProgressViewer';
2424
import {TabletsStatistic} from '../TabletsStatistic';
2525
import {formatPool} from '../TooltipsContent';
26+
import {NodeUptime} from '../UptimeViewer/UptimeViewer';
2627
import {UsageLabel} from '../UsageLabel/UsageLabel';
2728

2829
import {NODES_COLUMNS_IDS, NODES_COLUMNS_TITLES} from './constants';
@@ -103,12 +104,16 @@ export function getVersionColumn<T extends {Version?: string}>(): Column<T> {
103104
},
104105
};
105106
}
106-
export function getUptimeColumn<T extends {StartTime?: string; Uptime?: string}>(): Column<T> {
107+
export function getUptimeColumn<
108+
T extends {StartTime?: string; DisconnectTime?: string},
109+
>(): Column<T> {
107110
return {
108111
name: NODES_COLUMNS_IDS.Uptime,
109112
header: NODES_COLUMNS_TITLES.Uptime,
110113
sortAccessor: ({StartTime}) => (StartTime ? -StartTime : 0),
111-
render: ({row}) => row.Uptime,
114+
render: ({row}) => {
115+
return <NodeUptime StartTime={row.StartTime} DisconnectTime={row.DisconnectTime} />;
116+
},
112117
align: DataTable.RIGHT,
113118
width: 120,
114119
};

src/containers/Tablet/components/TabletInfo/TabletInfo.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ import type {InfoViewerItem} from '../../../../components/InfoViewer';
55
import {InfoViewer} from '../../../../components/InfoViewer';
66
import {LinkWithIcon} from '../../../../components/LinkWithIcon/LinkWithIcon';
77
import {TabletState} from '../../../../components/TabletState/TabletState';
8+
import {TabletUptime} from '../../../../components/UptimeViewer/UptimeViewer';
89
import {getTabletPagePath} from '../../../../routes';
910
import {selectIsUserAllowedToMakeChanges} from '../../../../store/reducers/authentication/authentication';
1011
import {ETabletState} from '../../../../types/api/tablet';
1112
import type {TTabletStateInfo} from '../../../../types/api/tablet';
1213
import {cn} from '../../../../utils/cn';
13-
import {getUptimeFromDateFormatted} from '../../../../utils/dataFormatters/dataFormatters';
1414
import {createTabletDeveloperUIHref} from '../../../../utils/developerUI/developerUI';
1515
import {useTypedSelector} from '../../../../utils/hooks';
1616
import {getDefaultNodePath} from '../../../Node/NodePages';
@@ -72,7 +72,7 @@ export const TabletInfo = ({tablet}: TabletInfoProps) => {
7272
if (hasUptime) {
7373
tabletInfo.push({
7474
label: tabletInfoKeyset('field_uptime'),
75-
value: getUptimeFromDateFormatted(ChangeTime),
75+
value: <TabletUptime ChangeTime={ChangeTime} />,
7676
});
7777
}
7878

src/containers/Tablet/components/TabletTable/TabletTable.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import {EntityStatus} from '../../../../components/EntityStatus/EntityStatus';
55
import {InternalLink} from '../../../../components/InternalLink/InternalLink';
66
import {ResizeableDataTable} from '../../../../components/ResizeableDataTable/ResizeableDataTable';
77
import {TabletState} from '../../../../components/TabletState/TabletState';
8+
import {TabletUptime} from '../../../../components/UptimeViewer/UptimeViewer';
89
import type {ITabletPreparedHistoryItem} from '../../../../types/store/tablet';
9-
import {getUptimeFromDateFormatted} from '../../../../utils/dataFormatters/dataFormatters';
1010
import {getDefaultNodePath} from '../../../Node/NodePages';
1111

1212
const TABLET_COLUMNS_WIDTH_LS_KEY = 'tabletTableColumnsWidth';
@@ -21,7 +21,10 @@ const columns: Column<ITabletPreparedHistoryItem>[] = [
2121
name: 'Change time',
2222
align: DataTable.RIGHT,
2323
sortable: false,
24-
render: ({row}) => getUptimeFromDateFormatted(row.changeTime),
24+
render: ({row}) => {
25+
return <TabletUptime ChangeTime={row.changeTime} />;
26+
},
27+
width: 120,
2528
},
2629
{
2730
name: 'State',

0 commit comments

Comments
 (0)