mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Merge pull request #13774 from miqh/feat/sum-query-suggestion
Implement sum aggregation suggestion with placeholder support
This commit is contained in:
@@ -464,6 +464,9 @@ export class PrometheusDatasource {
|
||||
case 'ADD_RATE': {
|
||||
return `rate(${query}[5m])`;
|
||||
}
|
||||
case 'ADD_SUM': {
|
||||
return `sum(${query.trim()}) by ($1)`;
|
||||
}
|
||||
case 'EXPAND_RULES': {
|
||||
const mapping = action.mapping;
|
||||
if (mapping) {
|
||||
|
||||
@@ -2,6 +2,11 @@ import _ from 'lodash';
|
||||
|
||||
import { QueryHint } from 'app/types/explore';
|
||||
|
||||
/**
|
||||
* Number of time series results needed before starting to suggest sum aggregation hints
|
||||
*/
|
||||
export const SUM_HINT_THRESHOLD_COUNT = 20;
|
||||
|
||||
export function getQueryHints(query: string, series?: any[], datasource?: any): QueryHint[] {
|
||||
const hints = [];
|
||||
|
||||
@@ -90,5 +95,24 @@ export function getQueryHints(query: string, series?: any[], datasource?: any):
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (series.length >= SUM_HINT_THRESHOLD_COUNT) {
|
||||
const simpleMetric = query.trim().match(/^\w+$/);
|
||||
if (simpleMetric) {
|
||||
hints.push({
|
||||
type: 'ADD_SUM',
|
||||
label: 'Many time series results returned.',
|
||||
fix: {
|
||||
label: 'Consider aggregating with sum().',
|
||||
action: {
|
||||
type: 'ADD_SUM',
|
||||
query: query,
|
||||
preventSubmit: true,
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return hints.length > 0 ? hints : null;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { getQueryHints } from '../query_hints';
|
||||
import { getQueryHints, SUM_HINT_THRESHOLD_COUNT } from '../query_hints';
|
||||
|
||||
describe('getQueryHints()', () => {
|
||||
it('returns no hints for no series', () => {
|
||||
@@ -79,4 +79,23 @@ describe('getQueryHints()', () => {
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('returns a sum hint when many time series results are returned for a simple metric', () => {
|
||||
const seriesCount = SUM_HINT_THRESHOLD_COUNT;
|
||||
const series = Array.from({ length: seriesCount }, _ => ({
|
||||
datapoints: [[0, 0], [0, 0]],
|
||||
}));
|
||||
const hints = getQueryHints('metric', series);
|
||||
expect(hints.length).toBe(seriesCount);
|
||||
expect(hints[0]).toMatchObject({
|
||||
label: 'Many time series results returned.',
|
||||
index: 0,
|
||||
fix: {
|
||||
action: {
|
||||
type: 'ADD_SUM',
|
||||
query: 'metric',
|
||||
},
|
||||
},
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user