Skip to content

Commit b021fe0

Browse files
fix: add cluster dashboard to monitoring link object (#793)
1 parent 33687fb commit b021fe0

File tree

3 files changed

+95
-58
lines changed

3 files changed

+95
-58
lines changed

src/containers/AppWithClusters/ExtendedCluster/ExtendedCluster.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,15 @@ const getAdditionalBalancerInfo = (balancer: string) => {
3535
};
3636

3737
const getAdditionalClusterProps = (
38+
clusterName: string | undefined,
3839
monitoring: string | undefined,
3940
balancer: string | undefined,
4041
getMonitoringClusterLink?: GetMonitoringClusterLink,
4142
) => {
4243
const additionalClusterProps: AdditionalClusterProps = {};
4344

4445
if (monitoring && getMonitoringClusterLink) {
45-
const clusterLink = getMonitoringClusterLink(monitoring);
46+
const clusterLink = getMonitoringClusterLink(monitoring, clusterName);
4647

4748
if (clusterLink) {
4849
additionalClusterProps.links = [{title: 'Monitoring', url: clusterLink}];
@@ -129,6 +130,7 @@ export function ExtendedCluster({
129130
<div className={b()}>
130131
<ClusterComponent
131132
additionalClusterProps={getAdditionalClusterProps(
133+
cluster?.Name,
132134
monitoring,
133135
balancer,
134136
getMonitoringClusterLink,
Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,64 @@
1-
import {getMonitoringLink} from '../monitoring';
1+
import {getMonitoringClusterLink, getMonitoringLink} from '../monitoring';
22

33
describe('getMonitoringLink', () => {
4-
it('should create link with solomon for Israel version', () => {
5-
const monitoringRaw = {
6-
monitoring_url:
7-
'https://some-monitoring.org/?project=yc.ydb.ydbaas-cloud&cluster=global',
4+
it('should create database monitoring link from JSON', () => {
5+
const solomonRaw = {
6+
monitoring_url: 'https://monitoring.test.ai/projects/yc.ydb.ydbaas-cloud/dashboards',
87
serverless_dashboard: '',
9-
dedicated_dashboard: 'ydb-mt-database-overall',
8+
dedicated_dashboard: 'aol34hftdn7o4fls50sv',
109
};
11-
const monitoringString = JSON.stringify(monitoringRaw);
12-
13-
expect(
14-
getMonitoringLink({
15-
monitoring: monitoringString,
16-
clusterName: 'global',
17-
dbName: '/global/yc.ydb.ydbaas-cloud/uvu6j9kjcel12pem7',
18-
dbType: 'Serverless',
19-
}),
20-
).toBe(
21-
'https://some-monitoring.org/?project=yc.ydb.ydbaas-cloud&cluster=global&host=cluster&slot=static&database=/global/yc.ydb.ydbaas-cloud/uvu6j9kjcel12pem7&dashboard=',
22-
);
10+
const solomonString = JSON.stringify(solomonRaw);
2311

2412
expect(
2513
getMonitoringLink({
26-
monitoring: monitoringString,
14+
monitoring: solomonString,
2715
clusterName: 'global',
28-
dbName: '/global/audit-trails',
16+
dbName: 'database',
2917
dbType: 'Database',
3018
}),
3119
).toBe(
32-
'https://some-monitoring.org/?project=yc.ydb.ydbaas-cloud&cluster=global&host=cluster&slot=static&database=/global/audit-trails&dashboard=ydb-mt-database-overall',
20+
'https://monitoring.test.ai/projects/yc.ydb.ydbaas-cloud/dashboards/aol34hftdn7o4fls50sv?p.cluster=global&p.host=cluster&p.slot=static&p.database=database',
3321
);
3422
});
35-
it('should create link with monitoring for Nebius version', () => {
23+
it('should create cluster monitoring link from JSON', () => {
3624
const solomonRaw = {
3725
monitoring_url: 'https://monitoring.test.ai/projects/yc.ydb.ydbaas-cloud/dashboards',
38-
serverless_dashboard: '',
39-
dedicated_dashboard: 'aol34hftdn7o4fls50sv',
26+
cluster_dashboard: 'aol34hftdn7o4fls50sv',
4027
};
4128
const solomonString = JSON.stringify(solomonRaw);
4229

30+
expect(getMonitoringClusterLink(solomonString, 'clusterName')).toBe(
31+
'https://monitoring.test.ai/projects/yc.ydb.ydbaas-cloud/dashboards/aol34hftdn7o4fls50sv/view?p.cluster=clusterName&p.database=-',
32+
);
33+
});
34+
it('should not parse ready to use database monitoring link', () => {
35+
const solomonRaw = {
36+
monitoring_url:
37+
'https://monitoring.test.ai/projects/ydbaas/dashboards/aol34hftdn7o4fls50sv?p.cluster=cluster_name&a=',
38+
};
39+
40+
const solomonString = JSON.stringify(solomonRaw);
41+
4342
expect(
4443
getMonitoringLink({
4544
monitoring: solomonString,
46-
clusterName: 'global',
47-
dbName: '/global/audit-trails',
48-
dbType: 'Database',
45+
dbName: 'database',
46+
dbType: 'Dedicated',
4947
}),
5048
).toBe(
51-
'https://monitoring.test.ai/projects/yc.ydb.ydbaas-cloud/dashboards/aol34hftdn7o4fls50sv?p.cluster=global&p.host=cluster&p.slot=static&p.database=/global/audit-trails',
49+
'https://monitoring.test.ai/projects/ydbaas/dashboards/aol34hftdn7o4fls50sv?p.cluster=cluster_name&a=&p.host=cluster&p.slot=static&p.database=database',
50+
);
51+
});
52+
it('should not parse ready to use cluster monitoring link', () => {
53+
const solomonRaw = {
54+
monitoring_url:
55+
'https://monitoring.test.ai/projects/ydbaas/dashboards/aol34hftdn7o4fls50sv/view?p.cluster=cluster_name&a=',
56+
};
57+
58+
const solomonString = JSON.stringify(solomonRaw);
59+
60+
expect(getMonitoringClusterLink(solomonString)).toBe(
61+
'https://monitoring.test.ai/projects/ydbaas/dashboards/aol34hftdn7o4fls50sv/view?p.cluster=cluster_name&a=&p.database=-',
5262
);
5363
});
5464
});

src/utils/monitoring.ts

Lines changed: 54 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ import {ETenantType} from '../types/api/tenant';
22

33
export type ParsedMonitoringData = {
44
monitoring_url: string;
5-
serverless_dashboard: string;
6-
dedicated_dashboard: string;
5+
6+
serverless_dashboard?: string;
7+
dedicated_dashboard?: string;
8+
cluster_dashboard?: string;
79

810
host?: string;
911
slot?: string;
@@ -18,10 +20,6 @@ export interface GetMonitoringLinkProps {
1820
clusterName?: string;
1921
}
2022

21-
const isMonitoring = (link: string) => {
22-
return link.startsWith('https://monitoring');
23-
};
24-
2523
export type GetMonitoringLink = typeof getMonitoringLink;
2624

2725
export function getMonitoringLink({
@@ -30,39 +28,66 @@ export function getMonitoringLink({
3028
dbType,
3129
clusterName,
3230
}: GetMonitoringLinkProps) {
33-
const data = parseMonitoringData(monitoring);
34-
let href = '';
35-
if (data) {
36-
const monitoringUrl = data.monitoring_url;
31+
try {
32+
const data = parseMonitoringData(monitoring);
33+
34+
if (data) {
35+
const host = data.host ?? 'cluster';
36+
const slot = data.slot ?? 'static';
3737

38-
const dashboard =
39-
dbType === ETenantType.Serverless
40-
? data.serverless_dashboard
41-
: data.dedicated_dashboard;
38+
const finalClusterName = data.cluster_name || clusterName || '';
4239

43-
const host = data.host ?? 'cluster';
44-
const slot = data.slot ?? 'static';
40+
const url = new URL(data.monitoring_url);
4541

46-
const finalClusterName = data.cluster_name || clusterName || '';
42+
if (!url.search) {
43+
const dashboard =
44+
dbType === ETenantType.Serverless
45+
? data.serverless_dashboard
46+
: data.dedicated_dashboard;
4747

48-
if (isMonitoring(monitoringUrl)) {
49-
href = `${monitoringUrl}/${dashboard}?p.cluster=${finalClusterName}&p.host=${host}&p.slot=${slot}&p.database=${dbName}`;
50-
} else {
51-
href = `${monitoringUrl}&host=${host}&slot=${slot}&database=${dbName}&dashboard=${dashboard}`;
48+
url.pathname += `/${dashboard}`;
49+
}
50+
51+
if (!url.searchParams.has('p.cluster')) {
52+
url.searchParams.set('p.cluster', finalClusterName);
53+
}
54+
url.searchParams.set('p.host', host);
55+
url.searchParams.set('p.slot', slot);
56+
url.searchParams.set('p.database', dbName);
57+
58+
return url.toString();
5259
}
53-
href = encodeURI(href);
54-
}
60+
} catch {}
5561

56-
return href;
62+
return '';
5763
}
5864

5965
export type GetMonitoringClusterLink = typeof getMonitoringClusterLink;
6066

61-
export function getMonitoringClusterLink(monitoring: string) {
62-
const data = parseMonitoringData(monitoring);
63-
if (data) {
64-
return data.monitoring_url;
65-
}
67+
export function getMonitoringClusterLink(monitoring: string, clusterName?: string) {
68+
try {
69+
const data = parseMonitoringData(monitoring);
70+
71+
if (data) {
72+
const clusterDashboard = data.cluster_dashboard;
73+
const finalClusterName = data.cluster_name || clusterName || '';
74+
75+
const url = new URL(data.monitoring_url);
76+
77+
if (!url.search && clusterDashboard) {
78+
url.pathname += `/${clusterDashboard}/view`;
79+
}
80+
81+
if (!url.searchParams.has('p.cluster')) {
82+
url.searchParams.set('p.cluster', finalClusterName);
83+
}
84+
85+
url.searchParams.set('p.database', '-');
86+
87+
return url.toString();
88+
}
89+
} catch {}
90+
6691
return '';
6792
}
6893

0 commit comments

Comments
 (0)