ydb-embedded-ui 3.3.4 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/dist/components/Errors/ResponseError/ResponseError.tsx +2 -2
- package/dist/components/InfoViewer/formatters/topicStats.tsx +8 -29
- package/dist/components/LabelWithPopover/LabelWithPopover.tsx +20 -0
- package/dist/components/LabelWithPopover/index.ts +1 -0
- package/dist/components/LagImages/LagImages.tsx +205 -0
- package/dist/components/LagImages/index.ts +1 -0
- package/dist/components/SpeedMultiMeter/SpeedMultiMeter.scss +92 -0
- package/dist/components/SpeedMultiMeter/SpeedMultiMeter.tsx +120 -0
- package/dist/components/SpeedMultiMeter/i18n/en.json +6 -0
- package/dist/components/SpeedMultiMeter/i18n/index.ts +13 -0
- package/dist/components/SpeedMultiMeter/i18n/ru.json +6 -0
- package/dist/components/SpeedMultiMeter/index.ts +1 -0
- package/dist/containers/Storage/StorageGroups/StorageGroups.tsx +18 -14
- package/dist/containers/Storage/VDisk/VDisk.tsx +20 -5
- package/dist/containers/Storage/VDiskPopup/VDiskPopup.tsx +34 -5
- package/dist/containers/Storage/utils/types.ts +5 -0
- package/dist/containers/Tenant/Diagnostics/Consumers/Consumers.scss +32 -3
- package/dist/containers/Tenant/Diagnostics/Consumers/Consumers.tsx +62 -69
- package/dist/containers/Tenant/Diagnostics/Consumers/Headers/Headers.scss +13 -0
- package/dist/containers/Tenant/Diagnostics/Consumers/Headers/Headers.tsx +27 -0
- package/dist/containers/Tenant/Diagnostics/Consumers/Headers/index.ts +1 -0
- package/dist/containers/Tenant/Diagnostics/Consumers/TopicStats/ConsumersTopicStats.scss +32 -0
- package/dist/containers/Tenant/Diagnostics/Consumers/TopicStats/ConsumersTopicStats.tsx +43 -0
- package/dist/containers/Tenant/Diagnostics/Consumers/TopicStats/index.ts +1 -0
- package/dist/containers/Tenant/Diagnostics/Consumers/columns/Columns.scss +5 -0
- package/dist/containers/Tenant/Diagnostics/Consumers/columns/columns.tsx +66 -0
- package/dist/containers/Tenant/Diagnostics/Consumers/columns/index.ts +1 -0
- package/dist/containers/Tenant/Diagnostics/Consumers/i18n/en.json +4 -3
- package/dist/containers/Tenant/Diagnostics/Consumers/i18n/ru.json +4 -3
- package/dist/containers/Tenant/Diagnostics/Consumers/utils/constants.ts +23 -0
- package/dist/containers/Tenant/Diagnostics/Diagnostics.tsx +4 -0
- package/dist/containers/Tenant/Diagnostics/DiagnosticsPages.ts +8 -2
- package/dist/containers/Tenant/Diagnostics/Overview/TopicStats/TopicStats.scss +9 -1
- package/dist/containers/Tenant/Diagnostics/Overview/TopicStats/TopicStats.tsx +6 -8
- package/dist/containers/Tenant/Diagnostics/Partitions/Headers/Headers.scss +33 -0
- package/dist/containers/Tenant/Diagnostics/Partitions/Headers/Headers.tsx +76 -0
- package/dist/containers/Tenant/Diagnostics/Partitions/Headers/index.ts +1 -0
- package/dist/containers/Tenant/Diagnostics/Partitions/Partitions.scss +45 -0
- package/dist/containers/Tenant/Diagnostics/Partitions/Partitions.tsx +254 -0
- package/dist/containers/Tenant/Diagnostics/Partitions/PartitionsWrapper.tsx +79 -0
- package/dist/containers/Tenant/Diagnostics/Partitions/columns/Columns.scss +13 -0
- package/dist/containers/Tenant/Diagnostics/Partitions/columns/columns.tsx +246 -0
- package/dist/containers/Tenant/Diagnostics/Partitions/columns/index.ts +1 -0
- package/dist/containers/Tenant/Diagnostics/Partitions/i18n/en.json +13 -0
- package/dist/containers/Tenant/Diagnostics/Partitions/i18n/index.ts +11 -0
- package/dist/containers/Tenant/Diagnostics/Partitions/i18n/ru.json +13 -0
- package/dist/containers/Tenant/Diagnostics/Partitions/index.ts +1 -0
- package/dist/containers/Tenant/Diagnostics/Partitions/utils/constants.ts +74 -0
- package/dist/containers/Tenant/Diagnostics/Partitions/utils/types.ts +6 -0
- package/dist/containers/Tenant/utils/schema.ts +1 -16
- package/dist/services/api.d.ts +4 -0
- package/dist/services/api.js +22 -6
- package/dist/store/reducers/consumer.ts +160 -0
- package/dist/store/reducers/index.ts +2 -0
- package/dist/store/reducers/settings.js +2 -0
- package/dist/store/reducers/topic.ts +82 -2
- package/dist/types/store/consumer.ts +55 -0
- package/dist/types/store/topic.ts +23 -6
- package/dist/utils/bytesParsers/convertBytesObjectToSpeed.ts +24 -0
- package/dist/utils/bytesParsers/formatBytesCustom.ts +57 -0
- package/dist/utils/bytesParsers/i18n/en.json +7 -0
- package/dist/utils/bytesParsers/i18n/index.ts +11 -0
- package/dist/utils/bytesParsers/i18n/ru.json +7 -0
- package/dist/utils/bytesParsers/index.ts +2 -0
- package/dist/utils/constants.ts +3 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/storage.ts +2 -2
- package/dist/utils/timeParsers/index.ts +2 -1
- package/dist/utils/timeParsers/parsers.ts +18 -0
- package/dist/utils/timeParsers/{protobuf.ts → protobufParsers.ts} +0 -0
- package/dist/utils/utils.js +3 -3
- package/package.json +2 -2
@@ -0,0 +1,246 @@
|
|
1
|
+
import DataTable, {Column} from '@gravity-ui/react-data-table';
|
2
|
+
import block from 'bem-cn-lite';
|
3
|
+
|
4
|
+
import {SpeedMultiMeter} from '../../../../../components/SpeedMultiMeter';
|
5
|
+
import EntityStatus from '../../../../../components/EntityStatus/EntityStatus';
|
6
|
+
import {getDefaultNodePath} from '../../../../Node/NodePages';
|
7
|
+
import {formatBytes, formatMsToUptime} from '../../../../../utils';
|
8
|
+
import {isNumeric} from '../../../../../utils/utils';
|
9
|
+
|
10
|
+
import {
|
11
|
+
PARTITIONS_COLUMNS_IDS,
|
12
|
+
PARTITIONS_COLUMNS_TITILES,
|
13
|
+
PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS,
|
14
|
+
PARTITIONS_READ_LAGS_SUB_COLUMNS_TITLES,
|
15
|
+
PARTITIONS_WRITE_LAGS_SUB_COLUMNS_IDS,
|
16
|
+
PARTITIONS_WRITE_LAGS_SUB_COLUMNS_TITLES,
|
17
|
+
} from '../utils/constants';
|
18
|
+
import type {IPreparedPartitionDataWithHosts} from '../utils/types';
|
19
|
+
|
20
|
+
import {
|
21
|
+
MultilineHeader,
|
22
|
+
ReadLagsHeader,
|
23
|
+
ReadSessionHeader,
|
24
|
+
UncommitedMessagesHeader,
|
25
|
+
UnreadMessagesHeader,
|
26
|
+
WriteLagsHeader,
|
27
|
+
} from '../Headers';
|
28
|
+
|
29
|
+
import './Columns.scss';
|
30
|
+
|
31
|
+
const b = block('ydb-diagnostics-partitions-columns');
|
32
|
+
|
33
|
+
export const columns: Column<IPreparedPartitionDataWithHosts>[] = [
|
34
|
+
{
|
35
|
+
name: PARTITIONS_COLUMNS_IDS.PARTITION_ID,
|
36
|
+
header: (
|
37
|
+
<MultilineHeader
|
38
|
+
title={PARTITIONS_COLUMNS_TITILES[PARTITIONS_COLUMNS_IDS.PARTITION_ID]}
|
39
|
+
/>
|
40
|
+
),
|
41
|
+
sortAccessor: (row) => isNumeric(row.partitionId) && Number(row.partitionId),
|
42
|
+
align: DataTable.LEFT,
|
43
|
+
render: ({row}) => row.partitionId,
|
44
|
+
},
|
45
|
+
{
|
46
|
+
name: PARTITIONS_COLUMNS_IDS.STORE_SIZE,
|
47
|
+
header: (
|
48
|
+
<MultilineHeader
|
49
|
+
title={PARTITIONS_COLUMNS_TITILES[PARTITIONS_COLUMNS_IDS.STORE_SIZE]}
|
50
|
+
/>
|
51
|
+
),
|
52
|
+
align: DataTable.RIGHT,
|
53
|
+
render: ({row}) => formatBytes(row.storeSize),
|
54
|
+
},
|
55
|
+
{
|
56
|
+
name: PARTITIONS_COLUMNS_IDS.WRITE_SPEED,
|
57
|
+
header: PARTITIONS_COLUMNS_TITILES[PARTITIONS_COLUMNS_IDS.WRITE_SPEED],
|
58
|
+
align: DataTable.LEFT,
|
59
|
+
sortAccessor: (row) => row.writeSpeed.perMinute,
|
60
|
+
render: ({row}) => <SpeedMultiMeter data={row.writeSpeed} />,
|
61
|
+
},
|
62
|
+
{
|
63
|
+
name: PARTITIONS_COLUMNS_IDS.READ_SPEED,
|
64
|
+
header: PARTITIONS_COLUMNS_TITILES[PARTITIONS_COLUMNS_IDS.READ_SPEED],
|
65
|
+
align: DataTable.LEFT,
|
66
|
+
sortAccessor: (row) => row.readSpeed.perMinute,
|
67
|
+
render: ({row}) => <SpeedMultiMeter data={row.readSpeed} />,
|
68
|
+
},
|
69
|
+
{
|
70
|
+
name: PARTITIONS_COLUMNS_IDS.WRITE_LAGS,
|
71
|
+
header: <WriteLagsHeader />,
|
72
|
+
className: b('lags-header'),
|
73
|
+
sub: [
|
74
|
+
{
|
75
|
+
name: PARTITIONS_WRITE_LAGS_SUB_COLUMNS_IDS.PARTITION_WRITE_LAG,
|
76
|
+
header: PARTITIONS_WRITE_LAGS_SUB_COLUMNS_TITLES[
|
77
|
+
PARTITIONS_WRITE_LAGS_SUB_COLUMNS_IDS.PARTITION_WRITE_LAG
|
78
|
+
],
|
79
|
+
align: DataTable.RIGHT,
|
80
|
+
render: ({row}) => formatMsToUptime(row.partitionWriteLag),
|
81
|
+
},
|
82
|
+
{
|
83
|
+
name: PARTITIONS_WRITE_LAGS_SUB_COLUMNS_IDS.PARTITION_WRITE_IDLE_TIME,
|
84
|
+
header: PARTITIONS_WRITE_LAGS_SUB_COLUMNS_TITLES[
|
85
|
+
PARTITIONS_WRITE_LAGS_SUB_COLUMNS_IDS.PARTITION_WRITE_IDLE_TIME
|
86
|
+
],
|
87
|
+
align: DataTable.RIGHT,
|
88
|
+
render: ({row}) => formatMsToUptime(row.partitionWriteIdleTime),
|
89
|
+
},
|
90
|
+
],
|
91
|
+
},
|
92
|
+
{
|
93
|
+
name: PARTITIONS_COLUMNS_IDS.READ_LAGS,
|
94
|
+
header: <ReadLagsHeader />,
|
95
|
+
className: b('lags-header'),
|
96
|
+
sub: [
|
97
|
+
{
|
98
|
+
name: PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS.CONSUMER_WRITE_LAG,
|
99
|
+
header: PARTITIONS_READ_LAGS_SUB_COLUMNS_TITLES[
|
100
|
+
PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS.CONSUMER_WRITE_LAG
|
101
|
+
],
|
102
|
+
align: DataTable.RIGHT,
|
103
|
+
render: ({row}) => formatMsToUptime(row.consumerWriteLag),
|
104
|
+
},
|
105
|
+
{
|
106
|
+
name: PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS.CONSUMER_READ_LAG,
|
107
|
+
header: PARTITIONS_READ_LAGS_SUB_COLUMNS_TITLES[
|
108
|
+
PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS.CONSUMER_READ_LAG
|
109
|
+
],
|
110
|
+
align: DataTable.RIGHT,
|
111
|
+
render: ({row}) => formatMsToUptime(row.consumerReadLag),
|
112
|
+
},
|
113
|
+
{
|
114
|
+
name: PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS.CONSUMER_READ_IDLE_TIME,
|
115
|
+
header: PARTITIONS_READ_LAGS_SUB_COLUMNS_TITLES[
|
116
|
+
PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS.CONSUMER_READ_IDLE_TIME
|
117
|
+
],
|
118
|
+
align: DataTable.RIGHT,
|
119
|
+
render: ({row}) => formatMsToUptime(row.consumerReadIdleTime),
|
120
|
+
},
|
121
|
+
],
|
122
|
+
},
|
123
|
+
{
|
124
|
+
name: PARTITIONS_COLUMNS_IDS.UNCOMMITED_MESSAGES,
|
125
|
+
header: <UncommitedMessagesHeader />,
|
126
|
+
align: DataTable.RIGHT,
|
127
|
+
render: ({row}) => row.uncommitedMessages,
|
128
|
+
},
|
129
|
+
{
|
130
|
+
name: PARTITIONS_COLUMNS_IDS.UNREAD_MESSAGES,
|
131
|
+
header: <UnreadMessagesHeader />,
|
132
|
+
align: DataTable.RIGHT,
|
133
|
+
render: ({row}) => row.unreadMessages,
|
134
|
+
},
|
135
|
+
{
|
136
|
+
name: PARTITIONS_COLUMNS_IDS.START_OFFSET,
|
137
|
+
header: (
|
138
|
+
<MultilineHeader
|
139
|
+
title={PARTITIONS_COLUMNS_TITILES[PARTITIONS_COLUMNS_IDS.START_OFFSET]}
|
140
|
+
/>
|
141
|
+
),
|
142
|
+
sortAccessor: (row) => isNumeric(row.startOffset) && Number(row.startOffset),
|
143
|
+
align: DataTable.RIGHT,
|
144
|
+
render: ({row}) => row.startOffset,
|
145
|
+
},
|
146
|
+
{
|
147
|
+
name: PARTITIONS_COLUMNS_IDS.END_OFFSET,
|
148
|
+
header: (
|
149
|
+
<MultilineHeader
|
150
|
+
title={PARTITIONS_COLUMNS_TITILES[PARTITIONS_COLUMNS_IDS.END_OFFSET]}
|
151
|
+
/>
|
152
|
+
),
|
153
|
+
sortAccessor: (row) => isNumeric(row.endOffset) && Number(row.endOffset),
|
154
|
+
align: DataTable.RIGHT,
|
155
|
+
render: ({row}) => row.endOffset,
|
156
|
+
},
|
157
|
+
{
|
158
|
+
name: PARTITIONS_COLUMNS_IDS.COMMITED_OFFSET,
|
159
|
+
header: (
|
160
|
+
<MultilineHeader
|
161
|
+
title={PARTITIONS_COLUMNS_TITILES[PARTITIONS_COLUMNS_IDS.COMMITED_OFFSET]}
|
162
|
+
/>
|
163
|
+
),
|
164
|
+
sortAccessor: (row) => isNumeric(row.commitedOffset) && Number(row.commitedOffset),
|
165
|
+
align: DataTable.RIGHT,
|
166
|
+
render: ({row}) => row.commitedOffset,
|
167
|
+
},
|
168
|
+
{
|
169
|
+
name: PARTITIONS_COLUMNS_IDS.READ_SESSION_ID,
|
170
|
+
header: <ReadSessionHeader />,
|
171
|
+
align: DataTable.LEFT,
|
172
|
+
render: ({row}) =>
|
173
|
+
row.readSessionId ? (
|
174
|
+
<EntityStatus
|
175
|
+
name={row.readSessionId}
|
176
|
+
showStatus={false}
|
177
|
+
hasClipboardButton
|
178
|
+
className={b('string-with-copy')}
|
179
|
+
/>
|
180
|
+
) : (
|
181
|
+
'–'
|
182
|
+
),
|
183
|
+
},
|
184
|
+
{
|
185
|
+
name: PARTITIONS_COLUMNS_IDS.READER_NAME,
|
186
|
+
header: (
|
187
|
+
<MultilineHeader
|
188
|
+
title={PARTITIONS_COLUMNS_TITILES[PARTITIONS_COLUMNS_IDS.READER_NAME]}
|
189
|
+
/>
|
190
|
+
),
|
191
|
+
align: DataTable.LEFT,
|
192
|
+
render: ({row}) =>
|
193
|
+
row.readerName ? (
|
194
|
+
<EntityStatus
|
195
|
+
name={row.readerName}
|
196
|
+
showStatus={false}
|
197
|
+
hasClipboardButton
|
198
|
+
className={b('string-with-copy')}
|
199
|
+
/>
|
200
|
+
) : (
|
201
|
+
'–'
|
202
|
+
),
|
203
|
+
},
|
204
|
+
{
|
205
|
+
name: PARTITIONS_COLUMNS_IDS.PARTITION_HOST,
|
206
|
+
header: (
|
207
|
+
<MultilineHeader
|
208
|
+
title={PARTITIONS_COLUMNS_TITILES[PARTITIONS_COLUMNS_IDS.PARTITION_HOST]}
|
209
|
+
/>
|
210
|
+
),
|
211
|
+
align: DataTable.LEFT,
|
212
|
+
render: ({row}) =>
|
213
|
+
row.partitionHost ? (
|
214
|
+
<EntityStatus
|
215
|
+
name={row.partitionHost}
|
216
|
+
path={getDefaultNodePath(row.partitionHost)}
|
217
|
+
showStatus={false}
|
218
|
+
hasClipboardButton
|
219
|
+
className={b('string-with-copy')}
|
220
|
+
/>
|
221
|
+
) : (
|
222
|
+
'–'
|
223
|
+
),
|
224
|
+
},
|
225
|
+
{
|
226
|
+
name: PARTITIONS_COLUMNS_IDS.CONNECTION_HOST,
|
227
|
+
header: (
|
228
|
+
<MultilineHeader
|
229
|
+
title={PARTITIONS_COLUMNS_TITILES[PARTITIONS_COLUMNS_IDS.CONNECTION_HOST]}
|
230
|
+
/>
|
231
|
+
),
|
232
|
+
align: DataTable.LEFT,
|
233
|
+
render: ({row}) =>
|
234
|
+
row.connectionHost ? (
|
235
|
+
<EntityStatus
|
236
|
+
name={row.connectionHost}
|
237
|
+
path={getDefaultNodePath(row.connectionNodeId)}
|
238
|
+
showStatus={false}
|
239
|
+
hasClipboardButton
|
240
|
+
className={b('string-with-copy')}
|
241
|
+
/>
|
242
|
+
) : (
|
243
|
+
'–'
|
244
|
+
),
|
245
|
+
},
|
246
|
+
];
|
@@ -0,0 +1 @@
|
|
1
|
+
export * from './columns';
|
@@ -0,0 +1,13 @@
|
|
1
|
+
{
|
2
|
+
"lagsPopover.writeLags": "Write lags statistics (time format dd hh:mm:ss)",
|
3
|
+
"lagsPopover.readLags": "Read lags statistics (time format dd hh:mm:ss)",
|
4
|
+
"headers.unread": "End offset - Last read offset",
|
5
|
+
"headers.uncommited": "End offset - Committed offset",
|
6
|
+
"controls.consumerSelector": "Consumer:",
|
7
|
+
"controls.consumerSelector.placeholder": "Consumer",
|
8
|
+
"controls.partitionSearch": "Partition ID",
|
9
|
+
"controls.generalSearch": "Host, Host ID, Reader, Read Session ID",
|
10
|
+
"table.emptyDataMessage": "No partitions match the current search",
|
11
|
+
"noConsumersMessage.topic": "This topic has no consumers",
|
12
|
+
"noConsumersMessage.stream": "This changefeed has no consumers"
|
13
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import {i18n, Lang} from '../../../../../utils/i18n';
|
2
|
+
|
3
|
+
import en from './en.json';
|
4
|
+
import ru from './ru.json';
|
5
|
+
|
6
|
+
const COMPONENT = 'ydb-diagnostics-partitions';
|
7
|
+
|
8
|
+
i18n.registerKeyset(Lang.En, COMPONENT, en);
|
9
|
+
i18n.registerKeyset(Lang.Ru, COMPONENT, ru);
|
10
|
+
|
11
|
+
export default i18n.keyset(COMPONENT);
|
@@ -0,0 +1,13 @@
|
|
1
|
+
{
|
2
|
+
"lagsPopover.writeLags": "Статистика лагов записи (формат времени дд чч:мм:сс)",
|
3
|
+
"lagsPopover.readLags": "Статистика лагов чтения (формат времени дд чч:мм:сс)",
|
4
|
+
"headers.unread": "End offset - Last read offset",
|
5
|
+
"headers.uncommited": "End offset - Committed offset",
|
6
|
+
"controls.consumerSelector": "Читатель:",
|
7
|
+
"controls.consumerSelector.placeholder": "Читатель",
|
8
|
+
"controls.partitionSearch": "Partition ID",
|
9
|
+
"controls.generalSearch": "Host, Host ID, Reader, Read Session ID",
|
10
|
+
"table.emptyDataMessage": "По заданному поиску нет партиций",
|
11
|
+
"noConsumersMessage.topic": "У этого топика нет читателей",
|
12
|
+
"noConsumersMessage.stream": "У этого стрима нет читателей"
|
13
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
export * from './PartitionsWrapper';
|
@@ -0,0 +1,74 @@
|
|
1
|
+
export const PARTITIONS_COLUMNS_IDS = {
|
2
|
+
PARTITION_ID: 'partitionId',
|
3
|
+
|
4
|
+
STORE_SIZE: 'storeSize',
|
5
|
+
|
6
|
+
WRITE_SPEED: 'writeSpeed',
|
7
|
+
READ_SPEED: 'readSpeed',
|
8
|
+
|
9
|
+
WRITE_LAGS: 'writeLags',
|
10
|
+
READ_LAGS: 'readLags',
|
11
|
+
|
12
|
+
UNCOMMITED_MESSAGES: 'uncommitedMessages',
|
13
|
+
UNREAD_MESSAGES: 'unreadMessages',
|
14
|
+
|
15
|
+
START_OFFSET: 'startOffset',
|
16
|
+
END_OFFSET: 'endOffset',
|
17
|
+
COMMITED_OFFSET: 'commitedOffset',
|
18
|
+
|
19
|
+
READ_SESSION_ID: 'readSessionId',
|
20
|
+
READER_NAME: 'readerName',
|
21
|
+
|
22
|
+
PARTITION_HOST: 'partitionHost',
|
23
|
+
CONNECTION_HOST: 'connectionHost',
|
24
|
+
} as const;
|
25
|
+
|
26
|
+
export const PARTITIONS_COLUMNS_TITILES = {
|
27
|
+
[PARTITIONS_COLUMNS_IDS.PARTITION_ID]: 'Partition ID',
|
28
|
+
|
29
|
+
[PARTITIONS_COLUMNS_IDS.STORE_SIZE]: 'Store size',
|
30
|
+
|
31
|
+
[PARTITIONS_COLUMNS_IDS.WRITE_SPEED]: 'Write speed',
|
32
|
+
[PARTITIONS_COLUMNS_IDS.READ_SPEED]: 'Read speed',
|
33
|
+
|
34
|
+
[PARTITIONS_COLUMNS_IDS.WRITE_LAGS]: 'Write lags, duration',
|
35
|
+
|
36
|
+
[PARTITIONS_COLUMNS_IDS.READ_LAGS]: 'Read lags, duration',
|
37
|
+
|
38
|
+
[PARTITIONS_COLUMNS_IDS.UNCOMMITED_MESSAGES]: 'Uncommited messages',
|
39
|
+
[PARTITIONS_COLUMNS_IDS.UNREAD_MESSAGES]: 'Unread messages',
|
40
|
+
|
41
|
+
[PARTITIONS_COLUMNS_IDS.START_OFFSET]: 'Start offset',
|
42
|
+
[PARTITIONS_COLUMNS_IDS.END_OFFSET]: 'End offset',
|
43
|
+
[PARTITIONS_COLUMNS_IDS.COMMITED_OFFSET]: 'Commited offset',
|
44
|
+
|
45
|
+
[PARTITIONS_COLUMNS_IDS.READ_SESSION_ID]: 'Read session ID',
|
46
|
+
[PARTITIONS_COLUMNS_IDS.READER_NAME]: 'Reader name',
|
47
|
+
|
48
|
+
[PARTITIONS_COLUMNS_IDS.PARTITION_HOST]: 'Partition host',
|
49
|
+
[PARTITIONS_COLUMNS_IDS.CONNECTION_HOST]: 'Connection host',
|
50
|
+
} as const;
|
51
|
+
|
52
|
+
export const PARTITIONS_WRITE_LAGS_SUB_COLUMNS_IDS = {
|
53
|
+
PARTITION_WRITE_LAG: 'partitionWriteLag',
|
54
|
+
PARTITION_WRITE_IDLE_TIME: 'partitionWriteIdleTime',
|
55
|
+
} as const;
|
56
|
+
|
57
|
+
export const PARTITIONS_WRITE_LAGS_SUB_COLUMNS_TITLES = {
|
58
|
+
[PARTITIONS_WRITE_LAGS_SUB_COLUMNS_IDS.PARTITION_WRITE_LAG]: 'write lag',
|
59
|
+
[PARTITIONS_WRITE_LAGS_SUB_COLUMNS_IDS.PARTITION_WRITE_IDLE_TIME]: 'write idle time',
|
60
|
+
} as const;
|
61
|
+
|
62
|
+
export const PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS = {
|
63
|
+
CONSUMER_WRITE_LAG: 'consumerWriteLag',
|
64
|
+
CONSUMER_READ_LAG: 'consumerReadLag',
|
65
|
+
CONSUMER_READ_IDLE_TIME: 'consumerReadIdleTime',
|
66
|
+
} as const;
|
67
|
+
|
68
|
+
export const PARTITIONS_READ_LAGS_SUB_COLUMNS_TITLES = {
|
69
|
+
[PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS.CONSUMER_WRITE_LAG]: 'write lag',
|
70
|
+
[PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS.CONSUMER_READ_LAG]: 'read lag',
|
71
|
+
[PARTITIONS_READ_LAGS_SUB_COLUMNS_IDS.CONSUMER_READ_IDLE_TIME]: 'read idle time',
|
72
|
+
} as const;
|
73
|
+
|
74
|
+
export const PARTITIONS_DEFAULT_SELECTED_COLUMNS = Object.values(PARTITIONS_COLUMNS_IDS);
|
@@ -155,22 +155,7 @@ export const isDatabaseEntityType = (type?: EPathType) =>
|
|
155
155
|
|
156
156
|
// ====================
|
157
157
|
|
158
|
-
const
|
159
|
-
[EPathType.EPathTypeCdcStream]: true,
|
160
|
-
|
161
|
-
[EPathType.EPathTypeInvalid]: false,
|
162
|
-
[EPathType.EPathTypeColumnStore]: false,
|
163
|
-
[EPathType.EPathTypeColumnTable]: false,
|
164
|
-
[EPathType.EPathTypeDir]: false,
|
165
|
-
[EPathType.EPathTypeTable]: false,
|
166
|
-
[EPathType.EPathTypeSubDomain]: false,
|
167
|
-
[EPathType.EPathTypeTableIndex]: false,
|
168
|
-
[EPathType.EPathTypeExtSubDomain]: false,
|
169
|
-
[EPathType.EPathTypePersQueueGroup]: false,
|
170
|
-
};
|
171
|
-
|
172
|
-
export const isCdcStreamEntityType = (type?: EPathType) =>
|
173
|
-
(type && pathTypeToIsCdcStream[type]) ?? false;
|
158
|
+
export const isCdcStreamEntityType = (type?: EPathType) => type === EPathType.EPathTypeCdcStream;
|
174
159
|
|
175
160
|
// ====================
|
176
161
|
|
package/dist/services/api.d.ts
CHANGED
@@ -62,6 +62,10 @@ interface Window {
|
|
62
62
|
getTopic: (params: {
|
63
63
|
path?: string;
|
64
64
|
}) => Promise<import('../types/api/topic').DescribeTopicResult>;
|
65
|
+
getConsumer: (params: {
|
66
|
+
path?: string;
|
67
|
+
consumer?: string;
|
68
|
+
}) => Promise<import('../types/api/consumer').DescribeConsumerResult>;
|
65
69
|
[method: string]: Function;
|
66
70
|
};
|
67
71
|
}
|
package/dist/services/api.js
CHANGED
@@ -141,12 +141,28 @@ export class YdbEmbeddedAPI extends AxiosWrapper {
|
|
141
141
|
path,
|
142
142
|
});
|
143
143
|
}
|
144
|
-
getTopic({path}) {
|
145
|
-
return this.get(
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
144
|
+
getTopic({path}, {concurrentId} = {}) {
|
145
|
+
return this.get(
|
146
|
+
this.getPath('/viewer/json/describe_topic'),
|
147
|
+
{
|
148
|
+
enums: true,
|
149
|
+
include_stats: true,
|
150
|
+
path,
|
151
|
+
},
|
152
|
+
{concurrentId: concurrentId || 'getTopic'},
|
153
|
+
);
|
154
|
+
}
|
155
|
+
getConsumer({path, consumer}, {concurrentId} = {}) {
|
156
|
+
return this.get(
|
157
|
+
this.getPath('/viewer/json/describe_consumer'),
|
158
|
+
{
|
159
|
+
enums: true,
|
160
|
+
include_stats: true,
|
161
|
+
path,
|
162
|
+
consumer,
|
163
|
+
},
|
164
|
+
{concurrentId: concurrentId || 'getConsumer'},
|
165
|
+
);
|
150
166
|
}
|
151
167
|
getPoolInfo(poolName) {
|
152
168
|
return this.get(this.getPath('/viewer/json/storage'), {
|
@@ -0,0 +1,160 @@
|
|
1
|
+
/* eslint-disable camelcase */
|
2
|
+
import type {Reducer} from 'redux';
|
3
|
+
import {createSelector, Selector} from 'reselect';
|
4
|
+
|
5
|
+
import type {
|
6
|
+
IConsumerAction,
|
7
|
+
IConsumerRootStateSlice,
|
8
|
+
IConsumerState,
|
9
|
+
IPreparedPartitionData,
|
10
|
+
} from '../../types/store/consumer';
|
11
|
+
|
12
|
+
import '../../services/api';
|
13
|
+
|
14
|
+
import {convertBytesObjectToSpeed} from '../../utils/bytesParsers';
|
15
|
+
import {parseLag, parseTimestampToIdleTime} from '../../utils/timeParsers';
|
16
|
+
import {isNumeric} from '../../utils/utils';
|
17
|
+
|
18
|
+
import {createRequestActionTypes, createApiRequest} from '../utils';
|
19
|
+
|
20
|
+
export const FETCH_CONSUMER = createRequestActionTypes('consumer', 'FETCH_CONSUMER');
|
21
|
+
|
22
|
+
const SET_DATA_WAS_NOT_LOADED = 'consumer/SET_DATA_WAS_NOT_LOADED';
|
23
|
+
|
24
|
+
const initialState = {
|
25
|
+
loading: false,
|
26
|
+
wasLoaded: false,
|
27
|
+
data: {},
|
28
|
+
};
|
29
|
+
|
30
|
+
const consumer: Reducer<IConsumerState, IConsumerAction> = (state = initialState, action) => {
|
31
|
+
switch (action.type) {
|
32
|
+
case FETCH_CONSUMER.REQUEST: {
|
33
|
+
return {
|
34
|
+
...state,
|
35
|
+
loading: true,
|
36
|
+
};
|
37
|
+
}
|
38
|
+
case FETCH_CONSUMER.SUCCESS: {
|
39
|
+
// On older version it can return HTML page of Internal Viewer with an error
|
40
|
+
if (typeof action.data !== 'object') {
|
41
|
+
return {...state, loading: false, error: {}};
|
42
|
+
}
|
43
|
+
|
44
|
+
return {
|
45
|
+
...state,
|
46
|
+
data: action.data,
|
47
|
+
loading: false,
|
48
|
+
wasLoaded: true,
|
49
|
+
error: undefined,
|
50
|
+
};
|
51
|
+
}
|
52
|
+
case FETCH_CONSUMER.FAILURE: {
|
53
|
+
if (action.error?.isCancelled) {
|
54
|
+
return state;
|
55
|
+
}
|
56
|
+
|
57
|
+
return {
|
58
|
+
...state,
|
59
|
+
error: action.error,
|
60
|
+
loading: false,
|
61
|
+
};
|
62
|
+
}
|
63
|
+
case SET_DATA_WAS_NOT_LOADED: {
|
64
|
+
return {
|
65
|
+
...state,
|
66
|
+
wasLoaded: false,
|
67
|
+
};
|
68
|
+
}
|
69
|
+
default:
|
70
|
+
return state;
|
71
|
+
}
|
72
|
+
};
|
73
|
+
|
74
|
+
export const setDataWasNotLoaded = () => {
|
75
|
+
return {
|
76
|
+
type: SET_DATA_WAS_NOT_LOADED,
|
77
|
+
} as const;
|
78
|
+
};
|
79
|
+
|
80
|
+
export function getConsumer(path?: string, consumerName?: string) {
|
81
|
+
return createApiRequest({
|
82
|
+
request: window.api.getConsumer({path, consumer: consumerName}),
|
83
|
+
actions: FETCH_CONSUMER,
|
84
|
+
});
|
85
|
+
}
|
86
|
+
|
87
|
+
export const selectPartitions = (state: IConsumerRootStateSlice) => state.consumer.data?.partitions;
|
88
|
+
|
89
|
+
export const selectPreparedPartitionsData: Selector<
|
90
|
+
IConsumerRootStateSlice,
|
91
|
+
IPreparedPartitionData[] | undefined
|
92
|
+
> = createSelector([selectPartitions], (partitions) => {
|
93
|
+
return partitions?.map((partition) => {
|
94
|
+
// describe_consumer endpoint doesn't return zero values, so some values will be initialized with 0
|
95
|
+
const {partition_id = '0', partition_stats, partition_consumer_stats} = partition;
|
96
|
+
|
97
|
+
const {
|
98
|
+
partition_offsets,
|
99
|
+
store_size_bytes = '0',
|
100
|
+
last_write_time: partition_last_write_time,
|
101
|
+
max_write_time_lag: partition_write_lag,
|
102
|
+
bytes_written,
|
103
|
+
partition_node_id = 0,
|
104
|
+
} = partition_stats || {};
|
105
|
+
|
106
|
+
const {start: start_offset = '0', end: end_offset = '0'} = partition_offsets || {};
|
107
|
+
|
108
|
+
const {
|
109
|
+
last_read_offset = '0',
|
110
|
+
committed_offset = '0',
|
111
|
+
read_session_id,
|
112
|
+
last_read_time: consumer_last_read_time,
|
113
|
+
max_read_time_lag: consumer_read_lag,
|
114
|
+
max_write_time_lag: consumer_write_lag,
|
115
|
+
bytes_read,
|
116
|
+
reader_name,
|
117
|
+
connection_node_id = 0,
|
118
|
+
} = partition_consumer_stats || {};
|
119
|
+
|
120
|
+
const uncommitedMessages =
|
121
|
+
isNumeric(end_offset) && isNumeric(committed_offset)
|
122
|
+
? Number(end_offset) - Number(committed_offset)
|
123
|
+
: 0;
|
124
|
+
|
125
|
+
const unreadMessages =
|
126
|
+
isNumeric(end_offset) && isNumeric(last_read_offset)
|
127
|
+
? Number(end_offset) - Number(last_read_offset)
|
128
|
+
: 0;
|
129
|
+
|
130
|
+
return {
|
131
|
+
partitionId: partition_id,
|
132
|
+
storeSize: store_size_bytes,
|
133
|
+
|
134
|
+
writeSpeed: convertBytesObjectToSpeed(bytes_written),
|
135
|
+
readSpeed: convertBytesObjectToSpeed(bytes_read),
|
136
|
+
|
137
|
+
partitionWriteLag: parseLag(partition_write_lag),
|
138
|
+
partitionWriteIdleTime: parseTimestampToIdleTime(partition_last_write_time),
|
139
|
+
|
140
|
+
consumerWriteLag: parseLag(consumer_write_lag),
|
141
|
+
consumerReadLag: parseLag(consumer_read_lag),
|
142
|
+
consumerReadIdleTime: parseTimestampToIdleTime(consumer_last_read_time),
|
143
|
+
|
144
|
+
uncommitedMessages,
|
145
|
+
unreadMessages,
|
146
|
+
|
147
|
+
startOffset: start_offset,
|
148
|
+
endOffset: end_offset,
|
149
|
+
commitedOffset: committed_offset,
|
150
|
+
|
151
|
+
readSessionId: read_session_id,
|
152
|
+
readerName: reader_name,
|
153
|
+
|
154
|
+
partitionNodeId: partition_node_id,
|
155
|
+
connectionNodeId: connection_node_id,
|
156
|
+
};
|
157
|
+
});
|
158
|
+
});
|
159
|
+
|
160
|
+
export default consumer;
|
@@ -18,6 +18,7 @@ import pool from './pool';
|
|
18
18
|
import tenants from './tenants';
|
19
19
|
import tablet from './tablet';
|
20
20
|
import topic from './topic';
|
21
|
+
import consumer from './consumer';
|
21
22
|
import executeQuery from './executeQuery';
|
22
23
|
import explainQuery from './explainQuery';
|
23
24
|
import tabletsFilters from './tabletsFilters';
|
@@ -57,6 +58,7 @@ export const rootReducer = {
|
|
57
58
|
tenants,
|
58
59
|
tablet,
|
59
60
|
topic,
|
61
|
+
consumer,
|
60
62
|
executeQuery,
|
61
63
|
explainQuery,
|
62
64
|
tabletsFilters,
|
@@ -7,6 +7,7 @@ import {
|
|
7
7
|
INVERTED_DISKS_KEY,
|
8
8
|
ASIDE_HEADER_COMPACT_KEY,
|
9
9
|
USE_NODES_ENDPOINT_IN_DIAGNOSTICS_KEY,
|
10
|
+
PARTITIONS_SELECTED_COLUMNS_KEY,
|
10
11
|
} from '../../utils/constants';
|
11
12
|
import '../../services/api';
|
12
13
|
import {getValueFromLS} from '../../utils/utils';
|
@@ -50,6 +51,7 @@ export const initialState = {
|
|
50
51
|
ASIDE_HEADER_COMPACT_KEY,
|
51
52
|
legacyAsideNavCompactState || 'true',
|
52
53
|
),
|
54
|
+
[PARTITIONS_SELECTED_COLUMNS_KEY]: readSavedSettingsValue(PARTITIONS_SELECTED_COLUMNS_KEY),
|
53
55
|
},
|
54
56
|
systemSettings,
|
55
57
|
};
|