Skip to content

Commit 8772c03

Browse files
author
Matthias Rampke
authored
Merge pull request #347 from grafana/custom-registry
Pass around custom registry for registering exporter metrics
2 parents dcd95d0 + b5deeda commit 8772c03

8 files changed

+81
-65
lines changed

bridge_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,7 @@ mappings:
657657
events := make(chan event.Events)
658658
defer close(events)
659659
go func() {
660-
ex := exporter.NewExporter(testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
660+
ex := exporter.NewExporter(prometheus.DefaultRegisterer, testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
661661
ex.Listen(events)
662662
}()
663663

exporter_benchmark_test.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919

2020
"github.com/go-kit/kit/log"
2121

22+
"github.com/prometheus/client_golang/prometheus"
2223
"github.com/prometheus/statsd_exporter/pkg/event"
2324
"github.com/prometheus/statsd_exporter/pkg/exporter"
2425
"github.com/prometheus/statsd_exporter/pkg/line"
@@ -171,7 +172,7 @@ mappings:
171172
b.Fatalf("Config load error: %s %s", config, err)
172173
}
173174

174-
ex := exporter.NewExporter(testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
175+
ex := exporter.NewExporter(prometheus.DefaultRegisterer, testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
175176

176177
// reset benchmark timer to not measure startup costs
177178
b.ResetTimer()

main.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ func main() {
438438

439439
}
440440

441-
mapper := &mapper.MetricMapper{MappingsCount: mappingsCount}
441+
mapper := &mapper.MetricMapper{Registerer: prometheus.DefaultRegisterer, MappingsCount: mappingsCount}
442442
if *mappingConfig != "" {
443443
err := mapper.InitFromFile(*mappingConfig, *cacheSize, cacheOption)
444444
if err != nil {
@@ -458,7 +458,7 @@ func main() {
458458
mapper.InitCache(*cacheSize, cacheOption)
459459
}
460460

461-
exporter := exporter.NewExporter(mapper, logger, eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
461+
exporter := exporter.NewExporter(prometheus.DefaultRegisterer, mapper, logger, eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
462462

463463
if *checkConfig {
464464
level.Info(logger).Log("msg", "Configuration check successful, exiting")

pkg/exporter/exporter.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -189,10 +189,10 @@ func (b *Exporter) handleEvent(thisEvent event.Event) {
189189
}
190190
}
191191

192-
func NewExporter(mapper *mapper.MetricMapper, logger log.Logger, eventsActions *prometheus.CounterVec, eventsUnmapped prometheus.Counter, errorEventStats *prometheus.CounterVec, eventStats *prometheus.CounterVec, conflictingEventStats *prometheus.CounterVec, metricsCount *prometheus.GaugeVec) *Exporter {
192+
func NewExporter(reg prometheus.Registerer, mapper *mapper.MetricMapper, logger log.Logger, eventsActions *prometheus.CounterVec, eventsUnmapped prometheus.Counter, errorEventStats *prometheus.CounterVec, eventStats *prometheus.CounterVec, conflictingEventStats *prometheus.CounterVec, metricsCount *prometheus.GaugeVec) *Exporter {
193193
return &Exporter{
194194
Mapper: mapper,
195-
Registry: registry.NewRegistry(mapper),
195+
Registry: registry.NewRegistry(reg, mapper),
196196
Logger: logger,
197197
EventsActions: eventsActions,
198198
EventsUnmapped: eventsUnmapped,

pkg/exporter/exporter_test.go

+12-12
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ func TestNegativeCounter(t *testing.T) {
184184
testMapper := mapper.MetricMapper{}
185185
testMapper.InitCache(0)
186186

187-
ex := NewExporter(&testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
187+
ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
188188
ex.Listen(events)
189189

190190
updated := getTelemetryCounterValue(errorCounter)
@@ -265,7 +265,7 @@ mappings:
265265
t.Fatalf("Config load error: %s %s", config, err)
266266
}
267267

268-
ex := NewExporter(testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
268+
ex := NewExporter(prometheus.DefaultRegisterer, testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
269269
ex.Listen(events)
270270

271271
metrics, err := prometheus.DefaultGatherer.Gather()
@@ -323,7 +323,7 @@ mappings:
323323
t.Fatalf("Config load error: %s %s", config, err)
324324
}
325325

326-
ex := NewExporter(testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
326+
ex := NewExporter(prometheus.DefaultRegisterer, testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
327327
ex.Listen(events)
328328

329329
metrics, err := prometheus.DefaultGatherer.Gather()
@@ -538,7 +538,7 @@ mappings:
538538
events <- s.in
539539
close(events)
540540
}()
541-
ex := NewExporter(testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
541+
ex := NewExporter(prometheus.DefaultRegisterer, testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
542542
ex.Listen(events)
543543

544544
metrics, err := prometheus.DefaultGatherer.Gather()
@@ -593,7 +593,7 @@ mappings:
593593
errorCounter := errorEventStats.WithLabelValues("empty_metric_name")
594594
prev := getTelemetryCounterValue(errorCounter)
595595

596-
ex := NewExporter(testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
596+
ex := NewExporter(prometheus.DefaultRegisterer, testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
597597
ex.Listen(events)
598598

599599
updated := getTelemetryCounterValue(errorCounter)
@@ -660,7 +660,7 @@ func TestInvalidUtf8InDatadogTagValue(t *testing.T) {
660660
testMapper := mapper.MetricMapper{}
661661
testMapper.InitCache(0)
662662

663-
ex := NewExporter(&testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
663+
ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
664664
ex.Listen(events)
665665
}
666666

@@ -674,7 +674,7 @@ func TestSummaryWithQuantilesEmptyMapping(t *testing.T) {
674674
testMapper := mapper.MetricMapper{}
675675
testMapper.InitCache(0)
676676

677-
ex := NewExporter(&testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
677+
ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
678678
ex.Listen(events)
679679
}()
680680

@@ -718,7 +718,7 @@ func TestHistogramUnits(t *testing.T) {
718718
go func() {
719719
testMapper := mapper.MetricMapper{}
720720
testMapper.InitCache(0)
721-
ex := NewExporter(&testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
721+
ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
722722
ex.Mapper.Defaults.ObserverType = mapper.ObserverTypeHistogram
723723
ex.Listen(events)
724724
}()
@@ -755,7 +755,7 @@ func TestCounterIncrement(t *testing.T) {
755755
go func() {
756756
testMapper := mapper.MetricMapper{}
757757
testMapper.InitCache(0)
758-
ex := NewExporter(&testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
758+
ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
759759
ex.Listen(events)
760760
}()
761761

@@ -864,7 +864,7 @@ mappings:
864864
events := make(chan event.Events)
865865
defer close(events)
866866
go func() {
867-
ex := NewExporter(testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
867+
ex := NewExporter(prometheus.DefaultRegisterer, testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount)
868868
ex.Listen(events)
869869
}()
870870

@@ -952,7 +952,7 @@ mappings:
952952
}
953953

954954
func TestHashLabelNames(t *testing.T) {
955-
r := registry.NewRegistry(nil)
955+
r := registry.NewRegistry(prometheus.DefaultRegisterer, nil)
956956
// Validate value hash changes and name has doesn't when just the value changes.
957957
hash1, _ := r.HashLabels(map[string]string{
958958
"label": "value1",
@@ -1113,7 +1113,7 @@ func BenchmarkHashNameAndLabels(b *testing.B) {
11131113
},
11141114
}
11151115

1116-
r := registry.NewRegistry(nil)
1116+
r := registry.NewRegistry(prometheus.DefaultRegisterer, nil)
11171117
for _, s := range scenarios {
11181118
b.Run(s.name, func(b *testing.B) {
11191119
for n := 0; n < b.N; n++ {

pkg/mapper/mapper.go

+11-10
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,14 @@ var (
3636
)
3737

3838
type MetricMapper struct {
39-
Defaults mapperConfigDefaults `yaml:"defaults"`
40-
Mappings []MetricMapping `yaml:"mappings"`
41-
FSM *fsm.FSM
42-
doFSM bool
43-
doRegex bool
44-
cache MetricMapperCache
45-
mutex sync.RWMutex
39+
Registerer prometheus.Registerer
40+
Defaults mapperConfigDefaults `yaml:"defaults"`
41+
Mappings []MetricMapping `yaml:"mappings"`
42+
FSM *fsm.FSM
43+
doFSM bool
44+
doRegex bool
45+
cache MetricMapperCache
46+
mutex sync.RWMutex
4647

4748
MappingsCount prometheus.Gauge
4849
}
@@ -252,7 +253,7 @@ func (m *MetricMapper) InitFromFile(fileName string, cacheSize int, options ...C
252253

253254
func (m *MetricMapper) InitCache(cacheSize int, options ...CacheOption) {
254255
if cacheSize == 0 {
255-
m.cache = NewMetricMapperNoopCache()
256+
m.cache = NewMetricMapperNoopCache(m.Registerer)
256257
} else {
257258
o := cacheOptions{
258259
cacheType: "lru",
@@ -267,9 +268,9 @@ func (m *MetricMapper) InitCache(cacheSize int, options ...CacheOption) {
267268
)
268269
switch o.cacheType {
269270
case "lru":
270-
cache, err = NewMetricMapperCache(cacheSize)
271+
cache, err = NewMetricMapperCache(m.Registerer, cacheSize)
271272
case "random":
272-
cache, err = NewMetricMapperRRCache(cacheSize)
273+
cache, err = NewMetricMapperRRCache(m.Registerer, cacheSize)
273274
default:
274275
err = fmt.Errorf("unsupported cache type %q", o.cacheType)
275276
}

pkg/mapper/mapper_cache.go

+41-29
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,41 @@ import (
2020
"github.com/prometheus/client_golang/prometheus"
2121
)
2222

23-
var (
24-
cacheLength = prometheus.NewGauge(
23+
type CacheMetrics struct {
24+
CacheLength prometheus.Gauge
25+
CacheGetsTotal prometheus.Counter
26+
CacheHitsTotal prometheus.Counter
27+
}
28+
29+
func NewCacheMetrics(reg prometheus.Registerer) *CacheMetrics {
30+
var m CacheMetrics
31+
32+
m.CacheLength = prometheus.NewGauge(
2533
prometheus.GaugeOpts{
2634
Name: "statsd_metric_mapper_cache_length",
2735
Help: "The count of unique metrics currently cached.",
2836
},
2937
)
30-
cacheGetsTotal = prometheus.NewCounter(
38+
m.CacheGetsTotal = prometheus.NewCounter(
3139
prometheus.CounterOpts{
3240
Name: "statsd_metric_mapper_cache_gets_total",
3341
Help: "The count of total metric cache gets.",
3442
},
3543
)
36-
cacheHitsTotal = prometheus.NewCounter(
44+
m.CacheHitsTotal = prometheus.NewCounter(
3745
prometheus.CounterOpts{
3846
Name: "statsd_metric_mapper_cache_hits_total",
3947
Help: "The count of total metric cache hits.",
4048
},
4149
)
42-
)
50+
51+
if reg != nil {
52+
reg.MustRegister(m.CacheLength)
53+
reg.MustRegister(m.CacheGetsTotal)
54+
reg.MustRegister(m.CacheHitsTotal)
55+
}
56+
return &m
57+
}
4358

4459
type cacheOptions struct {
4560
cacheType string
@@ -67,26 +82,28 @@ type MetricMapperCache interface {
6782

6883
type MetricMapperLRUCache struct {
6984
MetricMapperCache
70-
cache *lru.Cache
85+
cache *lru.Cache
86+
metrics *CacheMetrics
7187
}
7288

7389
type MetricMapperNoopCache struct {
7490
MetricMapperCache
91+
metrics *CacheMetrics
7592
}
7693

77-
func NewMetricMapperCache(size int) (*MetricMapperLRUCache, error) {
78-
cacheLength.Set(0)
94+
func NewMetricMapperCache(reg prometheus.Registerer, size int) (*MetricMapperLRUCache, error) {
95+
metrics := NewCacheMetrics(reg)
7996
cache, err := lru.New(size)
8097
if err != nil {
8198
return &MetricMapperLRUCache{}, err
8299
}
83-
return &MetricMapperLRUCache{cache: cache}, nil
100+
return &MetricMapperLRUCache{metrics: metrics, cache: cache}, nil
84101
}
85102

86103
func (m *MetricMapperLRUCache) Get(metricString string, metricType MetricType) (*MetricMapperCacheResult, bool) {
87-
cacheGetsTotal.Inc()
104+
m.metrics.CacheGetsTotal.Inc()
88105
if result, ok := m.cache.Get(formatKey(metricString, metricType)); ok {
89-
cacheHitsTotal.Inc()
106+
m.metrics.CacheHitsTotal.Inc()
90107
return result.(*MetricMapperCacheResult), true
91108
} else {
92109
return nil, false
@@ -104,16 +121,15 @@ func (m *MetricMapperLRUCache) AddMiss(metricString string, metricType MetricTyp
104121
}
105122

106123
func (m *MetricMapperLRUCache) trackCacheLength() {
107-
cacheLength.Set(float64(m.cache.Len()))
124+
m.metrics.CacheLength.Set(float64(m.cache.Len()))
108125
}
109126

110127
func formatKey(metricString string, metricType MetricType) string {
111128
return string(metricType) + "." + metricString
112129
}
113130

114-
func NewMetricMapperNoopCache() *MetricMapperNoopCache {
115-
cacheLength.Set(0)
116-
return &MetricMapperNoopCache{}
131+
func NewMetricMapperNoopCache(reg prometheus.Registerer) *MetricMapperNoopCache {
132+
return &MetricMapperNoopCache{metrics: NewCacheMetrics(reg)}
117133
}
118134

119135
func (m *MetricMapperNoopCache) Get(metricString string, metricType MetricType) (*MetricMapperCacheResult, bool) {
@@ -130,16 +146,18 @@ func (m *MetricMapperNoopCache) AddMiss(metricString string, metricType MetricTy
130146

131147
type MetricMapperRRCache struct {
132148
MetricMapperCache
133-
lock sync.RWMutex
134-
size int
135-
items map[string]*MetricMapperCacheResult
149+
lock sync.RWMutex
150+
size int
151+
items map[string]*MetricMapperCacheResult
152+
metrics *CacheMetrics
136153
}
137154

138-
func NewMetricMapperRRCache(size int) (*MetricMapperRRCache, error) {
139-
cacheLength.Set(0)
155+
func NewMetricMapperRRCache(reg prometheus.Registerer, size int) (*MetricMapperRRCache, error) {
156+
metrics := NewCacheMetrics(reg)
140157
c := &MetricMapperRRCache{
141-
items: make(map[string]*MetricMapperCacheResult, size+1),
142-
size: size,
158+
items: make(map[string]*MetricMapperCacheResult, size+1),
159+
size: size,
160+
metrics: metrics,
143161
}
144162
return c, nil
145163
}
@@ -188,11 +206,5 @@ func (m *MetricMapperRRCache) trackCacheLength() {
188206
m.lock.RLock()
189207
length := len(m.items)
190208
m.lock.RUnlock()
191-
cacheLength.Set(float64(length))
192-
}
193-
194-
func init() {
195-
prometheus.MustRegister(cacheLength)
196-
prometheus.MustRegister(cacheGetsTotal)
197-
prometheus.MustRegister(cacheHitsTotal)
209+
m.metrics.CacheLength.Set(float64(length))
198210
}

pkg/registry/registry.go

+10-8
Original file line numberDiff line numberDiff line change
@@ -40,20 +40,22 @@ func (u uncheckedCollector) Collect(c chan<- prometheus.Metric) {
4040
}
4141

4242
type Registry struct {
43-
Metrics map[string]metrics.Metric
44-
Mapper *mapper.MetricMapper
43+
Registerer prometheus.Registerer
44+
Metrics map[string]metrics.Metric
45+
Mapper *mapper.MetricMapper
4546
// The below value and label variables are allocated in the registry struct
4647
// so that we don't have to allocate them every time have to compute a label
4748
// hash.
4849
ValueBuf, NameBuf bytes.Buffer
4950
Hasher hash.Hash64
5051
}
5152

52-
func NewRegistry(mapper *mapper.MetricMapper) *Registry {
53+
func NewRegistry(reg prometheus.Registerer, mapper *mapper.MetricMapper) *Registry {
5354
return &Registry{
54-
Metrics: make(map[string]metrics.Metric),
55-
Mapper: mapper,
56-
Hasher: fnv.New64a(),
55+
Registerer: reg,
56+
Metrics: make(map[string]metrics.Metric),
57+
Mapper: mapper,
58+
Hasher: fnv.New64a(),
5759
}
5860
}
5961

@@ -170,7 +172,7 @@ func (r *Registry) GetCounter(metricName string, labels prometheus.Labels, help
170172
Help: help,
171173
}, labelNames)
172174

173-
if err := prometheus.Register(uncheckedCollector{counterVec}); err != nil {
175+
if err := r.Registerer.Register(uncheckedCollector{counterVec}); err != nil {
174176
return nil, err
175177
}
176178
} else {
@@ -206,7 +208,7 @@ func (r *Registry) GetGauge(metricName string, labels prometheus.Labels, help st
206208
Help: help,
207209
}, labelNames)
208210

209-
if err := prometheus.Register(uncheckedCollector{gaugeVec}); err != nil {
211+
if err := r.Registerer.Register(uncheckedCollector{gaugeVec}); err != nil {
210212
return nil, err
211213
}
212214
} else {

0 commit comments

Comments
 (0)