diff --git a/CHANGELOG.md b/CHANGELOG.md index 52e44b86fd..4f4f072538 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ * [ENHANCEMENT] Tenant Federation: Add a local cache to regex resolver. #7363 * [ENHANCEMENT] Query Scheduler: Add `cortex_query_scheduler_tracked_requests` metric to track the current number of requests held by the scheduler. #7355 * [BUGFIX] Fix nil when ingester_query_max_attempts > 1. #7369 +* [BUGFIX] Metrics Helper: Fix non-deterministic bucket order in merged histograms by sorting buckets after map iteration, matching Prometheus client library behavior. #7380 ## 1.21.0 in progress diff --git a/pkg/util/metrics_helper.go b/pkg/util/metrics_helper.go index 6dbe6348db..a318582dd7 100644 --- a/pkg/util/metrics_helper.go +++ b/pkg/util/metrics_helper.go @@ -1129,6 +1129,10 @@ func mergeHistogram(mf1, mf2 *dto.Metric) { ccValue := cumulativeCount newBucket = append(newBucket, &dto.Bucket{UpperBound: &ubValue, CumulativeCount: &ccValue}) } + // Sort buckets by UpperBound to ensure deterministic order + sort.Slice(newBucket, func(i, j int) bool { + return newBucket[i].GetUpperBound() < newBucket[j].GetUpperBound() + }) h1.Bucket = newBucket } }