From f77011fd34c40d148da36f8e5744080b5f3e6cd8 Mon Sep 17 00:00:00 2001 From: Pedro Tanaka Date: Fri, 11 Nov 2022 16:02:13 +0100 Subject: [PATCH] Allow creation of native histograms Signed-off-by: Pedro Tanaka --- pkg/mapper/mapper.go | 10 +++++++++- pkg/registry/registry.go | 18 +++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/pkg/mapper/mapper.go b/pkg/mapper/mapper.go index 879f18c..0f17165 100644 --- a/pkg/mapper/mapper.go +++ b/pkg/mapper/mapper.go @@ -64,7 +64,9 @@ type SummaryOptions struct { } type HistogramOptions struct { - Buckets []float64 `yaml:"buckets"` + Buckets []float64 `yaml:"buckets"` + NativeHistogramBucketFactor float64 `yaml:"native_histogram_bucket_factor"` + NativeHistogramMaxBuckets uint32 `yaml:"native_histogram_max_buckets"` } type metricObjective struct { @@ -88,6 +90,12 @@ func (m *MetricMapper) InitFromYAMLString(fileContents string) error { if len(n.Defaults.HistogramOptions.Buckets) == 0 { n.Defaults.HistogramOptions.Buckets = prometheus.DefBuckets } + if n.Defaults.HistogramOptions.NativeHistogramBucketFactor == 0 { + n.Defaults.HistogramOptions.NativeHistogramBucketFactor = 1.1 + } + if n.Defaults.HistogramOptions.NativeHistogramMaxBuckets <= 0 { + n.Defaults.HistogramOptions.NativeHistogramMaxBuckets = 256 + } if len(n.Defaults.SummaryOptions.Quantiles) == 0 { n.Defaults.SummaryOptions.Quantiles = defaultQuantiles diff --git a/pkg/registry/registry.go b/pkg/registry/registry.go index 87d39a1..825cb14 100644 --- a/pkg/registry/registry.go +++ b/pkg/registry/registry.go @@ -274,10 +274,22 @@ func (r *Registry) GetHistogram(metricName string, labels prometheus.Labels, hel if mapping.HistogramOptions != nil && len(mapping.HistogramOptions.Buckets) > 0 { buckets = mapping.HistogramOptions.Buckets } + + bucketFactor := r.Mapper.Defaults.HistogramOptions.NativeHistogramBucketFactor + if mapping.HistogramOptions != nil && mapping.HistogramOptions.NativeHistogramBucketFactor > 0 { + bucketFactor = mapping.HistogramOptions.NativeHistogramBucketFactor + } + + maxBuckets := r.Mapper.Defaults.HistogramOptions.NativeHistogramMaxBuckets + if mapping.HistogramOptions != nil && mapping.HistogramOptions.NativeHistogramMaxBuckets > 0 { + maxBuckets = mapping.HistogramOptions.NativeHistogramMaxBuckets + } histogramVec = prometheus.NewHistogramVec(prometheus.HistogramOpts{ - Name: metricName, - Help: help, - Buckets: buckets, + Name: metricName, + Help: help, + Buckets: buckets, + NativeHistogramBucketFactor: bucketFactor, + NativeHistogramMaxBucketNumber: maxBuckets, }, labelNames) if err := r.Registerer.Register(uncheckedCollector{histogramVec}); err != nil {