mirror of https://github.com/grafana/grafana
refactor: data trails auto query for buckets (#80170)
* refactor: data trails auto query for buckets * refactor: vizBuilder function signature (#80178) * fix: use closures for setting unit and title in vizBuilderspull/80216/head
parent
739cba6eb9
commit
dbae7ccd3f
@ -1,7 +1,10 @@ |
|||||||
import { PanelBuilders } from '@grafana/scenes'; |
import { PanelBuilders } from '@grafana/scenes'; |
||||||
|
|
||||||
import { AutoQueryDef } from '../types'; |
import { CommonVizParams } from './types'; |
||||||
|
|
||||||
export function percentilesGraphBuilder(def: AutoQueryDef) { |
export function percentilesGraphBuilder({ title, unit }: CommonVizParams) { |
||||||
return PanelBuilders.timeseries().setTitle(def.title).setUnit(def.unit).setCustomFieldConfig('fillOpacity', 9); |
return PanelBuilders.timeseries() //
|
||||||
|
.setTitle(title) |
||||||
|
.setUnit(unit) |
||||||
|
.setCustomFieldConfig('fillOpacity', 9); |
||||||
} |
} |
||||||
|
@ -1,11 +1,11 @@ |
|||||||
import { PanelBuilders } from '@grafana/scenes'; |
import { PanelBuilders } from '@grafana/scenes'; |
||||||
|
|
||||||
import { AutoQueryDef } from '../types'; |
import { CommonVizParams } from './types'; |
||||||
|
|
||||||
export function simpleGraphBuilder(def: AutoQueryDef) { |
export function simpleGraphBuilder({ title, unit }: CommonVizParams) { |
||||||
return PanelBuilders.timeseries() |
return PanelBuilders.timeseries() //
|
||||||
.setTitle(def.title) |
.setTitle(title) |
||||||
.setUnit(def.unit) |
.setUnit(unit) |
||||||
.setOption('legend', { showLegend: false }) |
.setOption('legend', { showLegend: false }) |
||||||
.setCustomFieldConfig('fillOpacity', 9); |
.setCustomFieldConfig('fillOpacity', 9); |
||||||
} |
} |
||||||
|
@ -0,0 +1,4 @@ |
|||||||
|
export type CommonVizParams = { |
||||||
|
title: string; |
||||||
|
unit: string; |
||||||
|
}; |
@ -1,86 +1,86 @@ |
|||||||
|
import { PromQuery } from 'app/plugins/datasource/prometheus/types'; |
||||||
|
|
||||||
import { VAR_FILTERS_EXPR, VAR_GROUP_BY_EXP, VAR_METRIC_EXPR } from '../../../shared'; |
import { VAR_FILTERS_EXPR, VAR_GROUP_BY_EXP, VAR_METRIC_EXPR } from '../../../shared'; |
||||||
import { heatmapGraphBuilder } from '../../graph-builders/heatmap'; |
import { heatmapGraphBuilder } from '../../graph-builders/heatmap'; |
||||||
import { percentilesGraphBuilder } from '../../graph-builders/percentiles'; |
import { percentilesGraphBuilder } from '../../graph-builders/percentiles'; |
||||||
import { simpleGraphBuilder } from '../../graph-builders/simple'; |
import { simpleGraphBuilder } from '../../graph-builders/simple'; |
||||||
import { AutoQueryDef } from '../../types'; |
import { AutoQueryDef } from '../../types'; |
||||||
|
import { getUnit } from '../../units'; |
||||||
|
|
||||||
function generator(metricParts: string[]) { |
function generator(metricParts: string[]) { |
||||||
let unit = 'short'; |
|
||||||
|
|
||||||
const title = `${VAR_METRIC_EXPR}`; |
const title = `${VAR_METRIC_EXPR}`; |
||||||
|
|
||||||
const unitSuffix = metricParts.at(-2); |
const unitSuffix = metricParts.at(-2); |
||||||
|
|
||||||
if (unitSuffix === 'seconds') { |
const unit = getUnit(unitSuffix); |
||||||
// TODO Map to other units
|
|
||||||
unit = 's'; |
|
||||||
} |
|
||||||
|
|
||||||
const p50: AutoQueryDef = { |
const common = { |
||||||
title, |
title, |
||||||
variant: 'p50', |
|
||||||
unit, |
unit, |
||||||
queries: [ |
}; |
||||||
{ |
|
||||||
refId: 'A', |
const p50: AutoQueryDef = { |
||||||
expr: `histogram_quantile(0.50, sum by(le) (rate(${VAR_METRIC_EXPR}${VAR_FILTERS_EXPR}[$__rate_interval])))`, |
...common, |
||||||
}, |
variant: 'p50', |
||||||
], |
queries: [percentileQuery(50)], |
||||||
vizBuilder: simpleGraphBuilder, |
vizBuilder: () => simpleGraphBuilder(p50), |
||||||
}; |
}; |
||||||
|
|
||||||
const breakdown: AutoQueryDef = { |
const breakdown: AutoQueryDef = { |
||||||
title, |
...common, |
||||||
variant: 'p50', |
variant: 'p50', |
||||||
unit, |
queries: [percentileQuery(50, [VAR_GROUP_BY_EXP])], |
||||||
queries: [ |
vizBuilder: () => simpleGraphBuilder(breakdown), |
||||||
{ |
|
||||||
refId: 'A', |
|
||||||
expr: `histogram_quantile(0.50, sum by(le, ${VAR_GROUP_BY_EXP}) (rate(${VAR_METRIC_EXPR}${VAR_FILTERS_EXPR}[$__rate_interval])))`, |
|
||||||
}, |
|
||||||
], |
|
||||||
vizBuilder: simpleGraphBuilder, |
|
||||||
}; |
}; |
||||||
|
|
||||||
const percentiles: AutoQueryDef = { |
const percentiles: AutoQueryDef = { |
||||||
title, |
...common, |
||||||
variant: 'percentiles', |
variant: 'percentiles', |
||||||
unit, |
queries: [99, 90, 50].map((p) => percentileQuery(p)).map(fixRefIds), |
||||||
queries: [ |
vizBuilder: () => percentilesGraphBuilder(percentiles), |
||||||
{ |
|
||||||
refId: 'A', |
|
||||||
expr: `histogram_quantile(0.99, sum by(le) (rate(${VAR_METRIC_EXPR}${VAR_FILTERS_EXPR}[$__rate_interval])))`, |
|
||||||
legendFormat: '99th Percentile', |
|
||||||
}, |
|
||||||
{ |
|
||||||
refId: 'B', |
|
||||||
expr: `histogram_quantile(0.90, sum by(le) (rate(${VAR_METRIC_EXPR}${VAR_FILTERS_EXPR}[$__rate_interval])))`, |
|
||||||
legendFormat: '90th Percentile', |
|
||||||
}, |
|
||||||
{ |
|
||||||
refId: 'C', |
|
||||||
expr: `histogram_quantile(0.50, sum by(le) (rate(${VAR_METRIC_EXPR}${VAR_FILTERS_EXPR}[$__rate_interval])))`, |
|
||||||
legendFormat: '50th Percentile', |
|
||||||
}, |
|
||||||
], |
|
||||||
vizBuilder: percentilesGraphBuilder, |
|
||||||
}; |
}; |
||||||
|
|
||||||
const heatmap: AutoQueryDef = { |
const heatmap: AutoQueryDef = { |
||||||
title, |
...common, |
||||||
variant: 'heatmap', |
variant: 'heatmap', |
||||||
unit, |
queries: [heatMapQuery()], |
||||||
queries: [ |
vizBuilder: () => heatmapGraphBuilder(heatmap), |
||||||
{ |
|
||||||
refId: 'A', |
|
||||||
expr: `sum by(le) (rate(${VAR_METRIC_EXPR}${VAR_FILTERS_EXPR}[$__rate_interval]))`, |
|
||||||
format: 'heatmap', |
|
||||||
}, |
|
||||||
], |
|
||||||
vizBuilder: heatmapGraphBuilder, |
|
||||||
}; |
}; |
||||||
|
|
||||||
return { preview: p50, main: percentiles, variants: [percentiles, heatmap], breakdown: breakdown }; |
return { preview: p50, main: percentiles, variants: [percentiles, heatmap], breakdown: breakdown }; |
||||||
} |
} |
||||||
|
|
||||||
|
function fixRefIds(queryDef: PromQuery, index: number): PromQuery { |
||||||
|
// By default refIds are `"A"`
|
||||||
|
// This method will reassign based on `A + index` -- A, B, C, etc
|
||||||
|
return { |
||||||
|
...queryDef, |
||||||
|
refId: String.fromCharCode('A'.charCodeAt(0) + index), |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
export default { generator }; |
export default { generator }; |
||||||
|
|
||||||
|
const BASE_QUERY = `rate(${VAR_METRIC_EXPR}${VAR_FILTERS_EXPR}[$__rate_interval])`; |
||||||
|
|
||||||
|
function baseQuery(groupings: string[] = []) { |
||||||
|
const sumByList = ['le', ...groupings]; |
||||||
|
return `sum by(${sumByList.join(', ')}) (${BASE_QUERY})`; |
||||||
|
} |
||||||
|
|
||||||
|
function heatMapQuery(groupings: string[] = []) { |
||||||
|
return { |
||||||
|
refId: 'A', |
||||||
|
expr: baseQuery(groupings), |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
function percentileQuery(percentile: number, groupings: string[] = []) { |
||||||
|
const percent = percentile / 100; |
||||||
|
|
||||||
|
return { |
||||||
|
refId: 'A', |
||||||
|
expr: `histogram_quantile(${percent}, ${baseQuery(groupings)})`, |
||||||
|
legendFormat: `${percentile}th Percentile`, |
||||||
|
}; |
||||||
|
} |
||||||
|
Loading…
Reference in new issue