grafana/public/app/plugins/datasource/elasticsearch/language_provider.ts
Piotr Jamróz 19374fce39
Explore: Generic query import/export (#40987)
* Add basic implementation

* Split import/export query interface

* Rename abstract query type

* Rename abstract query type

* Split loki/prom parsing

* Update docs

* Test importing abstract queries to Elastic

* Test exporting abstract queries from Graphite

* Test Prom and Loki query import/export

* Give better control to import/export all queries to data sources

* Fix unit test

* Fix unit test

* Filter out non-existing labels when importing queries to Loki

* Fix relative imports, names and docs

* Fix import type

* Move toPromLike query to Prometheus code

* Dedup label operator mappings

* importAbstractQueries -> importFromAbstractQueries

* Fix unit tests
2021-12-14 14:36:47 +01:00

55 lines
1.6 KiB
TypeScript

import { AbstractLabelOperator, AbstractLabelMatcher, LanguageProvider, AbstractQuery } from '@grafana/data';
import { ElasticDatasource } from './datasource';
import { ElasticsearchQuery } from './types';
export default class ElasticsearchLanguageProvider extends LanguageProvider {
declare request: (url: string, params?: any) => Promise<any>;
declare start: () => Promise<any[]>;
datasource: ElasticDatasource;
constructor(datasource: ElasticDatasource, initialValues?: any) {
super();
this.datasource = datasource;
Object.assign(this, initialValues);
}
/**
* Queries are transformed to an ES Logs query since it's the behaviour most users expect.
**/
importFromAbstractQuery(abstractQuery: AbstractQuery): ElasticsearchQuery {
return {
metrics: [
{
id: '1',
type: 'logs',
},
],
query: this.getElasticsearchQuery(abstractQuery.labelMatchers),
refId: abstractQuery.refId,
};
}
getElasticsearchQuery(labels: AbstractLabelMatcher[]): string {
return labels
.map((label) => {
switch (label.operator) {
case AbstractLabelOperator.Equal: {
return label.name + ':"' + label.value + '"';
}
case AbstractLabelOperator.NotEqual: {
return 'NOT ' + label.name + ':"' + label.value + '"';
}
case AbstractLabelOperator.EqualRegEx: {
return label.name + ':/' + label.value + '/';
}
case AbstractLabelOperator.NotEqualRegEx: {
return 'NOT ' + label.name + ':/' + label.value + '/';
}
}
})
.join(' AND ');
}
}