mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* add prom query var editor with tests and migrations * fix migration, now query not expr * fix label_values migration * remove comments * fix label_values() variables order * update UI and use more clear language * fix tests * use null coalescing operators * allow users to query label values with label and metric if they have not set there flavor and version * use enums instead of numbers for readability * fix label&metrics switch * update type in qv editor * reuse datasource function to get all label names, getLabelNames(), prev named getTagKeys() * use getLabelNames in the query var editor * make label_values() variables label and metric more readable in the migration * fix tooltip for label_values to remove API reference * clean up tooltips and allow newlines in query_result function * change function wording and exprType to query type/qryType for readability * update prometheus query variable docs * Update public/app/plugins/datasource/prometheus/components/VariableQueryEditor.tsx Co-authored-by: Galen Kistler <109082771+gtk-grafana@users.noreply.github.com> --------- Co-authored-by: Galen Kistler <109082771+gtk-grafana@users.noreply.github.com>
105 lines
2.8 KiB
TypeScript
105 lines
2.8 KiB
TypeScript
import { PromVariableQuery, PromVariableQueryType as QueryType } from '../types';
|
|
|
|
const labelNamesRegex = /^label_names\(\)\s*$/;
|
|
const labelValuesRegex = /^label_values\((?:(.+),\s*)?([a-zA-Z_][a-zA-Z0-9_]*)\)\s*$/;
|
|
const metricNamesRegex = /^metrics\((.+)\)\s*$/;
|
|
const queryResultRegex = /^query_result\((.+)\)\s*$/;
|
|
|
|
export function migrateVariableQueryToEditor(rawQuery: string | PromVariableQuery): PromVariableQuery {
|
|
// If not string, we assume PromVariableQuery
|
|
if (typeof rawQuery !== 'string') {
|
|
return rawQuery;
|
|
}
|
|
|
|
const queryBase = {
|
|
refId: 'PrometheusDatasource-VariableQuery',
|
|
qryType: QueryType.LabelNames,
|
|
};
|
|
|
|
const labelNames = rawQuery.match(labelNamesRegex);
|
|
if (labelNames) {
|
|
return {
|
|
...queryBase,
|
|
qryType: QueryType.LabelNames,
|
|
};
|
|
}
|
|
|
|
const labelValues = rawQuery.match(labelValuesRegex);
|
|
|
|
if (labelValues) {
|
|
const label = labelValues[2];
|
|
const metric = labelValues[1];
|
|
if (metric) {
|
|
return {
|
|
...queryBase,
|
|
qryType: QueryType.LabelValues,
|
|
label,
|
|
metric,
|
|
};
|
|
} else {
|
|
return {
|
|
...queryBase,
|
|
qryType: QueryType.LabelValues,
|
|
label,
|
|
};
|
|
}
|
|
}
|
|
|
|
const metricNames = rawQuery.match(metricNamesRegex);
|
|
if (metricNames) {
|
|
return {
|
|
...queryBase,
|
|
qryType: QueryType.MetricNames,
|
|
metric: metricNames[1],
|
|
};
|
|
}
|
|
|
|
const queryResult = rawQuery.match(queryResultRegex);
|
|
if (queryResult) {
|
|
return {
|
|
...queryBase,
|
|
qryType: QueryType.VarQueryResult,
|
|
varQuery: queryResult[1],
|
|
};
|
|
}
|
|
|
|
// seriesQuery does not have a function and no regex above
|
|
if (!labelNames && !labelValues && !metricNames && !queryResult) {
|
|
return {
|
|
...queryBase,
|
|
qryType: QueryType.SeriesQuery,
|
|
seriesQuery: rawQuery,
|
|
};
|
|
}
|
|
|
|
return queryBase;
|
|
}
|
|
|
|
// migrate it back to a string with the correct varialbes in place
|
|
export function migrateVariableEditorBackToVariableSupport(QueryVariable: PromVariableQuery): string {
|
|
switch (QueryVariable.qryType) {
|
|
case QueryType.LabelNames:
|
|
return 'label_names()';
|
|
case QueryType.LabelValues:
|
|
if (QueryVariable.metric) {
|
|
return `label_values(${QueryVariable.metric},${QueryVariable.label})`;
|
|
} else {
|
|
return `label_values(${QueryVariable.label})`;
|
|
}
|
|
case QueryType.MetricNames:
|
|
return `metrics(${QueryVariable.metric})`;
|
|
case QueryType.VarQueryResult:
|
|
const varQuery = removeLineBreaks(QueryVariable.varQuery);
|
|
return `query_result(${varQuery})`;
|
|
case QueryType.SeriesQuery:
|
|
return '' + QueryVariable.seriesQuery;
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
// allow line breaks in query result textarea
|
|
function removeLineBreaks(input?: string) {
|
|
return input ? input.replace(/[\r\n]+/gm, '') : '';
|
|
}
|