From f59b10384b89aced4be860f14e553f6c1878bfcc Mon Sep 17 00:00:00 2001 From: "Grot (@grafanabot)" <43478413+grafanabot@users.noreply.github.com> Date: Wed, 24 Nov 2021 08:21:31 -0500 Subject: [PATCH] Jaeger: Make tags templateable (#42005) (#42206) * make tags templateable * cleanup files I didn't want to modify (cherry picked from commit 8b95746f6376caf305223abb3e3f3906719f4605) Co-authored-by: Stephanie Closson --- .../datasource/jaeger/datasource.test.ts | 36 +++++++++++++++++-- .../plugins/datasource/jaeger/datasource.ts | 9 +++-- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/public/app/plugins/datasource/jaeger/datasource.test.ts b/public/app/plugins/datasource/jaeger/datasource.test.ts index dd7c3a2443c..9011f9f3895 100644 --- a/public/app/plugins/datasource/jaeger/datasource.test.ts +++ b/public/app/plugins/datasource/jaeger/datasource.test.ts @@ -1,5 +1,12 @@ import { lastValueFrom, of, throwError } from 'rxjs'; -import { DataQueryRequest, DataSourceInstanceSettings, dateTime, FieldType, PluginType } from '@grafana/data'; +import { + DataQueryRequest, + DataSourceInstanceSettings, + dateTime, + FieldType, + PluginType, + ScopedVars, +} from '@grafana/data'; import { backendSrv } from 'app/core/services/backend_srv'; import { createFetchResponse } from 'test/helpers/createFetchResponse'; @@ -15,8 +22,13 @@ import { import { JaegerQuery } from './types'; jest.mock('@grafana/runtime', () => ({ - ...((jest.requireActual('@grafana/runtime') as unknown) as object), + ...(jest.requireActual('@grafana/runtime') as any), getBackendSrv: () => backendSrv, + getTemplateSrv: () => ({ + replace: (val: string, subs: ScopedVars): string => { + return subs[val]?.value ?? val; + }, + }), })); const timeSrvStub: any = { @@ -146,6 +158,26 @@ describe('JaegerDatasource', () => { url: `${defaultSettings.url}/api/traces?service=jaeger-query&tags=%7B%22error%22%3A%22true%22%7D&start=1531468681000&end=1531489712000&lookback=custom`, }); }); + + it('should resolve templates in tags', async () => { + const mock = setupFetchMock({ data: [testResponse] }); + const ds = new JaegerDatasource(defaultSettings, timeSrvStub); + await lastValueFrom( + ds.query({ + ...defaultQuery, + scopedVars: { + 'error=$error': { + text: 'error', + value: 'error=true', + }, + }, + targets: [{ queryType: 'search', refId: 'a', service: 'jaeger-query', tags: 'error=$error' }], + }) + ); + expect(mock).toBeCalledWith({ + url: `${defaultSettings.url}/api/traces?service=jaeger-query&tags=%7B%22error%22%3A%22true%22%7D&start=1531468681000&end=1531489712000&lookback=custom`, + }); + }); }); describe('when performing testDataSource', () => { diff --git a/public/app/plugins/datasource/jaeger/datasource.ts b/public/app/plugins/datasource/jaeger/datasource.ts index 87586a1c303..d95b2ace82e 100644 --- a/public/app/plugins/datasource/jaeger/datasource.ts +++ b/public/app/plugins/datasource/jaeger/datasource.ts @@ -12,7 +12,7 @@ import { FieldType, MutableDataFrame, } from '@grafana/data'; -import { BackendSrvRequest, getBackendSrv } from '@grafana/runtime'; +import { BackendSrvRequest, getBackendSrv, getTemplateSrv } from '@grafana/runtime'; import { serializeParams } from 'app/core/utils/fetch'; import { getTimeSrv, TimeSrv } from 'app/features/dashboard/services/TimeSrv'; @@ -46,7 +46,7 @@ export class JaegerDatasource extends DataSourceApi query(options: DataQueryRequest): Observable { // At this moment we expect only one target. In case we somehow change the UI to be able to show multiple // traces at one we need to change this. - const target = options.targets[0]; + const target: JaegerQuery = options.targets[0]; if (!target) { return of({ data: [emptyTraceDataFrame] }); } @@ -90,7 +90,10 @@ export class JaegerDatasource extends DataSourceApi // remove empty properties jaegerQuery = pickBy(jaegerQuery, identity); if (jaegerQuery.tags) { - jaegerQuery = { ...jaegerQuery, tags: convertTagsLogfmt(jaegerQuery.tags) }; + jaegerQuery = { + ...jaegerQuery, + tags: convertTagsLogfmt(getTemplateSrv().replace(jaegerQuery.tags, options.scopedVars)), + }; } if (jaegerQuery.operation === ALL_OPERATIONS_KEY) {