Phlare: Allow variables in labelSelector (in query) (#64324)

applyTemplateVariables and tests
This commit is contained in:
Joey 2023-03-08 13:29:28 +00:00 committed by GitHub
parent b63c56903d
commit ee38bbe030
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 61 additions and 3 deletions

View File

@ -1,5 +1,7 @@
import { AbstractLabelOperator, DataSourceInstanceSettings, PluginMetaInfo, PluginType } from '@grafana/data';
import { TemplateSrv } from 'app/features/templating/template_srv';
import { defaultPhlareQueryType } from './dataquery.gen';
import { PhlareDataSource } from './datasource';
describe('Phlare data source', () => {
@ -45,8 +47,48 @@ describe('Phlare data source', () => {
]);
});
});
describe('applyTemplateVariables', () => {
const interpolationVar = '$interpolationVar';
const interpolationText = 'interpolationText';
const noInterpolation = 'noInterpolation';
it('should not update labelSelector if there are no template variables', () => {
const templateSrv = new TemplateSrv();
templateSrv.replace = jest.fn((query: string): string => {
return query.replace(/\$interpolationVar/g, interpolationText);
});
ds = new PhlareDataSource(defaultSettings, templateSrv);
const query = ds.applyTemplateVariables(defaultQuery(`{${noInterpolation}}`), {});
expect(templateSrv.replace).toBeCalledTimes(1);
expect(query.labelSelector).toBe(`{${noInterpolation}}`);
});
it('should update labelSelector if there are template variables', () => {
const templateSrv = new TemplateSrv();
templateSrv.replace = jest.fn((query: string): string => {
return query.replace(/\$interpolationVar/g, interpolationText);
});
ds = new PhlareDataSource(defaultSettings, templateSrv);
const query = ds.applyTemplateVariables(defaultQuery(`{${interpolationVar}="${interpolationVar}"}`), {
interpolationVar: { text: interpolationText, value: interpolationText },
});
expect(templateSrv.replace).toBeCalledTimes(1);
expect(query.labelSelector).toBe(`{${interpolationText}="${interpolationText}"}`);
});
});
});
const defaultQuery = (query: string) => {
return {
refId: 'x',
groupBy: [],
labelSelector: query,
profileTypeId: '',
queryType: defaultPhlareQueryType,
};
};
const defaultSettings: DataSourceInstanceSettings = {
id: 0,
uid: 'phlare',

View File

@ -1,8 +1,14 @@
import Prism, { Grammar } from 'prismjs';
import { Observable, of } from 'rxjs';
import { AbstractQuery, DataQueryRequest, DataQueryResponse, DataSourceInstanceSettings } from '@grafana/data';
import { DataSourceWithBackend } from '@grafana/runtime';
import {
AbstractQuery,
DataQueryRequest,
DataQueryResponse,
DataSourceInstanceSettings,
ScopedVars,
} from '@grafana/data';
import { DataSourceWithBackend, getTemplateSrv, TemplateSrv } from '@grafana/runtime';
import { extractLabelMatchers, toPromLikeExpr } from '../prometheus/language_utils';
@ -10,7 +16,10 @@ import { normalizeQuery } from './QueryEditor/QueryEditor';
import { PhlareDataSourceOptions, Query, ProfileTypeMessage, SeriesMessage } from './types';
export class PhlareDataSource extends DataSourceWithBackend<Query, PhlareDataSourceOptions> {
constructor(instanceSettings: DataSourceInstanceSettings<PhlareDataSourceOptions>) {
constructor(
instanceSettings: DataSourceInstanceSettings<PhlareDataSourceOptions>,
private readonly templateSrv: TemplateSrv = getTemplateSrv()
) {
super(instanceSettings);
}
@ -49,6 +58,13 @@ export class PhlareDataSource extends DataSourceWithBackend<Query, PhlareDataSou
return await super.getResource('labelNames');
}
applyTemplateVariables(query: Query, scopedVars: ScopedVars): Query {
return {
...query,
labelSelector: this.templateSrv.replace(query.labelSelector ?? '', scopedVars),
};
}
async importFromAbstractQueries(abstractQueries: AbstractQuery[]): Promise<Query[]> {
return abstractQueries.map((abstractQuery) => this.importFromAbstractQuery(abstractQuery));
}