import { from, map, Observable, of } from 'rxjs'; import { CustomVariableSupport, DataQueryRequest, DataQueryResponse, MetricFindValue } from '@grafana/data'; import { getProfileTypeLabel, VariableQueryEditor } from './VariableQueryEditor'; import { PyroscopeDataSource } from './datasource'; import { ProfileTypeMessage, VariableQuery } from './types'; export interface DataAPI { getProfileTypes(start: number, end: number): Promise; getLabelNames(query: string, start: number, end: number): Promise; getLabelValues(query: string, label: string, start: number, end: number): Promise; } export class VariableSupport extends CustomVariableSupport { constructor(private readonly dataAPI: DataAPI) { super(); } editor = VariableQueryEditor; query(request: DataQueryRequest): Observable { if (request.targets[0].type === 'profileType') { return from(this.dataAPI.getProfileTypes(request.range.from.valueOf(), request.range.to.valueOf())).pipe( map((values) => { return { data: values.map((v) => ({ text: v.label, value: v.id })) }; }) ); } if (request.targets[0].type === 'label') { if (!request.targets[0].profileTypeId) { return of({ data: [] }); } return from( this.dataAPI.getLabelNames( getProfileTypeLabel(request.targets[0].profileTypeId), request.range.from.valueOf(), request.range.to.valueOf() ) ).pipe( map((values) => { return { data: values.map((v) => ({ text: v })) }; }) ); } if (request.targets[0].type === 'labelValue') { if (!request.targets[0].labelName || !request.targets[0].profileTypeId) { return of({ data: [] }); } return from( this.dataAPI.getLabelValues( getProfileTypeLabel(request.targets[0].profileTypeId), request.targets[0].labelName, request.range.from.valueOf(), request.range.to.valueOf() ) ).pipe( map((values) => { return { data: values.map((v) => ({ text: v })) }; }) ); } return of({ data: [] }); } }