ydb-embedded-ui 4.31.2 → 4.33.0
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/components/CellWithPopover/CellWithPopover.scss +7 -0
- package/dist/components/Loader/Loader.tsx +3 -2
- package/dist/components/MetricChart/MetricChart.tsx +45 -4
- package/dist/components/MetricChart/index.ts +1 -1
- package/dist/components/MetricChart/types.ts +3 -0
- package/dist/components/VirtualTable/TableHead.tsx +127 -26
- package/dist/components/VirtualTable/TableRow.tsx +15 -2
- package/dist/components/VirtualTable/VirtualTable.scss +62 -60
- package/dist/components/VirtualTable/VirtualTable.tsx +11 -1
- package/dist/components/VirtualTable/types.ts +1 -0
- package/dist/components/VirtualTable/useIntersectionObserver.ts +1 -0
- package/dist/containers/Node/Node.tsx +9 -7
- package/dist/containers/Nodes/NodesWrapper.tsx +1 -0
- package/dist/containers/Nodes/VirtualNodes.tsx +11 -5
- package/dist/containers/Nodes/getNodesColumns.tsx +1 -0
- package/dist/containers/Tenant/Diagnostics/Diagnostics.scss +2 -1
- package/dist/containers/Tenant/Diagnostics/Diagnostics.tsx +11 -6
- package/dist/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo.ts +2 -2
- package/dist/containers/Tenant/Diagnostics/TenantOverview/DefaultOverviewContent/DefaultOverviewContent.tsx +6 -0
- package/dist/containers/Tenant/Diagnostics/TenantOverview/{DefaultDashboard.tsx → DefaultOverviewContent/defaultDashboardConfig.ts} +3 -7
- package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TenantCpu.tsx +3 -2
- package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/{CpuDashboard.tsx → cpuDashboardConfig.ts} +2 -6
- package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantDashboard/TenantDashboard.tsx +27 -9
- package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantMemory/TenantMemory.tsx +3 -2
- package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantMemory/{MemoryDashboard.tsx → memoryDashboardConfig.ts} +2 -6
- package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.tsx +3 -5
- package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverviewTableLayout.tsx +1 -3
- package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TenantStorage.tsx +6 -6
- package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/{StorageDashboard.tsx → storageDashboardConfig.ts} +2 -6
- package/dist/containers/Tenant/Diagnostics/TenantOverview/utils.ts +3 -0
- package/dist/containers/UserSettings/i18n/en.json +2 -5
- package/dist/containers/UserSettings/i18n/ru.json +2 -5
- package/dist/containers/UserSettings/settings.ts +1 -12
- package/dist/services/settings.ts +0 -2
- package/dist/utils/constants.ts +0 -2
- package/dist/utils/hooks/useTableResize.ts +53 -0
- package/package.json +2 -1
@@ -1,4 +1,4 @@
|
|
1
|
-
import
|
1
|
+
import {useEffect, useMemo, useRef} from 'react';
|
2
2
|
import {useLocation, useRouteMatch} from 'react-router';
|
3
3
|
import cn from 'bem-cn-lite';
|
4
4
|
import {useDispatch} from 'react-redux';
|
@@ -8,7 +8,7 @@ import {Link} from 'react-router-dom';
|
|
8
8
|
|
9
9
|
import {TABLETS, STORAGE, NODE_PAGES, OVERVIEW, STRUCTURE} from './NodePages';
|
10
10
|
import {Tablets} from '../Tablets';
|
11
|
-
import {
|
11
|
+
import {StorageWrapper} from '../Storage/StorageWrapper';
|
12
12
|
import NodeStructure from './NodeStructure/NodeStructure';
|
13
13
|
import {Loader} from '../../components/Loader';
|
14
14
|
import {BasicNodeViewer} from '../../components/BasicNodeViewer';
|
@@ -38,6 +38,8 @@ interface NodeProps {
|
|
38
38
|
}
|
39
39
|
|
40
40
|
function Node(props: NodeProps) {
|
41
|
+
const container = useRef<HTMLDivElement>(null);
|
42
|
+
|
41
43
|
const dispatch = useDispatch();
|
42
44
|
const location = useLocation();
|
43
45
|
|
@@ -50,7 +52,7 @@ function Node(props: NodeProps) {
|
|
50
52
|
const {id: nodeId, activeTab} = match.params;
|
51
53
|
const {tenantName: tenantNameFromQuery} = parseQuery(location);
|
52
54
|
|
53
|
-
const {activeTabVerified, nodeTabs} =
|
55
|
+
const {activeTabVerified, nodeTabs} = useMemo(() => {
|
54
56
|
const hasStorage = node?.Roles?.find((el) => el === STORAGE_ROLE);
|
55
57
|
|
56
58
|
let actualActiveTab = activeTab;
|
@@ -69,7 +71,7 @@ function Node(props: NodeProps) {
|
|
69
71
|
return {activeTabVerified: actualActiveTab, nodeTabs: actualNodeTabs};
|
70
72
|
}, [activeTab, node]);
|
71
73
|
|
72
|
-
|
74
|
+
useEffect(() => {
|
73
75
|
const tenantName = node?.Tenants?.[0] || tenantNameFromQuery?.toString();
|
74
76
|
|
75
77
|
dispatch(
|
@@ -81,7 +83,7 @@ function Node(props: NodeProps) {
|
|
81
83
|
);
|
82
84
|
}, [dispatch, node, nodeId, tenantNameFromQuery]);
|
83
85
|
|
84
|
-
|
86
|
+
useEffect(() => {
|
85
87
|
const fetchData = () => dispatch(getNodeInfo(nodeId));
|
86
88
|
fetchData();
|
87
89
|
autofetcher.start();
|
@@ -119,7 +121,7 @@ function Node(props: NodeProps) {
|
|
119
121
|
case STORAGE: {
|
120
122
|
return (
|
121
123
|
<div className={b('storage')}>
|
122
|
-
<
|
124
|
+
<StorageWrapper nodeId={nodeId} parentContainer={container.current} />
|
123
125
|
</div>
|
124
126
|
);
|
125
127
|
}
|
@@ -146,7 +148,7 @@ function Node(props: NodeProps) {
|
|
146
148
|
} else {
|
147
149
|
if (node) {
|
148
150
|
return (
|
149
|
-
<div className={b(null, props.className)}>
|
151
|
+
<div className={b(null, props.className)} ref={container}>
|
150
152
|
<BasicNodeViewer
|
151
153
|
node={node}
|
152
154
|
additionalNodesProps={props.additionalNodesProps}
|
@@ -13,6 +13,7 @@ import {
|
|
13
13
|
isSortableNodesProperty,
|
14
14
|
isUnavailableNode,
|
15
15
|
} from '../../utils/nodes';
|
16
|
+
import {updateColumnsWidth, useTableResize} from '../../utils/hooks/useTableResize';
|
16
17
|
|
17
18
|
import {Search} from '../../components/Search';
|
18
19
|
import {ProblemFilter} from '../../components/ProblemFilter';
|
@@ -38,26 +39,30 @@ import './Nodes.scss';
|
|
38
39
|
const b = cn('ydb-nodes');
|
39
40
|
|
40
41
|
interface NodesProps {
|
42
|
+
path?: string;
|
41
43
|
parentContainer?: Element | null;
|
42
44
|
additionalNodesProps?: AdditionalNodesProps;
|
43
45
|
}
|
44
46
|
|
45
|
-
export const VirtualNodes = ({parentContainer, additionalNodesProps}: NodesProps) => {
|
47
|
+
export const VirtualNodes = ({path, parentContainer, additionalNodesProps}: NodesProps) => {
|
46
48
|
const [searchValue, setSearchValue] = useState('');
|
47
49
|
const [problemFilter, setProblemFilter] = useState<ProblemFilterValue>(ProblemFilterValues.ALL);
|
48
50
|
const [uptimeFilter, setUptimeFilter] = useState<NodesUptimeFilterValues>(
|
49
51
|
NodesUptimeFilterValues.All,
|
50
52
|
);
|
51
53
|
|
54
|
+
const [tableColumnsWidthSetup, setTableColumnsWidth] = useTableResize('nodesTableColumnsWidth');
|
55
|
+
|
52
56
|
const filters = useMemo(() => {
|
53
|
-
return [searchValue, problemFilter, uptimeFilter];
|
54
|
-
}, [searchValue, problemFilter, uptimeFilter]);
|
57
|
+
return [path, searchValue, problemFilter, uptimeFilter];
|
58
|
+
}, [path, searchValue, problemFilter, uptimeFilter]);
|
55
59
|
|
56
60
|
const fetchData = useCallback<FetchData<NodesPreparedEntity>>(
|
57
61
|
async (limit, offset, {sortOrder, columnId} = {}) => {
|
58
62
|
return await getNodes({
|
59
63
|
limit,
|
60
64
|
offset,
|
65
|
+
path,
|
61
66
|
filter: searchValue,
|
62
67
|
problems_only: getProblemParamValue(problemFilter),
|
63
68
|
uptime: getUptimeParamValue(uptimeFilter),
|
@@ -65,7 +70,7 @@ export const VirtualNodes = ({parentContainer, additionalNodesProps}: NodesProps
|
|
65
70
|
sortValue: columnId as NodesSortValue,
|
66
71
|
});
|
67
72
|
},
|
68
|
-
[problemFilter, searchValue, uptimeFilter],
|
73
|
+
[path, problemFilter, searchValue, uptimeFilter],
|
69
74
|
);
|
70
75
|
|
71
76
|
const getRowClassName: GetRowClassName<NodesPreparedEntity> = (row) => {
|
@@ -116,7 +121,7 @@ export const VirtualNodes = ({parentContainer, additionalNodesProps}: NodesProps
|
|
116
121
|
getNodeRef: additionalNodesProps?.getNodeRef,
|
117
122
|
});
|
118
123
|
|
119
|
-
const columns = rawColumns.map((column) => {
|
124
|
+
const columns = updateColumnsWidth(rawColumns, tableColumnsWidthSetup).map((column) => {
|
120
125
|
return {...column, sortable: isSortableNodesProperty(column.name)};
|
121
126
|
});
|
122
127
|
|
@@ -131,6 +136,7 @@ export const VirtualNodes = ({parentContainer, additionalNodesProps}: NodesProps
|
|
131
136
|
renderEmptyDataMessage={renderEmptyDataMessage}
|
132
137
|
dependencyArray={filters}
|
133
138
|
getRowClassName={getRowClassName}
|
139
|
+
onColumnsResize={setTableColumnsWidth}
|
134
140
|
/>
|
135
141
|
);
|
136
142
|
};
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import {useMemo} from 'react';
|
1
|
+
import {useMemo, useRef} from 'react';
|
2
2
|
import qs from 'qs';
|
3
3
|
import cn from 'bem-cn-lite';
|
4
4
|
import {Link} from 'react-router-dom';
|
@@ -20,8 +20,8 @@ import {TENANT_DIAGNOSTICS_TABS_IDS} from '../../../store/reducers/tenant/consta
|
|
20
20
|
import {Loader} from '../../../components/Loader';
|
21
21
|
|
22
22
|
import {Heatmap} from '../../Heatmap';
|
23
|
-
import {
|
24
|
-
import {
|
23
|
+
import {NodesWrapper} from '../../Nodes/NodesWrapper';
|
24
|
+
import {StorageWrapper} from '../../Storage/StorageWrapper';
|
25
25
|
import {Tablets} from '../../Tablets';
|
26
26
|
|
27
27
|
import Describe from './Describe/Describe';
|
@@ -49,6 +49,8 @@ interface DiagnosticsProps {
|
|
49
49
|
const b = cn('kv-tenant-diagnostics');
|
50
50
|
|
51
51
|
function Diagnostics(props: DiagnosticsProps) {
|
52
|
+
const container = useRef<HTMLDivElement>(null);
|
53
|
+
|
52
54
|
const dispatch = useDispatch();
|
53
55
|
const {currentSchemaPath, autorefresh, wasLoaded} = useSelector((state: any) => state.schema);
|
54
56
|
const {diagnosticsTab = TENANT_DIAGNOSTICS_TABS_IDS.overview} = useTypedSelector(
|
@@ -121,9 +123,10 @@ function Diagnostics(props: DiagnosticsProps) {
|
|
121
123
|
}
|
122
124
|
case TENANT_DIAGNOSTICS_TABS_IDS.nodes: {
|
123
125
|
return (
|
124
|
-
<
|
126
|
+
<NodesWrapper
|
125
127
|
path={currentSchemaPath}
|
126
128
|
additionalNodesProps={props.additionalNodesProps}
|
129
|
+
parentContainer={container.current}
|
127
130
|
/>
|
128
131
|
);
|
129
132
|
}
|
@@ -131,7 +134,9 @@ function Diagnostics(props: DiagnosticsProps) {
|
|
131
134
|
return <Tablets path={currentSchemaPath} />;
|
132
135
|
}
|
133
136
|
case TENANT_DIAGNOSTICS_TABS_IDS.storage: {
|
134
|
-
return
|
137
|
+
return (
|
138
|
+
<StorageWrapper tenant={tenantNameString} parentContainer={container.current} />
|
139
|
+
);
|
135
140
|
}
|
136
141
|
case TENANT_DIAGNOSTICS_TABS_IDS.network: {
|
137
142
|
return <Network path={tenantNameString} />;
|
@@ -196,7 +201,7 @@ function Diagnostics(props: DiagnosticsProps) {
|
|
196
201
|
}
|
197
202
|
|
198
203
|
return (
|
199
|
-
<div className={b()}>
|
204
|
+
<div className={b()} ref={container}>
|
200
205
|
{renderTabs()}
|
201
206
|
<div className={b('page-wrapper')}>{renderTabContent()}</div>
|
202
207
|
</div>
|
@@ -100,14 +100,14 @@ const prepareTableGeneralInfo = (PartitionConfig: TPartitionConfig, TTLSettings?
|
|
100
100
|
{label: 'Partitioning by load', value: partitioningByLoad},
|
101
101
|
{
|
102
102
|
label: 'Min number of partitions',
|
103
|
-
value: PartitioningPolicy.MinPartitionsCount || 0,
|
103
|
+
value: formatNumber(PartitioningPolicy.MinPartitionsCount || 0),
|
104
104
|
},
|
105
105
|
);
|
106
106
|
|
107
107
|
if (PartitioningPolicy.MaxPartitionsCount) {
|
108
108
|
generalTableInfo.push({
|
109
109
|
label: 'Max number of partitions',
|
110
|
-
value: PartitioningPolicy.MaxPartitionsCount
|
110
|
+
value: formatNumber(PartitioningPolicy.MaxPartitionsCount),
|
111
111
|
});
|
112
112
|
}
|
113
113
|
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import
|
2
|
-
import i18n from '
|
1
|
+
import type {ChartConfig} from '../TenantDashboard/TenantDashboard';
|
2
|
+
import i18n from '../i18n';
|
3
3
|
|
4
|
-
const defaultDashboardConfig: ChartConfig[] = [
|
4
|
+
export const defaultDashboardConfig: ChartConfig[] = [
|
5
5
|
{
|
6
6
|
title: i18n('charts.queries-per-second'),
|
7
7
|
metrics: [
|
@@ -44,7 +44,3 @@ const defaultDashboardConfig: ChartConfig[] = [
|
|
44
44
|
},
|
45
45
|
},
|
46
46
|
];
|
47
|
-
|
48
|
-
export const DefaultDashboard = () => {
|
49
|
-
return <TenantDashboard charts={defaultDashboardConfig} />;
|
50
|
-
};
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import type {AdditionalNodesProps} from '../../../../../types/additionalProps';
|
2
|
-
import {
|
2
|
+
import {TenantDashboard} from '../TenantDashboard/TenantDashboard';
|
3
|
+
import {cpuDashboardConfig} from './cpuDashboardConfig';
|
3
4
|
import {TopNodesByLoad} from './TopNodesByLoad';
|
4
5
|
import {TopNodesByCpu} from './TopNodesByCpu';
|
5
6
|
import {TopShards} from './TopShards';
|
@@ -13,7 +14,7 @@ interface TenantCpuProps {
|
|
13
14
|
export function TenantCpu({path, additionalNodesProps}: TenantCpuProps) {
|
14
15
|
return (
|
15
16
|
<>
|
16
|
-
<
|
17
|
+
<TenantDashboard charts={cpuDashboardConfig} />
|
17
18
|
<TopNodesByLoad path={path} additionalNodesProps={additionalNodesProps} />
|
18
19
|
<TopNodesByCpu path={path} additionalNodesProps={additionalNodesProps} />
|
19
20
|
<TopShards path={path} />
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import
|
1
|
+
import type {ChartConfig} from '../TenantDashboard/TenantDashboard';
|
2
2
|
import i18n from '../i18n';
|
3
3
|
|
4
|
-
const cpuDashboardConfig: ChartConfig[] = [
|
4
|
+
export const cpuDashboardConfig: ChartConfig[] = [
|
5
5
|
{
|
6
6
|
title: i18n('charts.cpu-usage'),
|
7
7
|
metrics: [
|
@@ -12,7 +12,3 @@ const cpuDashboardConfig: ChartConfig[] = [
|
|
12
12
|
],
|
13
13
|
},
|
14
14
|
];
|
15
|
-
|
16
|
-
export const CpuDashboard = () => {
|
17
|
-
return <TenantDashboard charts={cpuDashboardConfig} />;
|
18
|
-
};
|
package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantDashboard/TenantDashboard.tsx
CHANGED
@@ -1,14 +1,15 @@
|
|
1
|
+
import {useState} from 'react';
|
1
2
|
import {StringParam, useQueryParam} from 'use-query-params';
|
2
3
|
|
3
4
|
import {cn} from '../../../../../utils/cn';
|
4
5
|
import type {TimeFrame} from '../../../../../utils/timeframes';
|
5
|
-
import {
|
6
|
-
import {DISPLAY_CHARTS_IN_DB_DIAGNOSTICS_KEY} from '../../../../../utils/constants';
|
6
|
+
import {useTypedSelector} from '../../../../../utils/hooks';
|
7
7
|
import {TimeFrameSelector} from '../../../../../components/TimeFrameSelector/TimeFrameSelector';
|
8
8
|
import {
|
9
9
|
type ChartOptions,
|
10
10
|
MetricChart,
|
11
11
|
type MetricDescription,
|
12
|
+
type ChartDataStatus,
|
12
13
|
} from '../../../../../components/MetricChart';
|
13
14
|
|
14
15
|
import './TenantDashboard.scss';
|
@@ -29,15 +30,29 @@ interface TenantDashboardProps {
|
|
29
30
|
}
|
30
31
|
|
31
32
|
export const TenantDashboard = ({charts}: TenantDashboardProps) => {
|
33
|
+
const [isDashboardHidden, setIsDashboardHidden] = useState<boolean>(true);
|
34
|
+
|
32
35
|
const [timeFrame = '1h', setTimeframe] = useQueryParam('timeframe', StringParam);
|
33
36
|
|
34
37
|
const {autorefresh} = useTypedSelector((state) => state.schema);
|
35
38
|
|
36
|
-
|
39
|
+
// Refetch data only if dashboard successfully loaded
|
40
|
+
const shouldRefresh = autorefresh && !isDashboardHidden;
|
37
41
|
|
38
|
-
|
39
|
-
|
40
|
-
|
42
|
+
/**
|
43
|
+
* Charts should be hidden, if they are not enabled:
|
44
|
+
* 1. GraphShard is not enabled
|
45
|
+
* 2. ydb version does not have /viewer/json/render endpoint (400, 404, CORS error, etc.)
|
46
|
+
*
|
47
|
+
* If at least one chart successfully loaded, dashboard should be shown
|
48
|
+
* @link https://github.com/ydb-platform/ydb-embedded-ui/issues/659
|
49
|
+
* @todo disable only for specific errors ('GraphShard is not enabled') after ydb-stable-24 is generally used
|
50
|
+
*/
|
51
|
+
const handleChartDataStatusChange = (chartStatus: ChartDataStatus) => {
|
52
|
+
if (chartStatus === 'success') {
|
53
|
+
setIsDashboardHidden(false);
|
54
|
+
}
|
55
|
+
};
|
41
56
|
|
42
57
|
// If there is only one chart, display it with full width
|
43
58
|
const chartWidth = charts.length === 1 ? CHART_WIDTH_FULL : CHART_WIDTH;
|
@@ -45,23 +60,26 @@ export const TenantDashboard = ({charts}: TenantDashboardProps) => {
|
|
45
60
|
|
46
61
|
const renderContent = () => {
|
47
62
|
return charts.map((chartConfig) => {
|
63
|
+
const chartId = chartConfig.metrics.map(({target}) => target).join('&');
|
48
64
|
return (
|
49
65
|
<MetricChart
|
50
|
-
key={
|
66
|
+
key={chartId}
|
51
67
|
title={chartConfig.title}
|
52
68
|
metrics={chartConfig.metrics}
|
53
69
|
timeFrame={timeFrame as TimeFrame}
|
54
70
|
chartOptions={chartConfig.options}
|
55
|
-
autorefresh={
|
71
|
+
autorefresh={shouldRefresh}
|
56
72
|
width={chartWidth}
|
57
73
|
height={chartHeight}
|
74
|
+
onChartDataStatusChange={handleChartDataStatusChange}
|
75
|
+
isChartVisible={!isDashboardHidden}
|
58
76
|
/>
|
59
77
|
);
|
60
78
|
});
|
61
79
|
};
|
62
80
|
|
63
81
|
return (
|
64
|
-
<div className={b(null)}>
|
82
|
+
<div className={b(null)} style={{display: isDashboardHidden ? 'none' : undefined}}>
|
65
83
|
<div className={b('controls')}>
|
66
84
|
<TimeFrameSelector value={timeFrame as TimeFrame} onChange={setTimeframe} />
|
67
85
|
</div>
|
@@ -1,4 +1,5 @@
|
|
1
|
-
import {
|
1
|
+
import {TenantDashboard} from '../TenantDashboard/TenantDashboard';
|
2
|
+
import {memoryDashboardConfig} from './memoryDashboardConfig';
|
2
3
|
import {TopNodesByMemory} from './TopNodesByMemory';
|
3
4
|
|
4
5
|
interface TenantMemoryProps {
|
@@ -8,7 +9,7 @@ interface TenantMemoryProps {
|
|
8
9
|
export function TenantMemory({path}: TenantMemoryProps) {
|
9
10
|
return (
|
10
11
|
<>
|
11
|
-
<
|
12
|
+
<TenantDashboard charts={memoryDashboardConfig} />
|
12
13
|
<TopNodesByMemory path={path} />
|
13
14
|
</>
|
14
15
|
);
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import
|
1
|
+
import type {ChartConfig} from '../TenantDashboard/TenantDashboard';
|
2
2
|
import i18n from '../i18n';
|
3
3
|
|
4
|
-
const memoryDashboardConfig: ChartConfig[] = [
|
4
|
+
export const memoryDashboardConfig: ChartConfig[] = [
|
5
5
|
{
|
6
6
|
title: i18n('charts.memory-usage'),
|
7
7
|
metrics: [
|
@@ -15,7 +15,3 @@ const memoryDashboardConfig: ChartConfig[] = [
|
|
15
15
|
},
|
16
16
|
},
|
17
17
|
];
|
18
|
-
|
19
|
-
export const MemoryDashboard = () => {
|
20
|
-
return <TenantDashboard charts={memoryDashboardConfig} />;
|
21
|
-
};
|
@@ -1,4 +1,3 @@
|
|
1
|
-
import cn from 'bem-cn-lite';
|
2
1
|
import {useCallback} from 'react';
|
3
2
|
import {useDispatch} from 'react-redux';
|
4
3
|
|
@@ -17,12 +16,11 @@ import {HealthcheckDetails} from './Healthcheck/HealthcheckDetails';
|
|
17
16
|
import {MetricsCards, type TenantMetrics} from './MetricsCards/MetricsCards';
|
18
17
|
import {TenantStorage} from './TenantStorage/TenantStorage';
|
19
18
|
import {TenantMemory} from './TenantMemory/TenantMemory';
|
20
|
-
import {
|
19
|
+
import {DefaultOverviewContent} from './DefaultOverviewContent/DefaultOverviewContent';
|
21
20
|
import {useHealthcheck} from './useHealthcheck';
|
22
21
|
|
23
22
|
import './TenantOverview.scss';
|
24
|
-
|
25
|
-
const b = cn('tenant-overview');
|
23
|
+
import {b} from './utils';
|
26
24
|
|
27
25
|
interface TenantOverviewProps {
|
28
26
|
tenantName: string;
|
@@ -141,7 +139,7 @@ export function TenantOverview({
|
|
141
139
|
);
|
142
140
|
}
|
143
141
|
default: {
|
144
|
-
return <
|
142
|
+
return <DefaultOverviewContent />;
|
145
143
|
}
|
146
144
|
}
|
147
145
|
};
|
@@ -1,5 +1,4 @@
|
|
1
1
|
import type {ReactNode} from 'react';
|
2
|
-
import cn from 'bem-cn-lite';
|
3
2
|
|
4
3
|
import DataTable from '@gravity-ui/react-data-table';
|
5
4
|
import type {DataTableProps} from '@gravity-ui/react-data-table';
|
@@ -11,8 +10,7 @@ import {
|
|
11
10
|
import type {IResponseError} from '../../../../types/api/error';
|
12
11
|
import {TableSkeleton} from '../../../../components/TableSkeleton/TableSkeleton';
|
13
12
|
import {ResponseError} from '../../../../components/Errors/ResponseError';
|
14
|
-
|
15
|
-
const b = cn('tenant-overview');
|
13
|
+
import {b} from './utils';
|
16
14
|
|
17
15
|
interface TenantOverviewTableLayoutProps<T> extends Omit<DataTableProps<T>, 'theme'> {
|
18
16
|
title: ReactNode;
|
@@ -1,17 +1,16 @@
|
|
1
|
-
import cn from 'bem-cn-lite';
|
2
|
-
|
3
1
|
import InfoViewer from '../../../../../components/InfoViewer/InfoViewer';
|
4
2
|
import {ProgressViewer} from '../../../../../components/ProgressViewer/ProgressViewer';
|
5
3
|
import {formatStorageValues} from '../../../../../utils/dataFormatters/dataFormatters';
|
6
4
|
import {getSizeWithSignificantDigits} from '../../../../../utils/bytesParsers';
|
7
5
|
|
6
|
+
import {TenantDashboard} from '../TenantDashboard/TenantDashboard';
|
7
|
+
|
8
8
|
import '../TenantOverview.scss';
|
9
9
|
|
10
|
-
import {
|
10
|
+
import {storageDashboardConfig} from './storageDashboardConfig';
|
11
11
|
import {TopTables} from './TopTables';
|
12
12
|
import {TopGroups} from './TopGroups';
|
13
|
-
|
14
|
-
const b = cn('tenant-overview');
|
13
|
+
import {b} from '../utils';
|
15
14
|
|
16
15
|
export interface TenantStorageMetrics {
|
17
16
|
blobStorageUsed?: number;
|
@@ -61,9 +60,10 @@ export function TenantStorage({tenantName, metrics}: TenantStorageProps) {
|
|
61
60
|
),
|
62
61
|
},
|
63
62
|
];
|
63
|
+
|
64
64
|
return (
|
65
65
|
<>
|
66
|
-
<
|
66
|
+
<TenantDashboard charts={storageDashboardConfig} />
|
67
67
|
<InfoViewer className={b('storage-info')} title="Storage details" info={info} />
|
68
68
|
<TopTables path={tenantName} />
|
69
69
|
<TopGroups tenant={tenantName} />
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import
|
1
|
+
import type {ChartConfig} from '../TenantDashboard/TenantDashboard';
|
2
2
|
import i18n from '../i18n';
|
3
3
|
|
4
|
-
const storageDashboardConfig: ChartConfig[] = [
|
4
|
+
export const storageDashboardConfig: ChartConfig[] = [
|
5
5
|
{
|
6
6
|
title: i18n('charts.storage-usage'),
|
7
7
|
metrics: [
|
@@ -15,7 +15,3 @@ const storageDashboardConfig: ChartConfig[] = [
|
|
15
15
|
},
|
16
16
|
},
|
17
17
|
];
|
18
|
-
|
19
|
-
export const StorageDashboard = () => {
|
20
|
-
return <TenantDashboard charts={storageDashboardConfig} />;
|
21
|
-
};
|
@@ -19,12 +19,9 @@
|
|
19
19
|
"settings.useNodesEndpoint.title": "Break the Nodes tab in Diagnostics",
|
20
20
|
"settings.useNodesEndpoint.popover": "Use /viewer/json/nodes endpoint for Nodes Tab in diagnostics. It could return incorrect data on some versions",
|
21
21
|
|
22
|
-
"settings.useVirtualTables.title": "Use table with data load on scroll for Nodes and Storage
|
22
|
+
"settings.useVirtualTables.title": "Use table with data load on scroll for Nodes and Storage tabs",
|
23
23
|
"settings.useVirtualTables.popover": "It will increase performance, but could work unstable",
|
24
24
|
|
25
25
|
"settings.queryUseMultiSchema.title": "Allow queries with multiple result sets",
|
26
|
-
"settings.queryUseMultiSchema.popover": "Use 'multi' schema for queries that enables queries with multiple result sets. Returns nothing on versions 23-3 and older"
|
27
|
-
|
28
|
-
"settings.displayChartsInDbDiagnostics.title": "Display charts in database diagnostics",
|
29
|
-
"settings.displayChartsInDbDiagnostics.popover": "Incorrect data may be displayed (shows data only for the database related to the current node), does not work well on static nodes"
|
26
|
+
"settings.queryUseMultiSchema.popover": "Use 'multi' schema for queries that enables queries with multiple result sets. Returns nothing on versions 23-3 and older"
|
30
27
|
}
|
@@ -19,12 +19,9 @@
|
|
19
19
|
"settings.useNodesEndpoint.title": "Сломать вкладку Nodes в диагностике",
|
20
20
|
"settings.useNodesEndpoint.popover": "Использовать эндпоинт /viewer/json/nodes для вкладки Nodes в диагностике. Может возвращать некорректные данные на некоторых версиях",
|
21
21
|
|
22
|
-
"settings.useVirtualTables.title": "Использовать таблицу с загрузкой данных по скроллу для вкладок Nodes и Storage
|
22
|
+
"settings.useVirtualTables.title": "Использовать таблицу с загрузкой данных по скроллу для вкладок Nodes и Storage",
|
23
23
|
"settings.useVirtualTables.popover": "Это улучшит производительность, но может работать нестабильно",
|
24
24
|
|
25
25
|
"settings.queryUseMultiSchema.title": "Разрешить запросы с несколькими результатами",
|
26
|
-
"settings.queryUseMultiSchema.popover": "Использовать для запросов схему 'multi', которая позволяет выполнять запросы с несколькими результатами. На версиях 23-3 и старше результат не возвращается вообще"
|
27
|
-
|
28
|
-
"settings.displayChartsInDbDiagnostics.title": "Показывать графики в диагностике базы данных",
|
29
|
-
"settings.displayChartsInDbDiagnostics.popover": "Могут отображаться неправильные данные (показывает данные только для базы, относящейся к текущей ноде), плохо работает на статических нодах"
|
26
|
+
"settings.queryUseMultiSchema.popover": "Использовать для запросов схему 'multi', которая позволяет выполнять запросы с несколькими результатами. На версиях 23-3 и старше результат не возвращается вообще"
|
30
27
|
}
|
@@ -10,7 +10,6 @@ import {
|
|
10
10
|
USE_BACKEND_PARAMS_FOR_TABLES_KEY,
|
11
11
|
USE_NODES_ENDPOINT_IN_DIAGNOSTICS_KEY,
|
12
12
|
QUERY_USE_MULTI_SCHEMA_KEY,
|
13
|
-
DISPLAY_CHARTS_IN_DB_DIAGNOSTICS_KEY,
|
14
13
|
} from '../../utils/constants';
|
15
14
|
import {Lang, defaultLang} from '../../utils/i18n';
|
16
15
|
|
@@ -95,11 +94,6 @@ export const queryUseMultiSchemaSetting: SettingProps = {
|
|
95
94
|
title: i18n('settings.queryUseMultiSchema.title'),
|
96
95
|
helpPopoverContent: i18n('settings.queryUseMultiSchema.popover'),
|
97
96
|
};
|
98
|
-
export const displayChartsInDbDiagnosticsSetting: SettingProps = {
|
99
|
-
settingKey: DISPLAY_CHARTS_IN_DB_DIAGNOSTICS_KEY,
|
100
|
-
title: i18n('settings.displayChartsInDbDiagnostics.title'),
|
101
|
-
helpPopoverContent: i18n('settings.displayChartsInDbDiagnostics.popover'),
|
102
|
-
};
|
103
97
|
|
104
98
|
export const appearanceSection: SettingsSection = {
|
105
99
|
id: 'appearanceSection',
|
@@ -109,12 +103,7 @@ export const appearanceSection: SettingsSection = {
|
|
109
103
|
export const experimentsSection: SettingsSection = {
|
110
104
|
id: 'experimentsSection',
|
111
105
|
title: i18n('section.experiments'),
|
112
|
-
settings: [
|
113
|
-
useNodesEndpointSetting,
|
114
|
-
useVirtualTables,
|
115
|
-
queryUseMultiSchemaSetting,
|
116
|
-
displayChartsInDbDiagnosticsSetting,
|
117
|
-
],
|
106
|
+
settings: [useNodesEndpointSetting, useVirtualTables, queryUseMultiSchemaSetting],
|
118
107
|
};
|
119
108
|
|
120
109
|
export const generalPage: SettingsPage = {
|
@@ -3,7 +3,6 @@ import {TENANT_PAGES_IDS} from '../store/reducers/tenant/constants';
|
|
3
3
|
import {
|
4
4
|
ASIDE_HEADER_COMPACT_KEY,
|
5
5
|
CLUSTER_INFO_HIDDEN_KEY,
|
6
|
-
DISPLAY_CHARTS_IN_DB_DIAGNOSTICS_KEY,
|
7
6
|
INVERTED_DISKS_KEY,
|
8
7
|
LANGUAGE_KEY,
|
9
8
|
LAST_USED_QUERY_ACTION_KEY,
|
@@ -38,7 +37,6 @@ export const DEFAULT_USER_SETTINGS: SettingsObject = {
|
|
38
37
|
[PARTITIONS_HIDDEN_COLUMNS_KEY]: [],
|
39
38
|
[CLUSTER_INFO_HIDDEN_KEY]: true,
|
40
39
|
[USE_BACKEND_PARAMS_FOR_TABLES_KEY]: false,
|
41
|
-
[DISPLAY_CHARTS_IN_DB_DIAGNOSTICS_KEY]: false,
|
42
40
|
};
|
43
41
|
|
44
42
|
class SettingsManager {
|
package/dist/utils/constants.ts
CHANGED
@@ -127,5 +127,3 @@ export const USE_BACKEND_PARAMS_FOR_TABLES_KEY = 'useBackendParamsForTables';
|
|
127
127
|
|
128
128
|
// Enable schema that supports multiple resultsets
|
129
129
|
export const QUERY_USE_MULTI_SCHEMA_KEY = 'queryUseMultiSchema';
|
130
|
-
|
131
|
-
export const DISPLAY_CHARTS_IN_DB_DIAGNOSTICS_KEY = 'displayChartsInDbDiagnostics';
|