moira
1package metrics2
3import (4"github.com/rcrowley/go-metrics"5)
6
7const (8sdDropped = "statsd.calls.dropped"9sdFlushTime = "statsd.time.emit"10sdQueueSize = "statsd.size.queue"11)
12
13// metricsCache keeps metrics.Meter and metrics.Timer to aggregate delayed calls before flushing them
14type metricsCache struct {15data map[string]pair16registry metrics.Registry17
18// self-diagnose metrics19droppedCalls pair
20queueSize pair
21}
22
23type pair struct {24// meter is metrics.Histogram because default metrics.Meter has timer that locks its mutex every 5 seconds25meter metrics.Histogram26histogram metrics.Histogram27}
28
29func newMetricsCache() *metricsCache {30metricsCache := &metricsCache{31data: make(map[string]pair, 256),32registry: metrics.NewRegistry(),33}34
35metricsCache.droppedCalls = metricsCache.getOrCreate(sdDropped)36metricsCache.queueSize = metricsCache.getOrCreate(sdQueueSize)37
38return metricsCache39}
40
41// getOrCreate returns an existing pair. If it doesn't exist, it is created.
42// This function is not thread safe.
43func (cache *metricsCache) getOrCreate(name string) pair {44pair, ok := cache.data[name]45if !ok {46pair = cache.newPair(name)47cache.data[name] = pair48}49return pair50}
51
52func (cache *metricsCache) newPair(name string) pair {53return pair{54meter: metrics.NewRegisteredHistogram(name, cache.registry, newMovingWindowSample()),55histogram: metrics.NewRegisteredHistogram(name, cache.registry, metrics.NewExpDecaySample(movingWindowSize, 0.015)),56}57}
58