From 7781ddae916f0014a604be9e932b0e064ec30a2d Mon Sep 17 00:00:00 2001 From: Julius Hinze Date: Mon, 24 Nov 2025 12:51:15 +0100 Subject: [PATCH] mixin-utils: add sum_by parameters to ncHistogramAverageRate --- .../test/test_native-classic-histogram.libsonnet | 10 ++++++++++ mixin-utils/utils.libsonnet | 13 ++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/mixin-utils/test/test_native-classic-histogram.libsonnet b/mixin-utils/test/test_native-classic-histogram.libsonnet index 5d762c710..f5139ef96 100644 --- a/mixin-utils/test/test_native-classic-histogram.libsonnet +++ b/mixin-utils/test/test_native-classic-histogram.libsonnet @@ -116,6 +116,16 @@ test.new(std.thisFile) }, ) ) ++ test.case.new( + name='rate of average with sum_by labels', + test=test.expect.eq( + actual=utils.ncHistogramAverageRate('request_duration_seconds', 'cluster="cluster1", job="job1"', sum_by=['namespace']), + expected={ + classic: 'sum by (namespace) (rate(request_duration_seconds_sum{cluster="cluster1", job="job1"}[$__rate_interval])) /\nsum by (namespace) (rate(request_duration_seconds_count{cluster="cluster1", job="job1"}[$__rate_interval]))\n', + native: 'sum by (namespace) (histogram_sum(rate(request_duration_seconds{cluster="cluster1", job="job1"}[$__rate_interval]))) /\nsum by (namespace) (histogram_count(rate(request_duration_seconds{cluster="cluster1", job="job1"}[$__rate_interval])))\n', + }, + ) +) + test.case.new( name='rate of average in recording rule with different interval, multiplier', test=test.expect.eq( diff --git a/mixin-utils/utils.libsonnet b/mixin-utils/utils.libsonnet index 45906149d..84c46c69d 100644 --- a/mixin-utils/utils.libsonnet +++ b/mixin-utils/utils.libsonnet @@ -100,24 +100,27 @@ local g = import 'grafana-builder/grafana.libsonnet'; // classic histograms. // If from_recording is true, the function will assume :sum_rate metric // suffix and no rate needed. - ncHistogramAverageRate(metric, selector, rate_interval='$__rate_interval', multiplier='', from_recording=false):: + ncHistogramAverageRate(metric, selector, rate_interval='$__rate_interval', multiplier='', from_recording=false, sum_by=[]):: + local sumBy = if std.length(sum_by) > 0 then ' by (%s) ' % std.join(', ', sum_by) else ''; local multiplierStr = if multiplier == '' then '' else '%s * ' % multiplier; { classic: ||| - %(multiplier)ssum(%(sumMetricQuery)s) / - sum(%(countMetricQuery)s) + %(multiplier)ssum%(sumBy)s(%(sumMetricQuery)s) / + sum%(sumBy)s(%(countMetricQuery)s) ||| % { sumMetricQuery: $.ncHistogramSumRate(metric, selector, rate_interval, from_recording).classic, countMetricQuery: $.ncHistogramCountRate(metric, selector, rate_interval, from_recording).classic, multiplier: multiplierStr, + sumBy: sumBy, }, native: ||| - %(multiplier)ssum(%(sumMetricQuery)s) / - sum(%(countMetricQuery)s) + %(multiplier)ssum%(sumBy)s(%(sumMetricQuery)s) / + sum%(sumBy)s(%(countMetricQuery)s) ||| % { sumMetricQuery: $.ncHistogramSumRate(metric, selector, rate_interval, from_recording).native, countMetricQuery: $.ncHistogramCountRate(metric, selector, rate_interval, from_recording).native, multiplier: multiplierStr, + sumBy: sumBy, }, },