Skip to content

Commit

Permalink
K8s: Merge metric registries (grafana#79256)
Browse files Browse the repository at this point in the history
  • Loading branch information
toddtreece authored Dec 8, 2023
1 parent 1833539 commit 89934b0
Showing 1 changed file with 41 additions and 1 deletion.
42 changes: 41 additions & 1 deletion pkg/infra/metrics/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"errors"
"regexp"
"sort"

"github.com/prometheus/client_golang/prometheus"
dto "github.com/prometheus/client_model/go"
Expand Down Expand Up @@ -68,8 +69,10 @@ func ProvideRegisterer(cfg *setting.Cfg) prometheus.Registerer {

func ProvideGatherer(cfg *setting.Cfg) prometheus.Gatherer {
if cfg.IsFeatureToggleEnabled(featuremgmt.FlagGrafanaAPIServer) {
return newAddPrefixWrapper(legacyregistry.DefaultGatherer)
k8sGatherer := newAddPrefixWrapper(legacyregistry.DefaultGatherer)
return newMultiRegistry(k8sGatherer, prometheus.DefaultGatherer)
}

return prometheus.DefaultGatherer
}

Expand Down Expand Up @@ -122,3 +125,40 @@ func (g *addPrefixWrapper) Gather() ([]*dto.MetricFamily, error) {

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()
}

0 comments on commit 89934b0

Please sign in to comment.