/
histogram.go
88 lines (73 loc) · 1.87 KB
/
histogram.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package exporter
import (
"fmt"
"github.com/chubaofs/chubaofs/util/log"
"github.com/prometheus/client_golang/prometheus"
"sync"
)
var (
// us 1us, 100us, 500us, 1ms, 5ms, 50ms, 200ms, 500ms, 1s, 3s
buckets = []float64{1, 50, 250, 500, 2500, 5000, 25000, 50000, 250000, 500000, 2500000, 5000000}
HistogramGroup sync.Map
HistogramCh chan *Histogram
once = sync.Once{}
)
func collectHistogram() {
HistogramCh = make(chan *Histogram, ChSize)
for {
m := <-HistogramCh
metric := m.Metric()
metric.Observe(m.val / 1000)
log.LogDebugf("collect metric %v", m)
}
}
type Histogram struct {
name string
labels map[string]string
val float64
ch chan interface{}
}
func (c *Histogram) Key() (key string) {
return stringMD5(c.Name())
}
func (g *Histogram) Name() string {
return fmt.Sprintf("{%s: %s}", g.name, stringMapToString(g.labels))
}
func (g *Histogram) String() string {
return fmt.Sprintf("{name: %s, labels: %s, val: %v}", g.name, stringMapToString(g.labels), g.val)
}
func (c *Histogram) Metric() prometheus.Histogram {
if enablePush {
once.Do(func() {
buckets = []float64{1, 300, 1000, 5000, 500000, 2500000}
})
}
metric := prometheus.NewHistogram(
prometheus.HistogramOpts{
Name: c.name,
ConstLabels: c.labels,
Buckets: buckets,
})
key := c.Key()
actualMetric, load := HistogramGroup.LoadOrStore(key, metric)
if load {
return actualMetric.(prometheus.Histogram)
}
if enablePush {
registry.MustRegister(actualMetric.(prometheus.Collector))
return actualMetric.(prometheus.Histogram)
}
err := prometheus.Register(actualMetric.(prometheus.Collector))
if err == nil {
log.LogInfof("register metric %v", c.Name())
} else {
log.LogErrorf("register metric %v, %v", c.Name(), err)
}
return actualMetric.(prometheus.Histogram)
}
func (h *Histogram) publish() {
select {
case HistogramCh <- h:
default:
}
}