-
Notifications
You must be signed in to change notification settings - Fork 1
/
gauge.go
113 lines (97 loc) · 2.36 KB
/
gauge.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// Copyright 2018 The Chubao Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
// implied. See the License for the specific language governing
// permissions and limitations under the License.
package exporter
import (
"fmt"
"sync"
"github.com/chengyu-l/ecnode_checker/pkg/chubaofs/util/log"
"github.com/prometheus/client_golang/prometheus"
)
var (
GaugePool = &sync.Pool{New: func() interface{} {
return new(Gauge)
}}
GaugeGroup sync.Map
GaugeCh chan *Gauge
)
func collectGauge() {
GaugeCh = make(chan *Gauge, ChSize)
for {
m := <-GaugeCh
metric := m.Metric()
metric.Set(float64(m.val))
log.LogDebugf("collect metric %v", m)
}
}
type Gauge struct {
name string
labels map[string]string
val int64
ch chan interface{}
}
func NewGauge(name string) (g *Gauge) {
if !enabledPrometheus {
return
}
g = new(Gauge)
g.name = metricsName(name)
return
}
func (c *Gauge) Key() (key string) {
return stringMD5(c.Name())
}
func (g *Gauge) Name() string {
return fmt.Sprintf("{%s: %s}", g.name, stringMapToString(g.labels))
}
func (g *Gauge) String() string {
return fmt.Sprintf("{name: %s, labels: %s, val: %v}", g.name, stringMapToString(g.labels), g.val)
}
func (c *Gauge) Metric() prometheus.Gauge {
metric := prometheus.NewGauge(
prometheus.GaugeOpts{
Name: c.name,
ConstLabels: c.labels,
})
key := c.Key()
actualMetric, load := GaugeGroup.LoadOrStore(key, metric)
if !load {
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.Gauge)
}
func (g *Gauge) Set(val int64) {
if !enabledPrometheus {
return
}
g.val = val
g.publish()
}
func (c *Gauge) publish() {
select {
case GaugeCh <- c:
default:
}
}
func (g *Gauge) SetWithLabels(val int64, labels map[string]string) {
if !enabledPrometheus {
return
}
g.labels = labels
g.Set(val)
}