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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
package metrics
import (
"fmt"
"github.com/prometheus/client_golang/prometheus"
)
// Config configures metrics service.
type Config struct {
// Address to listen
Address string
// Collect define application specific metrics.
Collect map[string]Collector
}
type NamedCollector struct {
// Name of the collector
Name string `json:"name"`
// Collector structure
Collector `json:"collector"`
}
// CollectorType represents prometheus collector types
type CollectorType string
const (
// Histogram type
Histogram CollectorType = "histogram"
// Gauge type
Gauge CollectorType = "gauge"
// Counter type
Counter CollectorType = "counter"
// Summary type
Summary CollectorType = "summary"
)
// Collector describes single application specific metric.
type Collector struct {
// Namespace of the metric.
Namespace string `json:"namespace"`
// Subsystem of the metric.
Subsystem string `json:"subsystem"`
// Collector type (histogram, gauge, counter, summary).
Type CollectorType `json:"type"`
// Help of collector.
Help string `json:"help"`
// Labels for vectorized metrics.
Labels []string `json:"labels"`
// Buckets for histogram metric.
Buckets []float64 `json:"buckets"`
// Objectives for the summary opts
Objectives map[float64]float64 `json:"objectives"`
}
// register application specific metrics.
func (c *Config) getCollectors() (map[string]prometheus.Collector, error) {
if c.Collect == nil {
return nil, nil
}
collectors := make(map[string]prometheus.Collector)
for name, m := range c.Collect {
var collector prometheus.Collector
switch m.Type {
case Histogram:
opts := prometheus.HistogramOpts{
Name: name,
Namespace: m.Namespace,
Subsystem: m.Subsystem,
Help: m.Help,
Buckets: m.Buckets,
}
if len(m.Labels) != 0 {
collector = prometheus.NewHistogramVec(opts, m.Labels)
} else {
collector = prometheus.NewHistogram(opts)
}
case Gauge:
opts := prometheus.GaugeOpts{
Name: name,
Namespace: m.Namespace,
Subsystem: m.Subsystem,
Help: m.Help,
}
if len(m.Labels) != 0 {
collector = prometheus.NewGaugeVec(opts, m.Labels)
} else {
collector = prometheus.NewGauge(opts)
}
case Counter:
opts := prometheus.CounterOpts{
Name: name,
Namespace: m.Namespace,
Subsystem: m.Subsystem,
Help: m.Help,
}
if len(m.Labels) != 0 {
collector = prometheus.NewCounterVec(opts, m.Labels)
} else {
collector = prometheus.NewCounter(opts)
}
case Summary:
opts := prometheus.SummaryOpts{
Name: name,
Namespace: m.Namespace,
Subsystem: m.Subsystem,
Help: m.Help,
Objectives: m.Objectives,
}
if len(m.Labels) != 0 {
collector = prometheus.NewSummaryVec(opts, m.Labels)
} else {
collector = prometheus.NewSummary(opts)
}
default:
return nil, fmt.Errorf("invalid metric type `%s` for `%s`", m.Type, name)
}
collectors[name] = collector
}
return collectors, nil
}
func (c *Config) InitDefaults() {
}
|