Skip to content

Commit

Permalink
fix: add cluster dashboard to monitoring link object (#793)
Browse files Browse the repository at this point in the history
  • Loading branch information
artemmufazalov authored Apr 12, 2024
1 parent 33687fb commit b021fe0
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 58 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,15 @@ const getAdditionalBalancerInfo = (balancer: string) => {
};

const getAdditionalClusterProps = (
clusterName: string | undefined,
monitoring: string | undefined,
balancer: string | undefined,
getMonitoringClusterLink?: GetMonitoringClusterLink,
) => {
const additionalClusterProps: AdditionalClusterProps = {};

if (monitoring && getMonitoringClusterLink) {
const clusterLink = getMonitoringClusterLink(monitoring);
const clusterLink = getMonitoringClusterLink(monitoring, clusterName);

if (clusterLink) {
additionalClusterProps.links = [{title: 'Monitoring', url: clusterLink}];
Expand Down Expand Up @@ -129,6 +130,7 @@ export function ExtendedCluster({
<div className={b()}>
<ClusterComponent
additionalClusterProps={getAdditionalClusterProps(
cluster?.Name,
monitoring,
balancer,
getMonitoringClusterLink,
Expand Down
66 changes: 38 additions & 28 deletions src/utils/__test__/monitoring.test.ts
Original file line number Diff line number Diff line change
@@ -1,54 +1,64 @@
import {getMonitoringLink} from '../monitoring';
import {getMonitoringClusterLink, getMonitoringLink} from '../monitoring';

describe('getMonitoringLink', () => {
it('should create link with solomon for Israel version', () => {
const monitoringRaw = {
monitoring_url:
'https://some-monitoring.org/?project=yc.ydb.ydbaas-cloud&cluster=global',
it('should create database monitoring link from JSON', () => {
const solomonRaw = {
monitoring_url: 'https://monitoring.test.ai/projects/yc.ydb.ydbaas-cloud/dashboards',
serverless_dashboard: '',
dedicated_dashboard: 'ydb-mt-database-overall',
dedicated_dashboard: 'aol34hftdn7o4fls50sv',
};
const monitoringString = JSON.stringify(monitoringRaw);

expect(
getMonitoringLink({
monitoring: monitoringString,
clusterName: 'global',
dbName: '/global/yc.ydb.ydbaas-cloud/uvu6j9kjcel12pem7',
dbType: 'Serverless',
}),
).toBe(
'https://some-monitoring.org/?project=yc.ydb.ydbaas-cloud&cluster=global&host=cluster&slot=static&database=/global/yc.ydb.ydbaas-cloud/uvu6j9kjcel12pem7&dashboard=',
);
const solomonString = JSON.stringify(solomonRaw);

expect(
getMonitoringLink({
monitoring: monitoringString,
monitoring: solomonString,
clusterName: 'global',
dbName: '/global/audit-trails',
dbName: 'database',
dbType: 'Database',
}),
).toBe(
'https://some-monitoring.org/?project=yc.ydb.ydbaas-cloud&cluster=global&host=cluster&slot=static&database=/global/audit-trails&dashboard=ydb-mt-database-overall',
'https://monitoring.test.ai/projects/yc.ydb.ydbaas-cloud/dashboards/aol34hftdn7o4fls50sv?p.cluster=global&p.host=cluster&p.slot=static&p.database=database',
);
});
it('should create link with monitoring for Nebius version', () => {
it('should create cluster monitoring link from JSON', () => {
const solomonRaw = {
monitoring_url: 'https://monitoring.test.ai/projects/yc.ydb.ydbaas-cloud/dashboards',
serverless_dashboard: '',
dedicated_dashboard: 'aol34hftdn7o4fls50sv',
cluster_dashboard: 'aol34hftdn7o4fls50sv',
};
const solomonString = JSON.stringify(solomonRaw);

expect(getMonitoringClusterLink(solomonString, 'clusterName')).toBe(
'https://monitoring.test.ai/projects/yc.ydb.ydbaas-cloud/dashboards/aol34hftdn7o4fls50sv/view?p.cluster=clusterName&p.database=-',
);
});
it('should not parse ready to use database monitoring link', () => {
const solomonRaw = {
monitoring_url:
'https://monitoring.test.ai/projects/ydbaas/dashboards/aol34hftdn7o4fls50sv?p.cluster=cluster_name&a=',
};

const solomonString = JSON.stringify(solomonRaw);

expect(
getMonitoringLink({
monitoring: solomonString,
clusterName: 'global',
dbName: '/global/audit-trails',
dbType: 'Database',
dbName: 'database',
dbType: 'Dedicated',
}),
).toBe(
'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',
'https://monitoring.test.ai/projects/ydbaas/dashboards/aol34hftdn7o4fls50sv?p.cluster=cluster_name&a=&p.host=cluster&p.slot=static&p.database=database',
);
});
it('should not parse ready to use cluster monitoring link', () => {
const solomonRaw = {
monitoring_url:
'https://monitoring.test.ai/projects/ydbaas/dashboards/aol34hftdn7o4fls50sv/view?p.cluster=cluster_name&a=',
};

const solomonString = JSON.stringify(solomonRaw);

expect(getMonitoringClusterLink(solomonString)).toBe(
'https://monitoring.test.ai/projects/ydbaas/dashboards/aol34hftdn7o4fls50sv/view?p.cluster=cluster_name&a=&p.database=-',
);
});
});
83 changes: 54 additions & 29 deletions src/utils/monitoring.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ import {ETenantType} from '../types/api/tenant';

export type ParsedMonitoringData = {
monitoring_url: string;
serverless_dashboard: string;
dedicated_dashboard: string;

serverless_dashboard?: string;
dedicated_dashboard?: string;
cluster_dashboard?: string;

host?: string;
slot?: string;
Expand All @@ -18,10 +20,6 @@ export interface GetMonitoringLinkProps {
clusterName?: string;
}

const isMonitoring = (link: string) => {
return link.startsWith('https://monitoring');
};

export type GetMonitoringLink = typeof getMonitoringLink;

export function getMonitoringLink({
Expand All @@ -30,39 +28,66 @@ export function getMonitoringLink({
dbType,
clusterName,
}: GetMonitoringLinkProps) {
const data = parseMonitoringData(monitoring);
let href = '';
if (data) {
const monitoringUrl = data.monitoring_url;
try {
const data = parseMonitoringData(monitoring);

if (data) {
const host = data.host ?? 'cluster';
const slot = data.slot ?? 'static';

const dashboard =
dbType === ETenantType.Serverless
? data.serverless_dashboard
: data.dedicated_dashboard;
const finalClusterName = data.cluster_name || clusterName || '';

const host = data.host ?? 'cluster';
const slot = data.slot ?? 'static';
const url = new URL(data.monitoring_url);

const finalClusterName = data.cluster_name || clusterName || '';
if (!url.search) {
const dashboard =
dbType === ETenantType.Serverless
? data.serverless_dashboard
: data.dedicated_dashboard;

if (isMonitoring(monitoringUrl)) {
href = `${monitoringUrl}/${dashboard}?p.cluster=${finalClusterName}&p.host=${host}&p.slot=${slot}&p.database=${dbName}`;
} else {
href = `${monitoringUrl}&host=${host}&slot=${slot}&database=${dbName}&dashboard=${dashboard}`;
url.pathname += `/${dashboard}`;
}

if (!url.searchParams.has('p.cluster')) {
url.searchParams.set('p.cluster', finalClusterName);
}
url.searchParams.set('p.host', host);
url.searchParams.set('p.slot', slot);
url.searchParams.set('p.database', dbName);

return url.toString();
}
href = encodeURI(href);
}
} catch {}

return href;
return '';
}

export type GetMonitoringClusterLink = typeof getMonitoringClusterLink;

export function getMonitoringClusterLink(monitoring: string) {
const data = parseMonitoringData(monitoring);
if (data) {
return data.monitoring_url;
}
export function getMonitoringClusterLink(monitoring: string, clusterName?: string) {
try {
const data = parseMonitoringData(monitoring);

if (data) {
const clusterDashboard = data.cluster_dashboard;
const finalClusterName = data.cluster_name || clusterName || '';

const url = new URL(data.monitoring_url);

if (!url.search && clusterDashboard) {
url.pathname += `/${clusterDashboard}/view`;
}

if (!url.searchParams.has('p.cluster')) {
url.searchParams.set('p.cluster', finalClusterName);
}

url.searchParams.set('p.database', '-');

return url.toString();
}
} catch {}

return '';
}

Expand Down

0 comments on commit b021fe0

Please sign in to comment.