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 '';
}