From 50d237dcd8473ffe1937f5ef8e3396905f1da3cc Mon Sep 17 00:00:00 2001 From: Julius Hinze Date: Fri, 5 Dec 2025 13:15:08 +0100 Subject: [PATCH] grafana-builder: support from_recording in latencyPanelNativeHistogram --- grafana-builder/grafana.libsonnet | 10 ++-- .../test_native-classic-histogram.libsonnet | 46 +++++++++++++++++++ 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/grafana-builder/grafana.libsonnet b/grafana-builder/grafana.libsonnet index 06f4e389a..a12862f56 100644 --- a/grafana-builder/grafana.libsonnet +++ b/grafana-builder/grafana.libsonnet @@ -552,7 +552,7 @@ local utils = import 'mixin-utils/utils.libsonnet'; // Assumes that there is a dashboard variable named latency_metrics, values are -1 (native) or 1 (classic) // By default it shows the 99th and 50th quantile. - latencyPanelNativeHistogram(metricName, selector, multiplier='1e3', quantile=[99, 50]):: { + latencyPanelNativeHistogram(metricName, selector, multiplier='1e3', quantile=[99, 50], from_recording=false):: { nullPointMode: 'null as zero', fieldConfig+: { defaults+: { @@ -570,13 +570,13 @@ local utils = import 'mixin-utils/utils.libsonnet'; local qStr = std.toString(q); acc + [ { - expr: utils.showNativeHistogramQuery(utils.ncHistogramQuantile(std.format('%.2f', q / 100), metricName, selector, multiplier=multiplier)), + expr: utils.showNativeHistogramQuery(utils.ncHistogramQuantile(std.format('%.2f', q / 100), metricName, selector, multiplier=multiplier, from_recording=from_recording)), format: 'time_series', legendFormat: qStr + 'th percentile', refId: getNextRefId(acc), }, { - expr: utils.showClassicHistogramQuery(utils.ncHistogramQuantile(std.format('%.2f', q / 100), metricName, selector, multiplier=multiplier)), + expr: utils.showClassicHistogramQuery(utils.ncHistogramQuantile(std.format('%.2f', q / 100), metricName, selector, multiplier=multiplier, from_recording=from_recording)), format: 'time_series', legendFormat: qStr + 'th percentile', refId: getNextRefId(acc) + '_classic', @@ -589,13 +589,13 @@ local utils = import 'mixin-utils/utils.libsonnet'; qTargets + [ { - expr: utils.showNativeHistogramQuery(utils.ncHistogramAverageRate(metricName, selector, multiplier=multiplier)), + expr: utils.showNativeHistogramQuery(utils.ncHistogramAverageRate(metricName, selector, multiplier=multiplier, from_recording=from_recording)), format: 'time_series', legendFormat: 'Average', refId: getNextRefId(qTargets), }, { - expr: utils.showClassicHistogramQuery(utils.ncHistogramAverageRate(metricName, selector, multiplier=multiplier)), + expr: utils.showClassicHistogramQuery(utils.ncHistogramAverageRate(metricName, selector, multiplier=multiplier, from_recording=from_recording)), format: 'time_series', legendFormat: 'Average', refId: getNextRefId(qTargets) + '_classic', diff --git a/grafana-builder/test/test_native-classic-histogram.libsonnet b/grafana-builder/test/test_native-classic-histogram.libsonnet index c78e295e1..bbdfffd09 100644 --- a/grafana-builder/test/test_native-classic-histogram.libsonnet +++ b/grafana-builder/test/test_native-classic-histogram.libsonnet @@ -59,3 +59,49 @@ test.new(std.thisFile) ], ) ) + + ++ test.case.new( + name='LatencyPanel from recording', + test=test.expect.eq( + actual=std.get(builder.latencyPanelNativeHistogram('cluster_job_route:cortex_request_duration_seconds_bucket', 'cluster="cluster1"', '1e3', [99, 50], true), 'targets'), + expected=[ + { + expr: '(histogram_quantile(0.99, sum (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster="cluster1"})) * 1e3) and on() (vector($latency_metrics) == -1)', + format: 'time_series', + legendFormat: '99th percentile', + refId: 'A', + }, + { + expr: '(histogram_quantile(0.99, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket_bucket:sum_rate{cluster="cluster1"})) * 1e3) and on() (vector($latency_metrics) == 1)', + format: 'time_series', + legendFormat: '99th percentile', + refId: 'A_classic', + }, + { + expr: '(histogram_quantile(0.50, sum (cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster="cluster1"})) * 1e3) and on() (vector($latency_metrics) == -1)', + format: 'time_series', + legendFormat: '50th percentile', + refId: 'B', + }, + { + expr: '(histogram_quantile(0.50, sum by (le) (cluster_job_route:cortex_request_duration_seconds_bucket_bucket:sum_rate{cluster="cluster1"})) * 1e3) and on() (vector($latency_metrics) == 1)', + format: 'time_series', + legendFormat: '50th percentile', + refId: 'B_classic', + }, + { + expr: '(1e3 * sum(histogram_sum(cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster="cluster1"})) /\nsum(histogram_count(cluster_job_route:cortex_request_duration_seconds_bucket:sum_rate{cluster="cluster1"}))\n) and on() (vector($latency_metrics) == -1)', + format: 'time_series', + legendFormat: 'Average', + refId: 'C', + }, + { + expr: '(1e3 * sum(cluster_job_route:cortex_request_duration_seconds_bucket_sum:sum_rate{cluster="cluster1"}) /\nsum(cluster_job_route:cortex_request_duration_seconds_bucket_count:sum_rate{cluster="cluster1"})\n) and on() (vector($latency_metrics) == 1)', + format: 'time_series', + legendFormat: 'Average', + refId: 'C_classic', + }, + ] + ) +)