Refactor: Consolidate code for query generator (#91415)
* Refactor: Consolidate code for query generator * Update public/app/features/trails/AutomaticMetricQueries/query-generators/default.ts Co-authored-by: ismail simsek <ismailsimsek09@gmail.com> * fix: rename index.ts to getQueryGeneratorFor.ts to avoid barrel files --------- Co-authored-by: ismail simsek <ismailsimsek09@gmail.com>
This commit is contained in:
co-authored by
ismail simsek
parent
5834981f86
commit
4b0e8653f2
@@ -1,4 +1,4 @@
|
|||||||
import { getQueryGeneratorFor } from './query-generators';
|
import { getQueryGeneratorFor } from './query-generators/getQueryGeneratorFor';
|
||||||
import { AutoQueryInfo } from './types';
|
import { AutoQueryInfo } from './types';
|
||||||
|
|
||||||
export function getAutoQueriesForMetric(metric: string): AutoQueryInfo {
|
export function getAutoQueriesForMetric(metric: string): AutoQueryInfo {
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { VAR_METRIC_EXPR, VAR_FILTERS_EXPR } from 'app/features/trails/shared';
|
||||||
|
|
||||||
|
const GENERAL_BASE_QUERY = `${VAR_METRIC_EXPR}${VAR_FILTERS_EXPR}`;
|
||||||
|
const GENERAL_RATE_BASE_QUERY = `rate(${GENERAL_BASE_QUERY}[$__rate_interval])`;
|
||||||
|
|
||||||
|
export function getGeneralBaseQuery(rate: boolean) {
|
||||||
|
return rate ? GENERAL_RATE_BASE_QUERY : GENERAL_BASE_QUERY;
|
||||||
|
}
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
import { generateQueries } from './queries';
|
|
||||||
import { getGeneratorParameters } from './rules';
|
|
||||||
|
|
||||||
function generator(metricParts: string[]) {
|
|
||||||
const params = getGeneratorParameters(metricParts);
|
|
||||||
return generateQueries(params);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default { generator };
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
import { VAR_FILTERS_EXPR, VAR_GROUP_BY_EXP, VAR_METRIC_EXPR } from '../../../shared';
|
|
||||||
import { AutoQueryInfo } from '../../types';
|
|
||||||
import { generateCommonAutoQueryInfo } from '../common/generator';
|
|
||||||
|
|
||||||
import { AutoQueryParameters } from './types';
|
|
||||||
|
|
||||||
const GENERAL_BASE_QUERY = `${VAR_METRIC_EXPR}${VAR_FILTERS_EXPR}`;
|
|
||||||
const GENERAL_RATE_BASE_QUERY = `rate(${GENERAL_BASE_QUERY}[$__rate_interval])`;
|
|
||||||
|
|
||||||
export function getGeneralBaseQuery(rate: boolean) {
|
|
||||||
return rate ? GENERAL_RATE_BASE_QUERY : GENERAL_BASE_QUERY;
|
|
||||||
}
|
|
||||||
|
|
||||||
const aggLabels: Record<string, string> = {
|
|
||||||
avg: 'average',
|
|
||||||
sum: 'overall',
|
|
||||||
};
|
|
||||||
|
|
||||||
function getAggLabel(agg: string) {
|
|
||||||
return aggLabels[agg] || agg;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function generateQueries({ agg, rate, unit }: AutoQueryParameters): AutoQueryInfo {
|
|
||||||
const baseQuery = getGeneralBaseQuery(rate);
|
|
||||||
|
|
||||||
const aggregationDescription = rate ? `${getAggLabel(agg)} per-second rate` : `${getAggLabel(agg)}`;
|
|
||||||
|
|
||||||
const description = `${VAR_METRIC_EXPR} (${aggregationDescription})`;
|
|
||||||
|
|
||||||
const mainQueryExpr = `${agg}(${baseQuery})`;
|
|
||||||
const breakdownQueryExpr = `${agg}(${baseQuery})by(${VAR_GROUP_BY_EXP})`;
|
|
||||||
|
|
||||||
return generateCommonAutoQueryInfo({
|
|
||||||
description,
|
|
||||||
mainQueryExpr,
|
|
||||||
breakdownQueryExpr,
|
|
||||||
unit,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
import { getUnit, getPerSecondRateUnit } from '../../units';
|
|
||||||
|
|
||||||
import { AutoQueryParameters } from './types';
|
|
||||||
|
|
||||||
/** These suffixes will set rate to true */
|
|
||||||
const RATE_SUFFIXES = new Set(['count', 'total']);
|
|
||||||
|
|
||||||
const UNSUPPORTED_SUFFIXES = new Set(['sum', 'bucket']);
|
|
||||||
|
|
||||||
/** Non-default aggregattion keyed by suffix */
|
|
||||||
const SPECIFIC_AGGREGATIONS_FOR_SUFFIX: Record<string, string> = {
|
|
||||||
count: 'sum',
|
|
||||||
total: 'sum',
|
|
||||||
};
|
|
||||||
|
|
||||||
function checkPreviousForUnit(suffix: string) {
|
|
||||||
return suffix === 'total';
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getGeneratorParameters(metricParts: string[]): AutoQueryParameters {
|
|
||||||
const suffix = metricParts.at(-1);
|
|
||||||
|
|
||||||
if (suffix == null || UNSUPPORTED_SUFFIXES.has(suffix)) {
|
|
||||||
throw new Error(`This function does not support a metric suffix of "${suffix}"`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const rate = RATE_SUFFIXES.has(suffix);
|
|
||||||
const agg = SPECIFIC_AGGREGATIONS_FOR_SUFFIX[suffix] || 'avg';
|
|
||||||
|
|
||||||
const unitSuffix = checkPreviousForUnit(suffix) ? metricParts.at(-2) : suffix;
|
|
||||||
|
|
||||||
const unit = rate ? getPerSecondRateUnit(unitSuffix) : getUnit(unitSuffix);
|
|
||||||
|
|
||||||
return {
|
|
||||||
agg,
|
|
||||||
unit,
|
|
||||||
rate,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
export type AutoQueryParameters = {
|
|
||||||
agg: string;
|
|
||||||
unit: string;
|
|
||||||
rate: boolean;
|
|
||||||
};
|
|
||||||
+4
-3
@@ -1,7 +1,8 @@
|
|||||||
import { VAR_GROUP_BY_EXP } from '../../../shared';
|
import { VAR_GROUP_BY_EXP } from '../../shared';
|
||||||
import { AutoQueryDef, AutoQueryInfo } from '../../types';
|
import { AutoQueryDef, AutoQueryInfo } from '../types';
|
||||||
|
|
||||||
import { generateQueries, getGeneralBaseQuery } from './queries';
|
import { getGeneralBaseQuery } from './common/baseQuery';
|
||||||
|
import { generateQueries } from './default';
|
||||||
|
|
||||||
describe('generateQueries', () => {
|
describe('generateQueries', () => {
|
||||||
const agg = 'sum';
|
const agg = 'sum';
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
import { VAR_GROUP_BY_EXP, VAR_METRIC_EXPR } from 'app/features/trails/shared';
|
||||||
|
|
||||||
|
import { AutoQueryInfo } from '../types';
|
||||||
|
import { getPerSecondRateUnit, getUnit } from '../units';
|
||||||
|
|
||||||
|
import { getGeneralBaseQuery } from './common/baseQuery';
|
||||||
|
import { generateCommonAutoQueryInfo } from './common/generator';
|
||||||
|
|
||||||
|
/** These suffixes will set rate to true */
|
||||||
|
const RATE_SUFFIXES = new Set(['count', 'total']);
|
||||||
|
|
||||||
|
const UNSUPPORTED_SUFFIXES = new Set(['sum', 'bucket']);
|
||||||
|
|
||||||
|
/** Non-default aggregation keyed by suffix */
|
||||||
|
const SPECIFIC_AGGREGATIONS_FOR_SUFFIX: Record<string, string> = {
|
||||||
|
count: 'sum',
|
||||||
|
total: 'sum',
|
||||||
|
};
|
||||||
|
|
||||||
|
function shouldCheckPreviousSuffixForUnit(suffix: string) {
|
||||||
|
return suffix === 'total';
|
||||||
|
}
|
||||||
|
|
||||||
|
const aggLabels: Record<string, string> = {
|
||||||
|
avg: 'average',
|
||||||
|
sum: 'overall',
|
||||||
|
};
|
||||||
|
|
||||||
|
function getAggLabel(agg: string) {
|
||||||
|
return aggLabels[agg] || agg;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type AutoQueryParameters = {
|
||||||
|
agg: string;
|
||||||
|
unit: string;
|
||||||
|
rate: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
export function generateQueries({ agg, rate, unit }: AutoQueryParameters): AutoQueryInfo {
|
||||||
|
const baseQuery = getGeneralBaseQuery(rate);
|
||||||
|
|
||||||
|
const aggregationDescription = rate ? `${getAggLabel(agg)} per-second rate` : `${getAggLabel(agg)}`;
|
||||||
|
|
||||||
|
const description = `${VAR_METRIC_EXPR} (${aggregationDescription})`;
|
||||||
|
|
||||||
|
const mainQueryExpr = `${agg}(${baseQuery})`;
|
||||||
|
const breakdownQueryExpr = `${agg}(${baseQuery})by(${VAR_GROUP_BY_EXP})`;
|
||||||
|
|
||||||
|
return generateCommonAutoQueryInfo({
|
||||||
|
description,
|
||||||
|
mainQueryExpr,
|
||||||
|
breakdownQueryExpr,
|
||||||
|
unit,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createDefaultMetricQueryDefs(metricParts: string[]) {
|
||||||
|
// Get the last part of the metric name
|
||||||
|
const suffix = metricParts.at(-1);
|
||||||
|
|
||||||
|
// If the suffix is null or is in the set of unsupported suffixes, throw an error because the metric should be delegated to a different generator (summary or histogram)
|
||||||
|
if (suffix == null || UNSUPPORTED_SUFFIXES.has(suffix)) {
|
||||||
|
throw new Error(`This function does not support a metric suffix of "${suffix}"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if generating rate query and/or aggregation query
|
||||||
|
const rate = RATE_SUFFIXES.has(suffix);
|
||||||
|
const agg = SPECIFIC_AGGREGATIONS_FOR_SUFFIX[suffix] || 'avg';
|
||||||
|
|
||||||
|
// Try to find the unit in the Prometheus metric name
|
||||||
|
const unitSuffix = shouldCheckPreviousSuffixForUnit(suffix) ? metricParts.at(-2) : suffix;
|
||||||
|
|
||||||
|
// Get the Grafana unit or Grafana rate unit
|
||||||
|
const unit = rate ? getPerSecondRateUnit(unitSuffix) : getUnit(unitSuffix);
|
||||||
|
|
||||||
|
const params = {
|
||||||
|
agg,
|
||||||
|
unit,
|
||||||
|
rate,
|
||||||
|
};
|
||||||
|
return generateQueries(params);
|
||||||
|
}
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
import { AutoQueryInfo } from '../types';
|
||||||
|
|
||||||
|
import { createDefaultMetricQueryDefs } from './default';
|
||||||
|
import { createHistogramMetricQueryDefs } from './histogram';
|
||||||
|
import { createSummaryMetricQueryDefs } from './summary';
|
||||||
|
|
||||||
|
// TODO: when we have a known unit parameter, use that rather than having the generator functions infer from suffix
|
||||||
|
export type MetricQueriesGenerator = (metricParts: string[]) => AutoQueryInfo;
|
||||||
|
|
||||||
|
export function getQueryGeneratorFor(suffix?: string): MetricQueriesGenerator {
|
||||||
|
if (suffix === 'sum') {
|
||||||
|
return createSummaryMetricQueryDefs;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (suffix === 'bucket') {
|
||||||
|
return createHistogramMetricQueryDefs;
|
||||||
|
}
|
||||||
|
|
||||||
|
return createDefaultMetricQueryDefs;
|
||||||
|
}
|
||||||
@@ -7,7 +7,7 @@ import { simpleGraphBuilder } from '../graph-builders/simple';
|
|||||||
import { AutoQueryDef } from '../types';
|
import { AutoQueryDef } from '../types';
|
||||||
import { getUnit } from '../units';
|
import { getUnit } from '../units';
|
||||||
|
|
||||||
export function createHistogramQueryDefs(metricParts: string[]) {
|
export function createHistogramMetricQueryDefs(metricParts: string[]) {
|
||||||
const title = `${VAR_METRIC_EXPR}`;
|
const title = `${VAR_METRIC_EXPR}`;
|
||||||
|
|
||||||
const unitSuffix = metricParts.at(-2);
|
const unitSuffix = metricParts.at(-2);
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
import general from './common';
|
|
||||||
import { createHistogramQueryDefs } from './histogram';
|
|
||||||
import { createSummaryQueryDefs } from './summary';
|
|
||||||
import { MetricQueriesGenerator } from './types';
|
|
||||||
|
|
||||||
const SUFFIX_TO_ALTERNATIVE_GENERATOR: Record<string, MetricQueriesGenerator> = {
|
|
||||||
sum: createSummaryQueryDefs,
|
|
||||||
bucket: createHistogramQueryDefs,
|
|
||||||
};
|
|
||||||
|
|
||||||
export function getQueryGeneratorFor(suffix?: string) {
|
|
||||||
return (suffix && SUFFIX_TO_ALTERNATIVE_GENERATOR[suffix]) || general.generator;
|
|
||||||
}
|
|
||||||
@@ -2,13 +2,13 @@ import { VAR_GROUP_BY_EXP, VAR_METRIC_EXPR } from '../../shared';
|
|||||||
import { AutoQueryInfo } from '../types';
|
import { AutoQueryInfo } from '../types';
|
||||||
import { getUnit } from '../units';
|
import { getUnit } from '../units';
|
||||||
|
|
||||||
|
import { getGeneralBaseQuery } from './common/baseQuery';
|
||||||
import { generateCommonAutoQueryInfo } from './common/generator';
|
import { generateCommonAutoQueryInfo } from './common/generator';
|
||||||
import { getGeneralBaseQuery } from './common/queries';
|
|
||||||
|
|
||||||
export function createSummaryQueryDefs(metricParts: string[]): AutoQueryInfo {
|
export function createSummaryMetricQueryDefs(metricParts: string[]): AutoQueryInfo {
|
||||||
const suffix = metricParts.at(-1);
|
const suffix = metricParts.at(-1);
|
||||||
if (suffix !== 'sum') {
|
if (suffix !== 'sum') {
|
||||||
throw new Error('createSummaryQueryDefs is only to be used for metrics that end in "_sum"');
|
throw new Error('createSummaryMetricQueryDefs is only to be used for metrics that end in "_sum"');
|
||||||
}
|
}
|
||||||
|
|
||||||
const unitSuffix = metricParts.at(-2);
|
const unitSuffix = metricParts.at(-2);
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
import { AutoQueryInfo } from '../types';
|
|
||||||
|
|
||||||
export type MetricQueriesGenerator = (metricParts: string[]) => AutoQueryInfo;
|
|
||||||
Reference in New Issue
Block a user