The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
grafana/public/app/features/trails/helpers/MetricDatasourceHelper.ts

117 lines
2.9 KiB

import {
DataSourceApi,
DataSourceGetTagKeysOptions,
DataSourceGetTagValuesOptions,
MetricFindValue,
} from '@grafana/data';
import { PrometheusDatasource, PromMetricsMetadata, PromMetricsMetadataItem, PromQuery } from '@grafana/prometheus';
import PromQlLanguageProvider from '@grafana/prometheus/src/language_provider';
import { getDataSourceSrv } from '@grafana/runtime';
import { DataTrail } from '../DataTrail';
import { VAR_DATASOURCE_EXPR } from '../shared';
export class MetricDatasourceHelper {
constructor(trail: DataTrail) {
this._trail = trail;
}
public reset() {
this._datasource = undefined;
this._metricsMetadata = undefined;
}
private _trail: DataTrail;
private _datasource?: Promise<DataSourceApi>;
private async getDatasource() {
if (!this._datasource) {
this._datasource = getDataSourceSrv().get(VAR_DATASOURCE_EXPR, { __sceneObject: { value: this._trail } });
}
const ds = await this._datasource;
return ds;
}
private _metricsMetadata?: Promise<PromMetricsMetadata | undefined>;
private async _getMetricsMetadata() {
const ds = await this.getDatasource();
if (ds.languageProvider instanceof PromQlLanguageProvider) {
if (!ds.languageProvider.metricsMetadata) {
await ds.languageProvider.loadMetricsMetadata();
}
return ds.languageProvider.metricsMetadata!;
}
return undefined;
}
public async getMetricMetadata(metric?: string) {
if (!metric) {
return undefined;
}
if (!this._metricsMetadata) {
this._metricsMetadata = this._getMetricsMetadata();
}
const metadata = await this._metricsMetadata;
return metadata?.[metric];
}
/**
* Used for filtering label names for OTel resources to add custom match filters
* - target_info metric
* - deployment_environment label
* - all other OTel filters
* @param options
* @returns
*/
public async getTagKeys(options: DataSourceGetTagKeysOptions<PromQuery>): Promise<MetricFindValue[]> {
const ds = await this.getDatasource();
if (ds instanceof PrometheusDatasource) {
const keys = await ds.getTagKeys(options);
return keys;
}
return [];
}
/**
* Used for filtering label values for OTel resources to add custom match filters
* - target_info metric
* - deployment_environment label
* - all other OTel filters
* @param options
* @returns
*/
public async getTagValues(options: DataSourceGetTagValuesOptions<PromQuery>) {
const ds = await this.getDatasource();
if (ds instanceof PrometheusDatasource) {
const keys = await ds.getTagValues(options);
return keys;
}
return [];
}
}
export function getMetricDescription(metadata?: PromMetricsMetadataItem) {
if (!metadata) {
return undefined;
}
const { type, help, unit } = metadata;
const lines = [
help, //
type && `**Type:** *${type}*`,
unit && `**Unit:** ${unit}`,
];
return lines.join('\n\n');
}