moira

Форк
0
/
cache.go 
57 строк · 1.5 Кб
1
package metrics
2

3
import (
4
	"github.com/rcrowley/go-metrics"
5
)
6

7
const (
8
	sdDropped   = "statsd.calls.dropped"
9
	sdFlushTime = "statsd.time.emit"
10
	sdQueueSize = "statsd.size.queue"
11
)
12

13
// metricsCache keeps metrics.Meter and metrics.Timer to aggregate delayed calls before flushing them
14
type metricsCache struct {
15
	data     map[string]pair
16
	registry metrics.Registry
17

18
	// self-diagnose metrics
19
	droppedCalls pair
20
	queueSize    pair
21
}
22

23
type pair struct {
24
	// meter is metrics.Histogram because default metrics.Meter has timer that locks its mutex every 5 seconds
25
	meter     metrics.Histogram
26
	histogram metrics.Histogram
27
}
28

29
func newMetricsCache() *metricsCache {
30
	metricsCache := &metricsCache{
31
		data:     make(map[string]pair, 256),
32
		registry: metrics.NewRegistry(),
33
	}
34

35
	metricsCache.droppedCalls = metricsCache.getOrCreate(sdDropped)
36
	metricsCache.queueSize = metricsCache.getOrCreate(sdQueueSize)
37

38
	return metricsCache
39
}
40

41
// getOrCreate returns an existing pair. If it doesn't exist, it is created.
42
// This function is not thread safe.
43
func (cache *metricsCache) getOrCreate(name string) pair {
44
	pair, ok := cache.data[name]
45
	if !ok {
46
		pair = cache.newPair(name)
47
		cache.data[name] = pair
48
	}
49
	return pair
50
}
51

52
func (cache *metricsCache) newPair(name string) pair {
53
	return pair{
54
		meter:     metrics.NewRegisteredHistogram(name, cache.registry, newMovingWindowSample()),
55
		histogram: metrics.NewRegisteredHistogram(name, cache.registry, metrics.NewExpDecaySample(movingWindowSize, 0.015)),
56
	}
57
}
58

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.