ydb-embedded-ui 3.1.0 → 3.2.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.
Files changed (54) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +2 -0
  3. package/dist/components/DateRange/DateRange.scss +11 -0
  4. package/dist/{containers/Tenant/Diagnostics/TopShards → components}/DateRange/DateRange.tsx +7 -7
  5. package/dist/{containers/Tenant/Diagnostics/TopShards → components}/DateRange/index.ts +0 -0
  6. package/dist/components/Illustration/Illustration.tsx +4 -11
  7. package/dist/components/InfoViewer/InfoViewer.scss +2 -0
  8. package/dist/containers/Storage/DiskStateProgressBar/DiskStateProgressBar.tsx +1 -1
  9. package/dist/containers/Storage/StorageNodes/StorageNodes.tsx +16 -0
  10. package/dist/containers/Tenant/Diagnostics/Diagnostics.tsx +4 -5
  11. package/dist/containers/Tenant/Diagnostics/DiagnosticsPages.ts +7 -7
  12. package/dist/containers/Tenant/Diagnostics/{TopShards/TopShards.scss → OverloadedShards/OverloadedShards.scss} +1 -1
  13. package/dist/containers/Tenant/Diagnostics/{TopShards/TopShards.tsx → OverloadedShards/OverloadedShards.tsx} +10 -11
  14. package/dist/containers/Tenant/Diagnostics/{TopShards → OverloadedShards}/i18n/en.json +0 -0
  15. package/dist/containers/Tenant/Diagnostics/OverloadedShards/i18n/index.ts +11 -0
  16. package/dist/containers/Tenant/Diagnostics/{TopShards → OverloadedShards}/i18n/ru.json +0 -0
  17. package/dist/containers/Tenant/Diagnostics/OverloadedShards/index.ts +1 -0
  18. package/dist/containers/Tenant/Diagnostics/TopQueries/TopQueries.scss +16 -19
  19. package/dist/containers/Tenant/Diagnostics/TopQueries/TopQueries.tsx +202 -0
  20. package/dist/containers/Tenant/Diagnostics/TopQueries/i18n/en.json +4 -0
  21. package/dist/containers/Tenant/Diagnostics/{TopShards → TopQueries}/i18n/index.ts +1 -1
  22. package/dist/containers/Tenant/Diagnostics/TopQueries/i18n/ru.json +4 -0
  23. package/dist/containers/Tenant/Diagnostics/TopQueries/index.ts +1 -0
  24. package/dist/containers/UserSettings/UserSettings.tsx +1 -1
  25. package/dist/services/api.d.ts +7 -0
  26. package/dist/store/reducers/describe.ts +4 -1
  27. package/dist/store/reducers/executeTopQueries.ts +170 -0
  28. package/dist/store/reducers/settings.js +1 -1
  29. package/dist/store/reducers/shardsWorkload.ts +9 -9
  30. package/dist/store/reducers/storage.js +2 -0
  31. package/dist/store/reducers/{tablets.js → tablets.ts} +30 -17
  32. package/dist/store/state-url-mapping.js +10 -2
  33. package/dist/types/api/compute.ts +52 -0
  34. package/dist/types/api/consumer.ts +257 -0
  35. package/dist/types/api/enums.ts +2 -2
  36. package/dist/types/api/nodes.ts +5 -2
  37. package/dist/types/api/pdisk.ts +3 -0
  38. package/dist/types/api/schema.ts +1 -0
  39. package/dist/types/api/storage.ts +31 -28
  40. package/dist/types/api/tablet.ts +18 -2
  41. package/dist/types/api/tenant.ts +4 -1
  42. package/dist/types/api/topic.ts +157 -0
  43. package/dist/types/api/vdisk.ts +3 -0
  44. package/dist/types/store/executeTopQueries.ts +29 -0
  45. package/dist/types/store/schema.ts +3 -3
  46. package/dist/types/store/shardsWorkload.ts +3 -3
  47. package/dist/types/store/tablets.ts +42 -0
  48. package/dist/utils/getNodesColumns.js +8 -1
  49. package/package.json +3 -3
  50. package/dist/containers/Tenant/Diagnostics/TopQueries/TopQueries.js +0 -188
  51. package/dist/containers/Tenant/Diagnostics/TopShards/DateRange/DateRange.scss +0 -13
  52. package/dist/containers/Tenant/Diagnostics/TopShards/index.ts +0 -1
  53. package/dist/store/reducers/executeTopQueries.js +0 -66
  54. package/dist/types/api/consumers.ts +0 -3
@@ -2,7 +2,6 @@ import {createSelector, Selector} from 'reselect';
2
2
  import {Reducer} from 'redux';
3
3
 
4
4
  import '../../services/api';
5
- import {IConsumer} from '../../types/api/consumers';
6
5
  import {
7
6
  IDescribeRootStateSlice,
8
7
  IDescribeState,
@@ -100,6 +99,10 @@ const selectConsumersNames = (state: IDescribeRootStateSlice, path?: string) =>
100
99
  ? state.describe.data[path]?.PathDescription?.PersQueueGroup?.PQTabletConfig?.ReadRules
101
100
  : undefined;
102
101
 
102
+ interface IConsumer {
103
+ name: string;
104
+ }
105
+
103
106
  export const selectConsumers: Selector<IDescribeRootStateSlice, IConsumer[], [string | undefined]> =
104
107
  createSelector(selectConsumersNames, (names = []) => names.map((name) => ({name})));
105
108
 
@@ -0,0 +1,170 @@
1
+ import type {AnyAction, Reducer} from 'redux';
2
+ import type {ThunkAction} from 'redux-thunk';
3
+
4
+ import '../../services/api';
5
+ import {
6
+ ITopQueriesAction,
7
+ ITopQueriesFilters,
8
+ ITopQueriesState,
9
+ } from '../../types/store/executeTopQueries';
10
+ import {IQueryResult} from '../../types/store/query';
11
+
12
+ import {parseQueryAPIExecuteResponse} from '../../utils/query';
13
+
14
+ import {createRequestActionTypes, createApiRequest} from '../utils';
15
+
16
+ import type {IRootState} from '.';
17
+
18
+ export const FETCH_TOP_QUERIES = createRequestActionTypes('top-queries', 'FETCH_TOP_QUERIES');
19
+ const SET_TOP_QUERIES_STATE = 'top-queries/SET_TOP_QUERIES_STATE';
20
+ const SET_TOP_QUERIES_FILTERS = 'top-queries/SET_TOP_QUERIES_FILTERS';
21
+
22
+ const initialState = {
23
+ loading: false,
24
+ wasLoaded: false,
25
+ filters: {},
26
+ };
27
+
28
+ const getMaxIntervalSubquery = (path: string) => `(
29
+ SELECT
30
+ MAX(IntervalEnd)
31
+ FROM \`${path}/.sys/top_queries_by_cpu_time_one_hour\`
32
+ )`;
33
+
34
+ function getFiltersConditions(path: string, filters?: ITopQueriesFilters) {
35
+ const conditions: string[] = [];
36
+
37
+ if (filters?.from && filters?.to && filters.from > filters.to) {
38
+ throw new Error('Invalid date range');
39
+ }
40
+
41
+ if (filters?.from) {
42
+ // matching `from` & `to` is an edge case
43
+ // other cases should not include the starting point, since intervals are stored using the ending time
44
+ const gt = filters.to === filters.from ? '>=' : '>';
45
+ conditions.push(`IntervalEnd ${gt} Timestamp('${new Date(filters.from).toISOString()}')`);
46
+ }
47
+
48
+ if (filters?.to) {
49
+ conditions.push(`IntervalEnd <= Timestamp('${new Date(filters.to).toISOString()}')`);
50
+ }
51
+
52
+ if (!filters?.from && !filters?.to) {
53
+ conditions.push(`IntervalEnd IN ${getMaxIntervalSubquery(path)}`);
54
+ }
55
+
56
+ if (filters?.text) {
57
+ conditions.push(`QueryText ILIKE '%${filters.text}%'`);
58
+ }
59
+
60
+ return conditions.join(' AND ');
61
+ }
62
+
63
+ const getQueryText = (path: string, filters?: ITopQueriesFilters) => {
64
+ const filterConditions = getFiltersConditions(path, filters);
65
+ return `
66
+ SELECT
67
+ CPUTime as CPUTimeUs,
68
+ QueryText,
69
+ IntervalEnd
70
+ FROM \`${path}/.sys/top_queries_by_cpu_time_one_hour\`
71
+ WHERE ${filterConditions || 'true'}
72
+ `;
73
+ };
74
+
75
+ const executeTopQueries: Reducer<ITopQueriesState, ITopQueriesAction> = (
76
+ state = initialState,
77
+ action,
78
+ ) => {
79
+ switch (action.type) {
80
+ case FETCH_TOP_QUERIES.REQUEST: {
81
+ return {
82
+ ...state,
83
+ loading: true,
84
+ error: undefined,
85
+ };
86
+ }
87
+ case FETCH_TOP_QUERIES.SUCCESS: {
88
+ return {
89
+ ...state,
90
+ data: action.data,
91
+ loading: false,
92
+ error: undefined,
93
+ wasLoaded: true,
94
+ };
95
+ }
96
+ // 401 Unauthorized error is handled by GenericAPI
97
+ case FETCH_TOP_QUERIES.FAILURE: {
98
+ return {
99
+ ...state,
100
+ error: action.error || 'Unauthorized',
101
+ loading: false,
102
+ };
103
+ }
104
+ case SET_TOP_QUERIES_STATE:
105
+ return {
106
+ ...state,
107
+ ...action.data,
108
+ };
109
+ case SET_TOP_QUERIES_FILTERS:
110
+ return {
111
+ ...state,
112
+ filters: {
113
+ ...state.filters,
114
+ ...action.filters,
115
+ },
116
+ };
117
+ default:
118
+ return state;
119
+ }
120
+ };
121
+
122
+ type FetchTopQueries = (params: {
123
+ database: string;
124
+ filters?: ITopQueriesFilters;
125
+ }) => ThunkAction<Promise<IQueryResult | undefined>, IRootState, unknown, AnyAction>;
126
+
127
+ export const fetchTopQueries: FetchTopQueries =
128
+ ({database, filters}) =>
129
+ async (dispatch, getState) => {
130
+ try {
131
+ return createApiRequest({
132
+ request: window.api.sendQuery(
133
+ {
134
+ schema: 'modern',
135
+ query: getQueryText(database, filters),
136
+ database,
137
+ action: 'execute-scan',
138
+ },
139
+ {
140
+ concurrentId: 'executeTopQueries',
141
+ },
142
+ ),
143
+ actions: FETCH_TOP_QUERIES,
144
+ dataHandler: parseQueryAPIExecuteResponse,
145
+ })(dispatch, getState);
146
+ } catch (error) {
147
+ dispatch({
148
+ type: FETCH_TOP_QUERIES.FAILURE,
149
+ error,
150
+ });
151
+
152
+ throw error;
153
+ }
154
+ };
155
+
156
+ export function setTopQueriesState(state: Partial<ITopQueriesState>) {
157
+ return {
158
+ type: SET_TOP_QUERIES_STATE,
159
+ data: state,
160
+ } as const;
161
+ }
162
+
163
+ export function setTopQueriesFilters(filters: Partial<ITopQueriesFilters>) {
164
+ return {
165
+ type: SET_TOP_QUERIES_FILTERS,
166
+ filters,
167
+ } as const;
168
+ }
169
+
170
+ export default executeTopQueries;
@@ -30,7 +30,7 @@ export const initialState = {
30
30
  ...defaultUserSettings,
31
31
  ...userSettings,
32
32
  [THEME_KEY]: readSavedSettingsValue(THEME_KEY, 'light'),
33
- [INVERTED_DISKS_KEY]: readSavedSettingsValue(INVERTED_DISKS_KEY) === 'true',
33
+ [INVERTED_DISKS_KEY]: readSavedSettingsValue(INVERTED_DISKS_KEY, 'false'),
34
34
  [SAVED_QUERIES_KEY]: readSavedSettingsValue(SAVED_QUERIES_KEY, '[]'),
35
35
  [TENANT_INITIAL_TAB_KEY]: readSavedSettingsValue(TENANT_INITIAL_TAB_KEY),
36
36
  [QUERY_INITIAL_RUN_ACTION_KEY]: readSavedSettingsValue(QUERY_INITIAL_RUN_ACTION_KEY),
@@ -12,8 +12,8 @@ import {parseQueryAPIExecuteResponse} from '../../utils/query';
12
12
  import {createRequestActionTypes, createApiRequest} from '../utils';
13
13
 
14
14
  export const SEND_SHARD_QUERY = createRequestActionTypes('query', 'SEND_SHARD_QUERY');
15
- const SET_SHARD_QUERY_OPTIONS = 'query/SET_SHARD_QUERY_OPTIONS';
16
- const SET_TOP_SHARDS_FILTERS = 'shardsWorkload/SET_TOP_SHARDS_FILTERS';
15
+ const SET_SHARD_STATE = 'query/SET_SHARD_STATE';
16
+ const SET_SHARD_QUERY_FILTERS = 'shardsWorkload/SET_SHARD_QUERY_FILTERS';
17
17
 
18
18
  const initialState = {
19
19
  loading: false,
@@ -115,12 +115,12 @@ const shardsWorkload: Reducer<IShardsWorkloadState, IShardsWorkloadAction> = (
115
115
  loading: false,
116
116
  };
117
117
  }
118
- case SET_SHARD_QUERY_OPTIONS:
118
+ case SET_SHARD_STATE:
119
119
  return {
120
120
  ...state,
121
121
  ...action.data,
122
122
  };
123
- case SET_TOP_SHARDS_FILTERS:
123
+ case SET_SHARD_QUERY_FILTERS:
124
124
  return {
125
125
  ...state,
126
126
  filters: {
@@ -151,7 +151,7 @@ export const sendShardQuery = ({database, path = '', sortOrder, filters}: SendSh
151
151
  action: queryAction,
152
152
  },
153
153
  {
154
- concurrentId: 'topShards',
154
+ concurrentId: 'shardsWorkload',
155
155
  },
156
156
  ),
157
157
  actions: SEND_SHARD_QUERY,
@@ -165,16 +165,16 @@ export const sendShardQuery = ({database, path = '', sortOrder, filters}: SendSh
165
165
  }
166
166
  };
167
167
 
168
- export function setShardQueryOptions(options: Partial<IShardsWorkloadState>) {
168
+ export function setShardsState(options: Partial<IShardsWorkloadState>) {
169
169
  return {
170
- type: SET_SHARD_QUERY_OPTIONS,
170
+ type: SET_SHARD_STATE,
171
171
  data: options,
172
172
  } as const;
173
173
  }
174
174
 
175
- export function setTopShardFilters(filters: Partial<IShardsWorkloadFilters>) {
175
+ export function setShardsQueryFilters(filters: Partial<IShardsWorkloadFilters>) {
176
176
  return {
177
- type: SET_TOP_SHARDS_FILTERS,
177
+ type: SET_SHARD_QUERY_FILTERS,
178
178
  filters,
179
179
  } as const;
180
180
  }
@@ -307,6 +307,8 @@ export const getFlatListStorageNodes = createSelector([getStorageNodes], (storag
307
307
  return {
308
308
  NodeId: node.NodeId,
309
309
  FQDN: systemState.Host,
310
+ DataCenter: systemState.DataCenter,
311
+ Rack: systemState.Rack,
310
312
  uptime: calcUptime(systemState.StartTime),
311
313
  StartTime: systemState.StartTime,
312
314
  PDisks: node.PDisks,
@@ -1,7 +1,20 @@
1
- import {createRequestActionTypes, createApiRequest} from '../utils';
1
+ import type {Reducer} from 'redux';
2
2
  import '../../services/api';
3
3
 
4
- const FETCH_TABLETS = createRequestActionTypes('tablets', 'FETCH_TABLETS');
4
+ import type {ETabletState, EType} from '../../types/api/tablet';
5
+ import type {
6
+ ITabletsAction,
7
+ ITabletsApiRequestParams,
8
+ ITabletsState,
9
+ } from '../../types/store/tablets';
10
+
11
+ import {createRequestActionTypes, createApiRequest} from '../utils';
12
+
13
+ export const FETCH_TABLETS = createRequestActionTypes('tablets', 'FETCH_TABLETS');
14
+
15
+ const CLEAR_WAS_LOADING_TABLETS = 'tablets/CLEAR_WAS_LOADING_TABLETS';
16
+ const SET_STATE_FILTER = 'tablets/SET_STATE_FILTER';
17
+ const SET_TYPE_FILTER = 'tablets/SET_TYPE_FILTER';
5
18
 
6
19
  const initialState = {
7
20
  loading: true,
@@ -10,13 +23,12 @@ const initialState = {
10
23
  typeFilter: [],
11
24
  };
12
25
 
13
- const tablets = function z(state = initialState, action) {
26
+ const tablets: Reducer<ITabletsState, ITabletsAction> = (state = initialState, action) => {
14
27
  switch (action.type) {
15
28
  case FETCH_TABLETS.REQUEST: {
16
29
  return {
17
30
  ...state,
18
31
  loading: true,
19
- requestTime: new Date().getTime(),
20
32
  };
21
33
  }
22
34
  case FETCH_TABLETS.SUCCESS: {
@@ -35,20 +47,20 @@ const tablets = function z(state = initialState, action) {
35
47
  loading: false,
36
48
  };
37
49
  }
38
- case 'CLEAR_WAS_LOADING_TABLETS': {
50
+ case CLEAR_WAS_LOADING_TABLETS: {
39
51
  return {
40
52
  ...state,
41
53
  wasLoaded: false,
42
54
  loading: true,
43
55
  };
44
56
  }
45
- case 'SET_STATE_FILTER': {
57
+ case SET_STATE_FILTER: {
46
58
  return {
47
59
  ...state,
48
60
  stateFilter: action.data,
49
61
  };
50
62
  }
51
- case 'SET_TYPE_FILTER': {
63
+ case SET_TYPE_FILTER: {
52
64
  return {
53
65
  ...state,
54
66
  typeFilter: action.data,
@@ -59,25 +71,26 @@ const tablets = function z(state = initialState, action) {
59
71
  }
60
72
  };
61
73
 
62
- export const setStateFilter = (stateFilter) => {
74
+ export const setStateFilter = (stateFilter: ETabletState[]) => {
63
75
  return {
64
- type: 'SET_STATE_FILTER',
76
+ type: SET_STATE_FILTER,
65
77
  data: stateFilter,
66
- };
78
+ } as const;
67
79
  };
68
80
 
69
- export const setTypeFilter = (typeFilter) => {
81
+ export const setTypeFilter = (typeFilter: EType[]) => {
70
82
  return {
71
- type: 'SET_TYPE_FILTER',
83
+ type: SET_TYPE_FILTER,
72
84
  data: typeFilter,
73
- };
85
+ } as const;
74
86
  };
75
87
 
76
- export const clearWasLoadingFlag = () => ({
77
- type: 'CLEAR_WAS_LOADING_TABLETS',
78
- });
88
+ export const clearWasLoadingFlag = () =>
89
+ ({
90
+ type: CLEAR_WAS_LOADING_TABLETS,
91
+ } as const);
79
92
 
80
- export function getTabletsInfo(data) {
93
+ export function getTabletsInfo(data: ITabletsApiRequestParams) {
81
94
  return createApiRequest({
82
95
  request: window.api.getTabletsInfo(data),
83
96
  actions: FETCH_TABLETS,
@@ -48,14 +48,22 @@ const paramSetup = {
48
48
  generalTab: {
49
49
  stateKey: 'tenant.diagnosticsTab',
50
50
  },
51
- topShardsFrom: {
51
+ shardsDateFrom: {
52
52
  stateKey: 'shardsWorkload.filters.from',
53
53
  type: 'number',
54
54
  },
55
- topShardsTo: {
55
+ shardsDateTo: {
56
56
  stateKey: 'shardsWorkload.filters.to',
57
57
  type: 'number',
58
58
  },
59
+ topQueriesDateFrom: {
60
+ stateKey: 'executeTopQueries.filters.from',
61
+ type: 'number',
62
+ },
63
+ topQueriesDateTo: {
64
+ stateKey: 'executeTopQueries.filters.to',
65
+ type: 'number',
66
+ },
59
67
  },
60
68
  };
61
69
 
@@ -0,0 +1,52 @@
1
+ import {EFlag} from './enums';
2
+ import {TEndpoint, TLegacyNodeLocation, TPoolStats} from './nodes';
3
+ import {TMetrics} from './tenant';
4
+
5
+ // endpoint: viewer/json/compute
6
+ // source: https://github.com/ydb-platform/ydb/blob/main/ydb/core/viewer/protos/viewer.proto
7
+
8
+ export interface TComputeInfo {
9
+ Overall: EFlag;
10
+ Tenants?: TComputeTenantInfo[];
11
+ Errors?: string[];
12
+ }
13
+
14
+ interface TComputeTenantInfo {
15
+ Overall: EFlag;
16
+ Name: string;
17
+ Nodes?: TComputeNodeInfo[];
18
+ }
19
+
20
+ interface TComputeNodeInfo {
21
+ /** uint64 */
22
+ StartTime: string;
23
+ /** uint64 */
24
+ ChangeTime: string;
25
+ SystemLocation: TLegacyNodeLocation;
26
+ /** double */
27
+ LoadAverage: number[];
28
+ NumberOfCpus: number;
29
+ Overall: EFlag;
30
+ NodeId: number;
31
+ DataCenter: string;
32
+ Rack: string;
33
+ Host: string;
34
+ Version: string;
35
+ PoolStats?: TPoolStats[];
36
+ Endpoints?: TEndpoint[];
37
+ Roles?: string[];
38
+ /** uint64 */
39
+ MemoryUsed?: string;
40
+ /** uint64 */
41
+ MemoryLimit?: string;
42
+ Metrics: TMetrics;
43
+ Tablets?: TTabletStateInfo[];
44
+ }
45
+
46
+ // Tablets in compute nodes
47
+ // Types for tabletInfo and tablets inside nodes and storage endpoints are in tablet.ts
48
+ interface TTabletStateInfo {
49
+ Type: string;
50
+ State: EFlag;
51
+ Count: number;
52
+ }
@@ -0,0 +1,257 @@
1
+ /* eslint-disable camelcase */
2
+
3
+ /**
4
+ * endpoint: /json/describe_consumer
5
+ *
6
+ * source: https://github.com/ydb-platform/ydb/blob/main/ydb/public/api/protos/ydb_topic.proto
7
+ *
8
+ * Original proto file doesn't specify optional fields, so every field is considered optional
9
+ */
10
+ export interface DescribeConsumerResult {
11
+ self?: Entry;
12
+ consumer?: Consumer;
13
+ partitions?: PartitionInfo[];
14
+ }
15
+
16
+ /** Partition info types differs for consumer and topic, although they are very similar */
17
+ export interface PartitionInfo {
18
+ /** int64 */
19
+ partition_id?: string;
20
+
21
+ /** Is partition open for write. */
22
+ active?: boolean;
23
+
24
+ /**
25
+ * int64
26
+ *
27
+ * Ids of partitions which was formed when this partition was split or merged.
28
+ */
29
+ child_partition_ids?: string[];
30
+
31
+ /**
32
+ * int64
33
+ *
34
+ * Ids of partitions from which this partition was formed by split or merge.
35
+ */
36
+ parent_partition_ids?: string[];
37
+
38
+ /** Stats for partition, filled only when include_stats in request is true. */
39
+ partition_stats?: PartitionStats;
40
+
41
+ /** Stats for consumer of this partition, filled only when include_stats in request is true. */
42
+ partition_consumer_stats?: PartitionConsumerStats;
43
+ }
44
+
45
+ interface PartitionConsumerStats {
46
+ /**
47
+ * int64
48
+ *
49
+ * Last read offset from this partition.
50
+ */
51
+ last_read_offset?: string;
52
+
53
+ /**
54
+ * int64
55
+ *
56
+ * Committed offset for this partition.
57
+ */
58
+ committed_offset?: string;
59
+
60
+ /** Reading this partition read session identifier. */
61
+ read_session_id?: string;
62
+
63
+ /**
64
+ * google.protobuf.Timestamp
65
+ *
66
+ * Timestamp of providing this partition to this session by server.
67
+ */
68
+ partition_read_session_create_time?: string;
69
+
70
+ /**
71
+ * google.protobuf.Timestamp
72
+ *
73
+ * Timestamp of last read from this partition. */
74
+ last_read_time?: string;
75
+
76
+ /**
77
+ * google.protobuf.Duration
78
+ *
79
+ * Maximum of differences between timestamp of read and write timestamp for all messages, read during last minute.
80
+ */
81
+ max_read_time_lag?: string;
82
+
83
+ /**
84
+ * google.protobuf.Duration
85
+ *
86
+ * Maximum of differences between write timestamp and create timestamp for all messages, read during last minute.
87
+ */
88
+ max_write_time_lag?: string;
89
+
90
+ /** How much bytes were read during several windows statistics from this partiton. */
91
+ bytes_read?: MultipleWindowsStat;
92
+
93
+ /** Read session name, provided by client. */
94
+ reader_name?: string;
95
+
96
+ /** Host where read session connected. */
97
+ connection_node_id?: number;
98
+ }
99
+
100
+ export interface PartitionStats {
101
+ /** Partition contains messages with offsets in range [start, end). */
102
+ partition_offsets?: OffsetsRange;
103
+
104
+ /**
105
+ * int64
106
+ *
107
+ * Approximate size of partition.
108
+ */
109
+ store_size_bytes?: string;
110
+
111
+ /**
112
+ * google.protobuf.Timestamp
113
+ *
114
+ * Timestamp of last write.
115
+ */
116
+ last_write_time?: string;
117
+
118
+ /**
119
+ * google.protobuf.Duration
120
+ *
121
+ * Maximum of differences between write timestamp and create timestamp for all messages, written during last minute.
122
+ */
123
+ max_write_time_lag?: string;
124
+
125
+ /** How much bytes were written during several windows in this partition. */
126
+ bytes_written?: MultipleWindowsStat;
127
+
128
+ /** Host where tablet for this partition works. Useful for debugging purposes. */
129
+ partition_node_id?: number;
130
+ }
131
+
132
+ interface OffsetsRange {
133
+ /** int64 */
134
+ start?: string;
135
+ /** int64 */
136
+ end?: string;
137
+ }
138
+
139
+ export interface Consumer {
140
+ /** Must have valid not empty name as a key. */
141
+ name?: string;
142
+
143
+ /** Consumer may be marked as 'important'. It means messages for this consumer will never expire due to retention. */
144
+ important?: boolean;
145
+
146
+ /**
147
+ * google.protobuf.Timestamp
148
+ *
149
+ * All messages with smaller server written_at timestamp will be skipped.
150
+ */
151
+ read_from?: string;
152
+
153
+ /**
154
+ * List of supported codecs by this consumer.
155
+ *
156
+ * supported_codecs on topic must be contained inside this list.
157
+ */
158
+ supported_codecs?: SupportedCodecs;
159
+
160
+ /** Attributes of consumer */
161
+ attributes?: Record<string, string>;
162
+
163
+ /** Filled only when requested statistics in Describe*Request. */
164
+ consumer_stats?: ConsumerStats;
165
+ }
166
+
167
+ interface ConsumerStats {
168
+ /**
169
+ * google.protobuf.Timestamp
170
+ *
171
+ * Minimal timestamp of last read from partitions.
172
+ */
173
+ min_partitions_last_read_time?: string;
174
+
175
+ /**
176
+ * google.protobuf.Duration
177
+ *
178
+ * Maximum of differences between timestamp of read and write timestamp for all messages, read during last minute.
179
+ */
180
+ max_read_time_lag?: string;
181
+
182
+ /**
183
+ * google.protobuf.Duration
184
+ *
185
+ * Maximum of differences between write timestamp and create timestamp for all messages, read during last minute.
186
+ */
187
+ max_write_time_lag?: string;
188
+
189
+ /** Bytes read stastics. */
190
+ bytes_read?: MultipleWindowsStat;
191
+ }
192
+
193
+ export interface MultipleWindowsStat {
194
+ /** int64 */
195
+ per_minute?: string;
196
+ /** int64 */
197
+ per_hour?: string;
198
+ /** int64 */
199
+ per_day?: string;
200
+ }
201
+
202
+ export interface SupportedCodecs {
203
+ /** List of supported codecs. */
204
+ codecs?: number[];
205
+ }
206
+
207
+ export interface Entry {
208
+ /** For consumer will be topic-name/consumer-name */
209
+ name?: string;
210
+
211
+ owner?: string;
212
+ type?: Type;
213
+ effective_permissions?: Permissions[];
214
+ permissions?: Permissions[];
215
+
216
+ /**
217
+ * uint64
218
+ *
219
+ * Size of entry in bytes. Currently filled for:
220
+ * - TABLE;
221
+ * - DATABASE.
222
+ *
223
+ * Empty (zero) in other cases.
224
+ */
225
+ size_bytes?: string;
226
+
227
+ /** Virtual timestamp when the object was created */
228
+ created_at?: VirtualTimestamp;
229
+ }
230
+
231
+ interface Permissions {
232
+ subject?: string;
233
+ permission_names?: string[];
234
+ }
235
+
236
+ interface VirtualTimestamp {
237
+ /** uint64 */
238
+ plan_step?: string;
239
+ /** uint64 */
240
+ tx_id?: string;
241
+ }
242
+
243
+ enum Type {
244
+ TYPE_UNSPECIFIED = 'TYPE_UNSPECIFIED',
245
+ DIRECTORY = 'DIRECTORY',
246
+ TABLE = 'TABLE',
247
+ PERS_QUEUE_GROUP = 'PERS_QUEUE_GROUP',
248
+ DATABASE = 'DATABASE',
249
+ RTMR_VOLUME = 'RTMR_VOLUME',
250
+ BLOCK_STORE_VOLUME = 'BLOCK_STORE_VOLUME',
251
+ COORDINATION_NODE = 'COORDINATION_NODE',
252
+ COLUMN_STORE = 'COLUMN_STORE ',
253
+ COLUMN_TABLE = 'COLUMN_TABLE ',
254
+ SEQUENCE = 'SEQUENCE ',
255
+ REPLICATION = 'REPLICATION ',
256
+ TOPIC = 'TOPIC ',
257
+ }