Parca: Apply template variables for labelSelector in query (#82910)

* Parca: Apply template variables for labelSelector in query

* Remove unused imports

---------

Co-authored-by: Joey Tawadrous <joey.tawadrous@grafana.com>
This commit is contained in:
Lev Zakharov 2024-02-20 15:58:47 +03:00 committed by GitHub
parent 5e65820bee
commit 8138ca34a4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 84 additions and 3 deletions

View File

@ -0,0 +1,71 @@
import { DataSourceInstanceSettings, PluginMetaInfo, PluginType } from '@grafana/data';
import { getTemplateSrv } from '@grafana/runtime';
import { defaultParcaQueryType } from './dataquery.gen';
import { ParcaDataSource } from './datasource';
import { Query } from './types';
jest.mock('@grafana/runtime', () => {
const actual = jest.requireActual('@grafana/runtime');
return {
...actual,
getTemplateSrv: () => {
return {
replace: (query: string): string => {
return query.replace(/\$var/g, 'interpolated');
},
};
},
};
});
describe('Parca data source', () => {
let ds: ParcaDataSource;
beforeEach(() => {
ds = new ParcaDataSource(defaultSettings);
});
describe('applyTemplateVariables', () => {
const templateSrv = getTemplateSrv();
it('should not update labelSelector if there are no template variables', () => {
ds = new ParcaDataSource(defaultSettings, templateSrv);
const query = ds.applyTemplateVariables(defaultQuery({ labelSelector: `no var` }), {});
expect(query).toMatchObject({ labelSelector: `no var` });
});
it('should update labelSelector if there are template variables', () => {
ds = new ParcaDataSource(defaultSettings, templateSrv);
const query = ds.applyTemplateVariables(defaultQuery({ labelSelector: `{$var="$var"}` }), {});
expect(query).toMatchObject({ labelSelector: `{interpolated="interpolated"}` });
});
});
});
const defaultSettings: DataSourceInstanceSettings = {
id: 0,
uid: 'parca',
type: 'profiling',
name: 'parca',
access: 'proxy',
meta: {
id: 'parca',
name: 'parca',
type: PluginType.datasource,
info: {} as PluginMetaInfo,
module: '',
baseUrl: '',
},
jsonData: {},
readOnly: false,
};
const defaultQuery = (query: Partial<Query>): Query => {
return {
refId: 'x',
labelSelector: '',
profileTypeId: '',
queryType: defaultParcaQueryType,
...query,
};
};

View File

@ -1,12 +1,15 @@
import { Observable, of } from 'rxjs';
import { DataQueryRequest, DataQueryResponse, DataSourceInstanceSettings } from '@grafana/data';
import { DataSourceWithBackend } from '@grafana/runtime';
import { DataQueryRequest, DataQueryResponse, DataSourceInstanceSettings, ScopedVars } from '@grafana/data';
import { DataSourceWithBackend, getTemplateSrv, TemplateSrv } from '@grafana/runtime';
import { ParcaDataSourceOptions, Query, ProfileTypeMessage } from './types';
export class ParcaDataSource extends DataSourceWithBackend<Query, ParcaDataSourceOptions> {
constructor(instanceSettings: DataSourceInstanceSettings<ParcaDataSourceOptions>) {
constructor(
instanceSettings: DataSourceInstanceSettings<ParcaDataSourceOptions>,
private readonly templateSrv: TemplateSrv = getTemplateSrv()
) {
super(instanceSettings);
}
@ -19,6 +22,13 @@ export class ParcaDataSource extends DataSourceWithBackend<Query, ParcaDataSourc
return super.query(request);
}
applyTemplateVariables(query: Query, scopedVars: ScopedVars): Query {
return {
...query,
labelSelector: this.templateSrv.replace(query.labelSelector ?? '', scopedVars),
};
}
async getProfileTypes(): Promise<ProfileTypeMessage[]> {
return await super.getResource('profileTypes');
}