diff --git a/package-lock.json b/package-lock.json index 0ad021df8a..b17fb1ae33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,6 +38,7 @@ "history": "^4.10.1", "hotkeys-js": "^3.13.9", "lodash": "^4.17.21", + "lz-string": "^1.5.0", "monaco-editor": "^0.52.2", "numeral": "^2.0.6", "path-to-regexp": "^3.3.0", @@ -18192,8 +18193,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "peer": true, + "license": "MIT", "bin": { "lz-string": "bin/bin.js" } diff --git a/package.json b/package.json index f9c177b6c3..bd079d6f18 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "history": "^4.10.1", "hotkeys-js": "^3.13.9", "lodash": "^4.17.21", + "lz-string": "^1.5.0", "monaco-editor": "^0.52.2", "numeral": "^2.0.6", "path-to-regexp": "^3.3.0", diff --git a/src/utils/__test__/logs.test.ts b/src/utils/__test__/logs.test.ts index e9b43e233f..279be68926 100644 --- a/src/utils/__test__/logs.test.ts +++ b/src/utils/__test__/logs.test.ts @@ -33,6 +33,22 @@ describe('getLogsLink', () => { ); }); + test('should generate monitoring URL when monium_cluster is present', () => { + const loggingData = { + url: 'https://logging.url/projects/some_project/logs', + monium_cluster: 'ydb-ru-prestable', + }; + + const result = getLogsLink({ + logging: JSON.stringify(loggingData), + dbName: 'testdb', + }); + + expect(result).toBe( + 'https://logging.url/projects/kikimr/logs?query=%7Bproject+%3D+%22kikimr%22%2C+service+%3D+%22ydb%22%2C+cluster+%3D+%22ydb-ru-prestable%22%2C+database+%3D+%22testdb%22%7D&from=now-1d&to=now&columns=level%2Ctime%2Cmessage%2Chost&groupByField=level&chartType=line&linesMode=single', + ); + }); + test('should return empty string for invalid data', () => { expect( getLogsLink({ diff --git a/src/utils/logs.ts b/src/utils/logs.ts index a4356651d5..664fcefeb3 100644 --- a/src/utils/logs.ts +++ b/src/utils/logs.ts @@ -1,3 +1,14 @@ +const DEFAULT_PROJECT = 'kikimr'; +const DEFAULT_SERVICE = 'ydb'; +const DEFAULT_TIME_RANGE = { + from: 'now-1d', + to: 'now', +}; +const DEFAULT_COLUMNS = 'level,time,message,host'; +const DEFAULT_GROUP_BY = 'level'; +const DEFAULT_CHART_TYPE = 'line'; +const DEFAULT_LINES_MODE = 'single'; + interface GetLogsLinkProps { dbName: string; logging: string; @@ -5,9 +16,19 @@ interface GetLogsLinkProps { export type GetLogsLink = (props: GetLogsLinkProps) => string; +interface ParsedLogging { + url: string; + monium_cluster?: string; +} + +function getBaseUrl(urlString: string): string { + const url = new URL(urlString); + return `${url.protocol}//${url.hostname}`; +} + export function getLogsLink({dbName, logging}: GetLogsLinkProps): string { try { - const data = JSON.parse(logging); + const data = JSON.parse(logging) as ParsedLogging; if (typeof data === 'object' && 'url' in data) { const logUrl = data.url; @@ -15,6 +36,25 @@ export function getLogsLink({dbName, logging}: GetLogsLinkProps): string { return ''; } + if (data.monium_cluster) { + const baseUrl = getBaseUrl(logUrl); + const url = new URL(`${baseUrl}/projects/${DEFAULT_PROJECT}/logs`); + + const query = `{project = "${DEFAULT_PROJECT}", service = "${DEFAULT_SERVICE}", cluster = "${data.monium_cluster}", database = "${dbName}"}`; + + url.searchParams.set('query', query); + url.searchParams.set('from', DEFAULT_TIME_RANGE.from); + url.searchParams.set('to', DEFAULT_TIME_RANGE.to); + url.searchParams.set('columns', DEFAULT_COLUMNS); + url.searchParams.set('groupByField', DEFAULT_GROUP_BY); + url.searchParams.set('chartType', DEFAULT_CHART_TYPE); + url.searchParams.set('linesMode', DEFAULT_LINES_MODE); + + // debug-only + console.log('Monium_cluster branch'); + return url.toString(); + } + const url = new URL(logUrl); const queryParam = url.searchParams.get('query'); @@ -28,6 +68,8 @@ export function getLogsLink({dbName, logging}: GetLogsLinkProps): string { url.searchParams.set('query', updatedQuery); } + // debug-only + console.log('Url parsing branch'); return url.toString(); } } catch {}