import { Observable, of } from 'rxjs'; 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 { constructor( instanceSettings: DataSourceInstanceSettings, private readonly templateSrv: TemplateSrv = getTemplateSrv() ) { super(instanceSettings); } query(request: DataQueryRequest): Observable { if (!request.targets.every((q) => q.profileTypeId)) { // When changing data source in explore, firs query can be sent without filled in profileTypeId return of({ data: [] }); } return super.query(request); } applyTemplateVariables(query: Query, scopedVars: ScopedVars): Query { return { ...query, labelSelector: this.templateSrv.replace(query.labelSelector ?? '', scopedVars), }; } async getProfileTypes(): Promise { return await super.getResource('profileTypes'); } async getLabelNames(): Promise { return await super.getResource('labelNames'); } async getLabelValues(labelName: string): Promise { return await super.getResource('labelValues', { label: labelName }); } }