Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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