From b021fe013460328a00f152484947af32ab46e4ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9C=D1=83=D1=84=D0=B0?= =?UTF-8?q?=D0=B7=D0=B0=D0=BB=D0=BE=D0=B2?= <67755036+artemmufazalov@users.noreply.github.com> Date: Fri, 12 Apr 2024 11:21:45 +0300 Subject: [PATCH] fix: add cluster dashboard to monitoring link object (#793) --- .../ExtendedCluster/ExtendedCluster.tsx | 4 +- src/utils/__test__/monitoring.test.ts | 66 ++++++++------- src/utils/monitoring.ts | 83 ++++++++++++------- 3 files changed, 95 insertions(+), 58 deletions(-) diff --git a/src/containers/AppWithClusters/ExtendedCluster/ExtendedCluster.tsx b/src/containers/AppWithClusters/ExtendedCluster/ExtendedCluster.tsx index 8fdc6ebb1..f37e0509a 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', + 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=-', ); }); }); diff --git a/src/utils/monitoring.ts b/src/utils/monitoring.ts index 5cbff5ac1..a0ea95b66 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({ @@ -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 ''; }