grafana/public/app/plugins/datasource/loki/variables.ts
Matias Chomicki 6e6069a2ba
Loki: Create Variable Query Editor for Loki. (#54102)
* feat(loki-query-editor): create base editor component

* feat(loki-query-editor): update editor to use loki query type

* feat(loki-query-editor): add custom variable support to datasource

* feat(loki-query-editor): prevent errors when no label is present

* Add unit test for LokiMetricFindQuery

* Update datasource test

* Add component test

* Add variable query migration support

* feat(loki-query-editor): add migration support for older-format variables

* Fix enum capitalization for consistency

* Move attribute to the top of the class

* Remove unnecessary from()

* Update capitalization of new enum

* Fix enum capitalization in component

* feat(loki-query-editor): replace unnecessary class with class method
2022-08-30 18:18:51 +02:00

41 lines
1.2 KiB
TypeScript

import { from, Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { CustomVariableSupport, DataQueryRequest, DataQueryResponse } from '@grafana/data';
import { LokiVariableQueryEditor } from './components/VariableQueryEditor';
import { LokiDatasource } from './datasource';
import { LokiVariableQuery, LokiVariableQueryType } from './types';
export class LokiVariableSupport extends CustomVariableSupport<LokiDatasource, LokiVariableQuery> {
editor = LokiVariableQueryEditor;
constructor(private datasource: LokiDatasource) {
super();
this.query = this.query.bind(this);
}
async execute(query: LokiVariableQuery) {
if (query.type === LokiVariableQueryType.LabelNames) {
return this.datasource.labelNamesQuery();
}
if (!query.label) {
return [];
}
// If we have query expr, use /series endpoint
if (query.stream) {
return this.datasource.labelValuesSeriesQuery(query.stream, query.label);
}
return this.datasource.labelValuesQuery(query.label);
}
query(request: DataQueryRequest<LokiVariableQuery>): Observable<DataQueryResponse> {
const result = this.execute(request.targets[0]);
return from(result).pipe(map((data) => ({ data })));
}
}