From 1dc167b20ecc99d2bfafe9422587854f8ab43c72 Mon Sep 17 00:00:00 2001 From: Idriss Neumann Date: Fri, 8 Dec 2023 15:25:31 +0100 Subject: [PATCH] Issue #34: add enhanceDataFrameWithDataLinks --- src/datasource.ts | 66 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 11 deletions(-) diff --git a/src/datasource.ts b/src/datasource.ts index 36af503..a116566 100644 --- a/src/datasource.ts +++ b/src/datasource.ts @@ -6,6 +6,7 @@ import { AbstractQuery, CoreApp, DataFrame, + DataLink, DataQueryError, DataQueryRequest, DataQueryResponse, @@ -32,7 +33,11 @@ import { TimeRange, } from '@grafana/data'; import { BucketAggregation, DataLinkConfig, ElasticsearchQuery, Field, FieldMapping, IndexMetadata, Logs, TermsQuery } from './types'; -import { DataSourceWithBackend, getTemplateSrv, TemplateSrv } from '@grafana/runtime'; +import { + DataSourceWithBackend, + getTemplateSrv, + TemplateSrv, + getDataSourceSrv } from '@grafana/runtime'; import { LogRowContextOptions, LogRowContextQueryDirection, QuickwitOptions } from 'quickwit'; import { ElasticQueryBuilder } from 'QueryBuilder'; import { colors } from '@grafana/ui'; @@ -83,15 +88,15 @@ export class QuickwitDataSource this.languageProvider = new ElasticsearchLanguageProvider(this); } - // /** - // * Ideally final -- any other implementation may not work as expected - // */ - // query(request: DataQueryRequest): Observable { - // return super.query(request) - // .pipe(map((response) => { - // return response; - // })); - // } + query(request: DataQueryRequest): Observable { + return super.query(request) + .pipe(map((response) => { + response.data.forEach((dataFrame) => { + enhanceDataFrameWithDataLinks(dataFrame, this.dataLinks); + }); + return response; + })); + } /** * Checks the plugin health @@ -817,6 +822,46 @@ function luceneEscape(value: string) { return value.replace(/([\!\*\+\-\=<>\s\&\|\(\)\[\]\{\}\^\~\?\:\\/"])/g, '\\$1'); } +export function enhanceDataFrameWithDataLinks(dataFrame: DataFrame, dataLinks: DataLinkConfig[]) { + if (!dataLinks.length) { + return; + } + + for (const field of dataFrame.fields) { + const linksToApply = dataLinks.filter((dataLink) => new RegExp(dataLink.field).test(field.name)); + + if (linksToApply.length === 0) { + continue; + } + + field.config = field.config || {}; + field.config.links = [...(field.config.links || [], linksToApply.map(generateDataLink))]; + } +} + +function generateDataLink(linkConfig: DataLinkConfig): DataLink { + const dataSourceSrv = getDataSourceSrv(); + + if (linkConfig.datasourceUid) { + const dsSettings = dataSourceSrv.getInstanceSettings(linkConfig.datasourceUid); + + return { + title: linkConfig.urlDisplayLabel || '', + url: '', + internal: { + query: { query: linkConfig.url }, + datasourceUid: linkConfig.datasourceUid, + datasourceName: dsSettings?.name ?? 'Data source not found', + }, + }; + } else { + return { + title: linkConfig.urlDisplayLabel || '', + url: linkConfig.url, + }; + } +} + function createContextTimeRange(rowTimeEpochMs: number, direction: string) { const offset = 7; // For log context, we want to request data from 7 subsequent/previous indices @@ -832,4 +877,3 @@ function createContextTimeRange(rowTimeEpochMs: number, direction: string) { }; } } -