From 980b5e343368352c845a0336112cef569840ef80 Mon Sep 17 00:00:00 2001 From: mufazalov Date: Wed, 10 Apr 2024 17:14:02 +0300 Subject: [PATCH 1/3] fix: add cluster dashboard to monitoring link object --- .../ExtendedCluster/ExtendedCluster.tsx | 4 +- src/utils/__test__/monitoring.test.ts | 44 +++++-------------- src/utils/monitoring.ts | 35 ++++++++------- 3 files changed, 34 insertions(+), 49 deletions(-) diff --git a/src/containers/AppWithClusters/ExtendedCluster/ExtendedCluster.tsx b/src/containers/AppWithClusters/ExtendedCluster/ExtendedCluster.tsx index 8fdc6ebb1f..f37e0509a3 100644 --- a/src/containers/AppWithClusters/ExtendedCluster/ExtendedCluster.tsx +++ b/src/containers/AppWithClusters/ExtendedCluster/ExtendedCluster.tsx @@ -35,6 +35,7 @@ const getAdditionalBalancerInfo = (balancer: string) => { }; const getAdditionalClusterProps = ( + clusterName: string | undefined, monitoring: string | undefined, balancer: string | undefined, getMonitoringClusterLink?: GetMonitoringClusterLink, @@ -42,7 +43,7 @@ const getAdditionalClusterProps = ( const additionalClusterProps: AdditionalClusterProps = {}; if (monitoring && getMonitoringClusterLink) { - const clusterLink = getMonitoringClusterLink(monitoring); + const clusterLink = getMonitoringClusterLink(monitoring, clusterName); if (clusterLink) { additionalClusterProps.links = [{title: 'Monitoring', url: clusterLink}]; @@ -129,6 +130,7 @@ export function ExtendedCluster({
{ - 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', 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=/global/audit-trails', ); }); - 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( - getMonitoringLink({ - monitoring: solomonString, - clusterName: 'global', - dbName: '/global/audit-trails', - dbType: 'Database', - }), - ).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', + expect(getMonitoringClusterLink(solomonString, 'clusterName')).toBe( + 'https://monitoring.test.ai/projects/yc.ydb.ydbaas-cloud/dashboards/aol34hftdn7o4fls50sv/view?p.cluster=clusterName&p.database=-', ); }); }); diff --git a/src/utils/monitoring.ts b/src/utils/monitoring.ts index 5cbff5ac1d..be57aa2b4b 100644 --- a/src/utils/monitoring.ts +++ b/src/utils/monitoring.ts @@ -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; @@ -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({ @@ -31,7 +29,7 @@ export function getMonitoringLink({ clusterName, }: GetMonitoringLinkProps) { const data = parseMonitoringData(monitoring); - let href = ''; + if (data) { const monitoringUrl = data.monitoring_url; @@ -45,23 +43,28 @@ export function getMonitoringLink({ const finalClusterName = data.cluster_name || clusterName || ''; - 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}`; - } - href = encodeURI(href); + const href = `${monitoringUrl}/${dashboard}?p.cluster=${finalClusterName}&p.host=${host}&p.slot=${slot}&p.database=${dbName}`; + + return encodeURI(href); } - return href; + return ''; } export type GetMonitoringClusterLink = typeof getMonitoringClusterLink; -export function getMonitoringClusterLink(monitoring: string) { +export function getMonitoringClusterLink(monitoring: string, clusterName?: string) { const data = parseMonitoringData(monitoring); + if (data) { - return data.monitoring_url; + const monitoringUrl = data.monitoring_url; + const clusterDashboard = data.cluster_dashboard; + + const finalClusterName = data.cluster_name ?? clusterName; + + if (clusterDashboard && finalClusterName) { + return `${monitoringUrl}/${clusterDashboard}/view?p.cluster=${finalClusterName}&p.database=-`; + } } return ''; } From 57a4693f0f2a6dba529127bf26e2e14d28b6b15e Mon Sep 17 00:00:00 2001 From: mufazalov Date: Thu, 11 Apr 2024 11:17:16 +0300 Subject: [PATCH 2/3] fix: update getMonitoringClusterLink --- src/utils/monitoring.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/utils/monitoring.ts b/src/utils/monitoring.ts index be57aa2b4b..7d3b90a60d 100644 --- a/src/utils/monitoring.ts +++ b/src/utils/monitoring.ts @@ -65,6 +65,8 @@ export function getMonitoringClusterLink(monitoring: string, clusterName?: strin if (clusterDashboard && finalClusterName) { return `${monitoringUrl}/${clusterDashboard}/view?p.cluster=${finalClusterName}&p.database=-`; } + + return monitoringUrl; } return ''; } From ba49af5267bca571a0d4c0842fe5a36fbca7be65 Mon Sep 17 00:00:00 2001 From: mufazalov Date: Thu, 11 Apr 2024 17:07:01 +0300 Subject: [PATCH 3/3] fix: review --- src/utils/__test__/monitoring.test.ts | 34 +++++++++++++- src/utils/monitoring.ts | 64 ++++++++++++++++++--------- 2 files changed, 74 insertions(+), 24 deletions(-) diff --git a/src/utils/__test__/monitoring.test.ts b/src/utils/__test__/monitoring.test.ts index 0f4a749e42..514ed07c96 100644 --- a/src/utils/__test__/monitoring.test.ts +++ b/src/utils/__test__/monitoring.test.ts @@ -13,11 +13,11 @@ describe('getMonitoringLink', () => { getMonitoringLink({ monitoring: solomonString, clusterName: 'global', - dbName: '/global/audit-trails', + dbName: 'database', dbType: 'Database', }), ).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/yc.ydb.ydbaas-cloud/dashboards/aol34hftdn7o4fls50sv?p.cluster=global&p.host=cluster&p.slot=static&p.database=database', ); }); it('should create cluster monitoring link from JSON', () => { @@ -31,4 +31,34 @@ describe('getMonitoringLink', () => { '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, + dbName: 'database', + dbType: 'Dedicated', + }), + ).toBe( + '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=-', + ); + }); }); diff --git a/src/utils/monitoring.ts b/src/utils/monitoring.ts index 7d3b90a60d..a0ea95b663 100644 --- a/src/utils/monitoring.ts +++ b/src/utils/monitoring.ts @@ -28,25 +28,36 @@ export function getMonitoringLink({ dbType, clusterName, }: GetMonitoringLinkProps) { - const data = parseMonitoringData(monitoring); + try { + const data = parseMonitoringData(monitoring); - if (data) { - const monitoringUrl = data.monitoring_url; + 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; - const href = `${monitoringUrl}/${dashboard}?p.cluster=${finalClusterName}&p.host=${host}&p.slot=${slot}&p.database=${dbName}`; + url.pathname += `/${dashboard}`; + } - return encodeURI(href); - } + 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(); + } + } catch {} return ''; } @@ -54,20 +65,29 @@ export function getMonitoringLink({ export type GetMonitoringClusterLink = typeof getMonitoringClusterLink; export function getMonitoringClusterLink(monitoring: string, clusterName?: string) { - const data = parseMonitoringData(monitoring); + try { + const data = parseMonitoringData(monitoring); - if (data) { - const monitoringUrl = data.monitoring_url; - const clusterDashboard = data.cluster_dashboard; + if (data) { + const clusterDashboard = data.cluster_dashboard; + const finalClusterName = data.cluster_name || clusterName || ''; - const finalClusterName = data.cluster_name ?? clusterName; + const url = new URL(data.monitoring_url); - if (clusterDashboard && finalClusterName) { - return `${monitoringUrl}/${clusterDashboard}/view?p.cluster=${finalClusterName}&p.database=-`; + 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 monitoringUrl; - } return ''; }