-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmetrics.go
197 lines (167 loc) · 6.85 KB
/
metrics.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
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
package ctrl
import (
"fmt"
"net"
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/collectors"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
// metrics are generally used to hold the structure around metrics
// handling
type metrics struct {
// The channel to pass metrics that should be processed.
promRegistry *prometheus.Registry
// host and port where prometheus metrics will be exported.
hostAndPort string
// The build version
promVersion *prometheus.GaugeVec
// --- Processes
// Prometheus metrics for total processes.
promProcessesTotal prometheus.Gauge
// Prometheus metrics for vector of process names.
promProcessesAllRunning *prometheus.GaugeVec
// --- Methods
// Prometheus metrics for number of hello nodes.
promHelloNodesTotal prometheus.Gauge
// Prometheus metrics for the vector of hello nodes.
promHelloNodesContactLast *prometheus.GaugeVec
// --- Ringbuffer
// Prometheus metrics for the last processed DB id in key
// value store.
promMessagesProcessedIDLast prometheus.Gauge
// Prometheus metrics for the total count of stalled
// messages in the ringbuffer.
promRingbufferStalledMessagesTotal prometheus.Counter
// Prometheus metrics for current messages in memory buffer.
promInMemoryBufferMessagesCurrent prometheus.Gauge
// Prometheus metrics for current messages delivered by a
// user into the system.
promUserMessagesTotal prometheus.Counter
// Metrics for nats messages delivered total.
promNatsDeliveredTotal prometheus.Counter
// Metrics for messages that failed to get ack replies.
promNatsMessagesFailedACKsTotal prometheus.Counter
// Metrics for messages that missed to get ack replies.
promNatsMessagesMissedACKsTotal prometheus.Counter
// Metrics for received error messages
promErrorMessagesReceivedTotal prometheus.Counter
// Metrics for sent error messages
promErrorMessagesSentTotal prometheus.Counter
// Metrics for sent info messages
promInfoMessagesSentTotal prometheus.Counter
// Metrics for the amount of messages currently in db.
promDBMessagesCurrent prometheus.Gauge
}
// newMetrics will prepare and return a *metrics.
func newMetrics(hostAndPort string) *metrics {
reg := prometheus.NewRegistry()
//prometheus.Unregister(prometheus.NewGoCollector()).
reg.MustRegister(collectors.NewGoCollector())
// prometheus.MustRegister(collectors.NewGoCollector()).
m := metrics{
promRegistry: reg,
hostAndPort: hostAndPort,
}
m.promVersion = prometheus.NewGaugeVec(prometheus.GaugeOpts{
Name: "ctrl_build_version",
Help: "Build version of ctrl",
}, []string{"version"},
)
m.promRegistry.MustRegister(m.promVersion)
m.promProcessesTotal = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "ctrl_processes_total",
Help: "The current number of total running processes",
})
m.promRegistry.MustRegister(m.promProcessesTotal)
m.promProcessesAllRunning = prometheus.NewGaugeVec(prometheus.GaugeOpts{
Name: "ctrl_processes_all_running",
Help: "Name of the running processes",
}, []string{"processName"},
)
m.promRegistry.MustRegister(m.promProcessesAllRunning)
m.promHelloNodesTotal = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "ctrl_hello_nodes_total",
Help: "The current number of total nodes who have said hello",
})
m.promRegistry.MustRegister(m.promHelloNodesTotal)
m.promHelloNodesContactLast = prometheus.NewGaugeVec(prometheus.GaugeOpts{
Name: "ctrl_hello_node_contact_last",
Help: "Name of the nodes who have said hello",
}, []string{"nodeName"})
m.promRegistry.MustRegister(m.promHelloNodesContactLast)
m.promMessagesProcessedIDLast = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "ctrl_messages_processed_id_last",
Help: "The last processed id in key value/store db",
})
m.promRegistry.MustRegister(m.promMessagesProcessedIDLast)
m.promRingbufferStalledMessagesTotal = prometheus.NewCounter(prometheus.CounterOpts{
Name: "ctrl_ringbuffer_stalled_messages_total",
Help: "Number of stalled messages in ringbuffer",
})
m.promRegistry.MustRegister(m.promRingbufferStalledMessagesTotal)
m.promInMemoryBufferMessagesCurrent = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "ctrl_in_memory_buffer_messages_current",
Help: "The current value of messages in memory buffer",
})
m.promRegistry.MustRegister(m.promInMemoryBufferMessagesCurrent)
// Register som metrics for messages delivered by users into the system.
m.promUserMessagesTotal = prometheus.NewCounter(prometheus.CounterOpts{
Name: "ctrl_user_messages_total",
Help: "Number of total messages delivered by users into the system",
})
m.promRegistry.MustRegister(m.promUserMessagesTotal)
m.promNatsDeliveredTotal = prometheus.NewCounter(prometheus.CounterOpts{
Name: "ctrl_nats_delivered_total",
Help: "Number of total messages delivered by nats",
})
m.promRegistry.MustRegister(m.promNatsDeliveredTotal)
m.promNatsMessagesFailedACKsTotal = prometheus.NewCounter(prometheus.CounterOpts{
Name: "ctrl_nats_messages_failed_acks_total",
Help: "Number of messages that never received an ack total",
})
m.promRegistry.MustRegister(m.promNatsMessagesFailedACKsTotal)
m.promNatsMessagesMissedACKsTotal = prometheus.NewCounter(prometheus.CounterOpts{
Name: "ctrl_nats_messages_missed_acks_total",
Help: "Number of messages missed receiving an ack total",
})
m.promRegistry.MustRegister(m.promNatsMessagesMissedACKsTotal)
m.promErrorMessagesReceivedTotal = prometheus.NewCounter(prometheus.CounterOpts{
Name: "ctrl_error_messages_received_total",
Help: "Number of error messages received total",
})
m.promRegistry.MustRegister(m.promErrorMessagesReceivedTotal)
m.promErrorMessagesSentTotal = prometheus.NewCounter(prometheus.CounterOpts{
Name: "ctrl_error_messages_sent_total",
Help: "Number of error messages sent total",
})
m.promRegistry.MustRegister(m.promErrorMessagesSentTotal)
m.promInfoMessagesSentTotal = prometheus.NewCounter(prometheus.CounterOpts{
Name: "ctrl_info_messages_sent_total",
Help: "Number of info messages sent total",
})
m.promRegistry.MustRegister(m.promInfoMessagesSentTotal)
m.promDBMessagesCurrent = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "ctrl_db_messages_current",
Help: "The current value messages in database",
})
m.promRegistry.MustRegister(m.promDBMessagesCurrent)
return &m
}
// Start the http interface for Prometheus metrics.
func (m *metrics) start() error {
//http.Handle("/metrics", promhttp.Handler())
//http.ListenAndServe(":2112", nil)
n, err := net.Listen("tcp", m.hostAndPort)
if err != nil {
return fmt.Errorf("error: startMetrics: failed to open prometheus listen port: %v", err)
}
//mux := http.NewServeMux()
//mux.Handle("/metrics", promhttp.Handler())
http.Handle("/metrics", promhttp.HandlerFor(m.promRegistry, promhttp.HandlerOpts{}))
err = http.Serve(n, nil)
if err != nil {
return fmt.Errorf("error: startMetrics: failed to start http.Serve: %v", err)
}
return nil
}