ydb-embedded-ui 4.16.2 → 4.17.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 (57) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/components/CircularProgressBar/CircularProgressBar.scss +42 -0
  3. package/dist/components/CircularProgressBar/CircularProgressBar.tsx +59 -0
  4. package/dist/components/DiagnosticCard/DiagnosticCard.scss +20 -3
  5. package/dist/components/DiagnosticCard/DiagnosticCard.tsx +5 -6
  6. package/dist/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.scss +1 -5
  7. package/dist/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.tsx +40 -17
  8. package/dist/containers/Tenant/Diagnostics/{Healthcheck → OldHealthcheck}/Details/Details.tsx +3 -3
  9. package/dist/containers/Tenant/Diagnostics/{Healthcheck → OldHealthcheck}/Healthcheck.scss +27 -14
  10. package/dist/containers/Tenant/Diagnostics/{Healthcheck → OldHealthcheck}/Healthcheck.tsx +6 -6
  11. package/dist/containers/Tenant/Diagnostics/{Healthcheck → OldHealthcheck}/Preview/Preview.tsx +15 -16
  12. package/dist/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/Healthcheck.scss +108 -0
  13. package/dist/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/HealthcheckDetails.tsx +45 -0
  14. package/dist/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/HealthcheckPreview.tsx +83 -0
  15. package/dist/containers/Tenant/Diagnostics/{Healthcheck → TenantOverview/Healthcheck}/IssuesViewer/IssueTree.scss +1 -3
  16. package/dist/containers/Tenant/Diagnostics/{Healthcheck → TenantOverview/Healthcheck}/IssuesViewer/IssueTree.tsx +1 -1
  17. package/dist/containers/Tenant/Diagnostics/{Healthcheck → TenantOverview/Healthcheck}/IssuesViewer/IssueTreeItem/IssueTreeItem.tsx +1 -1
  18. package/dist/containers/Tenant/Diagnostics/{Healthcheck → TenantOverview/Healthcheck}/i18n/en.json +2 -1
  19. package/dist/containers/Tenant/Diagnostics/{Healthcheck → TenantOverview/Healthcheck}/i18n/index.ts +1 -1
  20. package/dist/containers/Tenant/Diagnostics/{Healthcheck → TenantOverview/Healthcheck}/i18n/ru.json +2 -1
  21. package/dist/containers/Tenant/Diagnostics/TenantOverview/MetricsCards/MetricCard/MetricCard.scss +52 -0
  22. package/dist/containers/Tenant/Diagnostics/TenantOverview/MetricsCards/MetricCard/MetricCard.tsx +48 -0
  23. package/dist/containers/Tenant/Diagnostics/TenantOverview/MetricsCards/MetricsCards.scss +12 -0
  24. package/dist/containers/Tenant/Diagnostics/TenantOverview/MetricsCards/MetricsCards.tsx +134 -0
  25. package/dist/containers/Tenant/Diagnostics/TenantOverview/OldTenantOverview.tsx +155 -0
  26. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.scss +3 -5
  27. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.tsx +76 -86
  28. package/dist/containers/Tenant/Diagnostics/TenantOverview/i18n/en.json +3 -1
  29. package/dist/containers/Tenant/Diagnostics/TenantOverview/i18n/ru.json +3 -1
  30. package/dist/containers/Tenant/Diagnostics/TenantOverview/useHealthcheck.ts +53 -0
  31. package/dist/containers/Tenant/TenantPages.tsx +1 -0
  32. package/dist/containers/UserSettings/i18n/en.json +4 -1
  33. package/dist/containers/UserSettings/i18n/ru.json +4 -1
  34. package/dist/containers/UserSettings/settings.ts +7 -0
  35. package/dist/services/api.ts +6 -4
  36. package/dist/store/reducers/healthcheckInfo.ts +20 -12
  37. package/dist/store/reducers/settings/settings.ts +5 -0
  38. package/dist/store/reducers/tenant/constants.ts +7 -0
  39. package/dist/store/reducers/tenant/tenant.ts +15 -0
  40. package/dist/store/reducers/tenant/types.ts +5 -0
  41. package/dist/store/reducers/tenants/contants.ts +6 -0
  42. package/dist/store/reducers/tenants/types.ts +4 -0
  43. package/dist/store/reducers/tenants/utils.ts +114 -7
  44. package/dist/store/state-url-mapping.js +3 -0
  45. package/dist/styles/constants.scss +2 -0
  46. package/dist/types/api/tenant.ts +3 -0
  47. package/dist/utils/constants.ts +1 -0
  48. package/dist/utils/formatCPU/formatCPU.ts +20 -0
  49. package/dist/utils/formatCPU/i18n/en.json +3 -0
  50. package/dist/utils/formatCPU/i18n/index.ts +11 -0
  51. package/dist/utils/formatCPU/i18n/ru.json +3 -0
  52. package/package.json +1 -1
  53. /package/dist/containers/Tenant/Diagnostics/{Healthcheck → OldHealthcheck}/Details/index.ts +0 -0
  54. /package/dist/containers/Tenant/Diagnostics/{Healthcheck → OldHealthcheck}/Preview/index.ts +0 -0
  55. /package/dist/containers/Tenant/Diagnostics/{Healthcheck → OldHealthcheck}/index.ts +0 -0
  56. /package/dist/containers/Tenant/Diagnostics/{Healthcheck → TenantOverview/Healthcheck}/IssuesViewer/IssueTreeItem/IssueTreeItem.scss +0 -0
  57. /package/dist/containers/Tenant/Diagnostics/{Healthcheck → TenantOverview/Healthcheck}/IssuesViewer/IssueTreeItem/index.ts +0 -0
@@ -1,5 +1,8 @@
1
1
  import type {TTenant} from '../../../types/api/tenant';
2
+ import {formatBytes} from '../../../utils/bytesParsers';
3
+ import {formatCPU} from '../../../utils/formatCPU/formatCPU';
2
4
  import {isNumeric} from '../../../utils/utils';
5
+ import {METRIC_STATUS} from './contants';
3
6
 
4
7
  const getControlPlaneValue = (tenant: TTenant) => {
5
8
  const parts = tenant.Name?.split('/');
@@ -18,21 +21,40 @@ const getTenantBackend = (tenant: TTenant) => {
18
21
  return node.Host ? `${node.Host}${address ? address : ''}` : undefined;
19
22
  };
20
23
 
21
- const calculateTenantMetrics = (tenant: TTenant) => {
22
- const {CoresUsed, MemoryUsed, StorageAllocatedSize, Metrics = {}} = tenant;
24
+ export const calculateTenantMetrics = (tenant?: TTenant) => {
25
+ const {
26
+ CoresUsed,
27
+ MemoryUsed,
28
+ StorageAllocatedSize,
29
+ CoresLimit,
30
+ MemoryLimit,
31
+ StorageLimit,
32
+ Metrics = {},
33
+ } = tenant || {};
23
34
 
24
35
  const cpuFromCores = isNumeric(CoresUsed) ? Number(CoresUsed) * 1_000_000 : undefined;
25
36
  const cpuFromMetrics = isNumeric(Metrics.CPU) ? Number(Metrics.CPU) : undefined;
26
37
 
27
- const cpu = cpuFromCores ?? cpuFromMetrics ?? 0;
38
+ const cpu = cpuFromCores ?? cpuFromMetrics ?? undefined;
28
39
 
29
40
  const rawMemory = MemoryUsed ?? Metrics.Memory;
30
- const rawStorage = StorageAllocatedSize ?? Metrics.Storage;
31
41
 
32
- const memory = isNumeric(rawMemory) ? Number(rawMemory) : 0;
33
- const storage = isNumeric(rawStorage) ? Number(rawStorage) : 0;
42
+ const memory = isNumeric(rawMemory) ? Number(rawMemory) : undefined;
34
43
 
35
- return {cpu, memory, storage};
44
+ // Blob storage - actual database size
45
+ const storage = isNumeric(StorageAllocatedSize) ? Number(StorageAllocatedSize) : undefined;
46
+ const cpuLimit = isNumeric(CoresLimit) ? Number(CoresLimit) : undefined;
47
+ const memoryLimit = isNumeric(MemoryLimit) ? Number(MemoryLimit) : undefined;
48
+ const storageLimit = isNumeric(StorageLimit) ? Number(StorageLimit) : undefined;
49
+
50
+ return {
51
+ cpu,
52
+ memory,
53
+ storage,
54
+ cpuLimit,
55
+ memoryLimit,
56
+ storageLimit,
57
+ };
36
58
  };
37
59
 
38
60
  const calculateTenantEntities = (tenant: TTenant) => {
@@ -66,3 +88,88 @@ export const prepareTenants = (tenants: TTenant[], useNodeAsBackend: boolean) =>
66
88
  };
67
89
  });
68
90
  };
91
+
92
+ export const calculateUsage = (valueUsed?: number, valueLimit?: number): number | undefined => {
93
+ if (valueUsed && valueLimit) {
94
+ return (valueUsed * 100) / valueLimit;
95
+ }
96
+
97
+ return undefined;
98
+ };
99
+
100
+ export const formatUsage = (usage?: number) => {
101
+ if (usage) {
102
+ return `${usage.toFixed()}%`;
103
+ }
104
+
105
+ return undefined;
106
+ };
107
+
108
+ export const cpuUsageToStatus = (usage?: number) => {
109
+ if (!usage) {
110
+ return METRIC_STATUS.Unspecified;
111
+ }
112
+
113
+ if (usage > 70) {
114
+ return METRIC_STATUS.Danger;
115
+ }
116
+ if (usage > 60) {
117
+ return METRIC_STATUS.Warning;
118
+ }
119
+
120
+ return METRIC_STATUS.Good;
121
+ };
122
+ export const storageUsageToStatus = (usage?: number) => {
123
+ if (!usage) {
124
+ return METRIC_STATUS.Unspecified;
125
+ }
126
+
127
+ if (usage > 85) {
128
+ return METRIC_STATUS.Danger;
129
+ }
130
+ if (usage > 75) {
131
+ return METRIC_STATUS.Warning;
132
+ }
133
+
134
+ return METRIC_STATUS.Good;
135
+ };
136
+
137
+ export const memoryUsageToStatus = (usage?: number) => {
138
+ if (!usage) {
139
+ return METRIC_STATUS.Unspecified;
140
+ }
141
+
142
+ if (usage > 70) {
143
+ return METRIC_STATUS.Danger;
144
+ }
145
+ if (usage > 60) {
146
+ return METRIC_STATUS.Warning;
147
+ }
148
+
149
+ return METRIC_STATUS.Good;
150
+ };
151
+
152
+ export const formatTenantMetrics = ({
153
+ cpu,
154
+ storage,
155
+ memory,
156
+ }: {
157
+ cpu?: number;
158
+ storage?: number;
159
+ memory?: number;
160
+ }) => ({
161
+ cpu: formatCPU(cpu),
162
+ storage: formatBytes({value: storage, significantDigits: 2}) || undefined,
163
+ memory: formatBytes({value: memory, significantDigits: 2}) || undefined,
164
+ });
165
+
166
+ export const normalizeProgress = (progress: number) => {
167
+ if (progress >= 100) {
168
+ return 100;
169
+ }
170
+ if (progress <= 0) {
171
+ return 0;
172
+ }
173
+
174
+ return progress;
175
+ };
@@ -54,6 +54,9 @@ const paramSetup = {
54
54
  summaryTab: {
55
55
  stateKey: 'tenant.summaryTab',
56
56
  },
57
+ metricsTab: {
58
+ stateKey: 'tenant.metricsTab',
59
+ },
57
60
  shardsMode: {
58
61
  stateKey: 'shardsWorkload.filters.mode',
59
62
  },
@@ -1,3 +1,5 @@
1
1
  :root {
2
2
  --tenant-object-info-max-value-width: 300px;
3
+
4
+ --diagnostics-section-title-margin: 20px;
3
5
  }
@@ -57,6 +57,9 @@ export interface TTenant {
57
57
 
58
58
  MonitoringEndpoint?: string; // additional
59
59
  ControlPlane?: ControlPlane; // additional
60
+
61
+ CoresLimit?: string; // TODO: check correctness in backend protos when fully supported
62
+ StorageLimit?: string; // TODO: check correctness in backend protos when fully supported
60
63
  }
61
64
 
62
65
  interface THiveDomainStatsStateCount {
@@ -88,6 +88,7 @@ export const LANGUAGE_KEY = 'language';
88
88
  export const INVERTED_DISKS_KEY = 'invertedDisks';
89
89
  export const USE_NODES_ENDPOINT_IN_DIAGNOSTICS_KEY = 'useNodesEndpointInDiagnostics';
90
90
  export const ENABLE_ADDITIONAL_QUERY_MODES = 'enableAdditionalQueryModes';
91
+ export const ENABLE_NEW_TENANT_DIAGNOSTICS_DESIGN = 'enableNewTenantDiagnosticsDesign';
91
92
  export const SAVED_QUERIES_KEY = 'saved_queries';
92
93
  export const ASIDE_HEADER_COMPACT_KEY = 'asideHeaderCompact';
93
94
  export const QUERIES_HISTORY_KEY = 'queries_history';
@@ -0,0 +1,20 @@
1
+ import {configuredNumeral} from '../numeral';
2
+ import i18n from './i18n';
3
+
4
+ export const formatCPU = (value?: number) => {
5
+ if (value === undefined) {
6
+ return undefined;
7
+ }
8
+
9
+ const rawCores = value / 1000000;
10
+ let cores = rawCores.toPrecision(3);
11
+ if (rawCores >= 1000) {
12
+ cores = rawCores.toFixed();
13
+ }
14
+ if (rawCores < 0.001) {
15
+ cores = '0';
16
+ }
17
+ const localizedCores = configuredNumeral(Number(cores)).format('0.[000]');
18
+
19
+ return `${localizedCores} ${i18n('cores', {count: cores})}`;
20
+ };
@@ -0,0 +1,3 @@
1
+ {
2
+ "cores": ["core", "cores", "cores", "cores"]
3
+ }
@@ -0,0 +1,11 @@
1
+ import {i18n, Lang} from '../../i18n';
2
+
3
+ import en from './en.json';
4
+ import ru from './ru.json';
5
+
6
+ const COMPONENT = 'ydb-format-cpu';
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,3 @@
1
+ {
2
+ "cores": ["ядро", "ядра", "ядер", "ядер"]
3
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ydb-embedded-ui",
3
- "version": "4.16.2",
3
+ "version": "4.17.0",
4
4
  "files": [
5
5
  "dist"
6
6
  ],