K8s: Merge metric registries (#79256)

This commit is contained in:
Todd Treece 2023-12-08 10:44:46 -05:00 committed by GitHub
parent 1833539c32
commit 89934b0884
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"errors" "errors"
"regexp" "regexp"
"sort"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
dto "github.com/prometheus/client_model/go" dto "github.com/prometheus/client_model/go"
@ -68,8 +69,10 @@ func ProvideRegisterer(cfg *setting.Cfg) prometheus.Registerer {
func ProvideGatherer(cfg *setting.Cfg) prometheus.Gatherer { func ProvideGatherer(cfg *setting.Cfg) prometheus.Gatherer {
if cfg.IsFeatureToggleEnabled(featuremgmt.FlagGrafanaAPIServer) { if cfg.IsFeatureToggleEnabled(featuremgmt.FlagGrafanaAPIServer) {
return newAddPrefixWrapper(legacyregistry.DefaultGatherer) k8sGatherer := newAddPrefixWrapper(legacyregistry.DefaultGatherer)
return newMultiRegistry(k8sGatherer, prometheus.DefaultGatherer)
} }
return prometheus.DefaultGatherer return prometheus.DefaultGatherer
} }
@ -122,3 +125,40 @@ func (g *addPrefixWrapper) Gather() ([]*dto.MetricFamily, error) {
return mf, nil return mf, nil
} }
var _ prometheus.Gatherer = (*multiRegistry)(nil)
type multiRegistry struct {
gatherers []prometheus.Gatherer
}
func newMultiRegistry(gatherers ...prometheus.Gatherer) *multiRegistry {
return &multiRegistry{
gatherers: gatherers,
}
}
func (r *multiRegistry) Gather() (mfs []*dto.MetricFamily, err error) {
errs := prometheus.MultiError{}
names := make(map[string]struct{})
for _, g := range r.gatherers {
mf, err := g.Gather()
errs.Append(err)
for i := 0; i < len(mf); i++ {
m := mf[i]
// prevent duplicate metric names
if _, exists := names[*m.Name]; !exists {
names[*m.Name] = struct{}{}
mfs = append(mfs, m)
}
}
}
sort.Slice(mfs, func(i, j int) bool {
return *mfs[i].Name < *mfs[j].Name
})
return mfs, errs.MaybeUnwrap()
}