Skip to content

Commit 13026b0

Browse files
authored
Merge pull request #15 from utilitywarehouse/init-counters
metrics: initialize counters
2 parents 45eade4 + 1d0f317 commit 13026b0

File tree

3 files changed

+43
-35
lines changed

3 files changed

+43
-35
lines changed

main.go

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,8 @@ import (
99
"regexp"
1010
"strings"
1111

12-
"github.com/prometheus/client_golang/prometheus"
1312
"github.com/prometheus/client_golang/prometheus/promhttp"
1413
"golang.zx2c4.com/wireguard/wgctrl"
15-
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
1614

1715
"github.com/utilitywarehouse/semaphore-wireguard/kube"
1816
"github.com/utilitywarehouse/semaphore-wireguard/log"
@@ -107,7 +105,7 @@ func main() {
107105
}
108106
}()
109107

110-
makeMetricsCollector(wgMetricsClient, wgDeviceNames)
108+
registerMetrics(wgMetricsClient, wgDeviceNames)
111109
listenAndServe(runners)
112110

113111
// Stop runners before finishing
@@ -158,22 +156,6 @@ func makeRunner(homeClient kubernetes.Interface, localName string, rConf *remote
158156
return r, wgDeviceName, nil
159157
}
160158

161-
func makeMetricsCollector(wgMetricsClient *wgctrl.Client, wgDeviceNames []string) {
162-
mc := newMetricsCollector(func() ([]*wgtypes.Device, error) {
163-
var devices []*wgtypes.Device
164-
for _, name := range wgDeviceNames {
165-
device, err := wgMetricsClient.Device(name)
166-
if err != nil {
167-
return nil, err
168-
}
169-
devices = append(devices, device)
170-
}
171-
return devices, nil
172-
})
173-
prometheus.MustRegister(mc)
174-
175-
}
176-
177159
func listenAndServe(runners []*Runner) {
178160
mux := http.NewServeMux()
179161
mux.Handle("/metrics", promhttp.Handler())

metrics.go

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,65 @@ package main
33
import (
44
"github.com/prometheus/client_golang/prometheus"
55
"github.com/utilitywarehouse/semaphore-wireguard/log"
6+
"golang.zx2c4.com/wireguard/wgctrl"
67
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
78
)
89

910
var (
1011
syncPeersAttempt = prometheus.NewCounterVec(
1112
prometheus.CounterOpts{
12-
Name: "semaphore_wg_sync_peers",
13+
Name: "semaphore_wg_sync_peers_total",
1314
Help: "Counts runners' attempts to sync peers.",
1415
},
1516
[]string{"device", "success"},
1617
)
1718
syncQueueFullFailures = prometheus.NewCounterVec(
1819
prometheus.CounterOpts{
19-
Name: "semaphore_wg_sync_queue_full_failures",
20+
Name: "semaphore_wg_sync_queue_full_failures_total",
2021
Help: "Number of times a sync task was not added to the sync queue in time because the queue was full.",
2122
},
2223
[]string{"device"},
2324
)
2425
syncRequeue = prometheus.NewCounterVec(
2526
prometheus.CounterOpts{
26-
Name: "semaphore_wg_sync_requeue",
27+
Name: "semaphore_wg_sync_requeue_total",
2728
Help: "Number of attempts to requeue a sync.",
2829
},
2930
[]string{"device"},
3031
)
3132
)
3233

34+
// registerMetrics registers all the prometheus collectors for this package
35+
func registerMetrics(wgMetricsClient *wgctrl.Client, wgDeviceNames []string) {
36+
// Initialize counters with a value of 0
37+
for _, d := range wgDeviceNames {
38+
for _, s := range []string{"0", "1"} {
39+
syncPeersAttempt.With(prometheus.Labels{"device": d, "success": s})
40+
}
41+
syncQueueFullFailures.With(prometheus.Labels{"device": d})
42+
syncRequeue.With(prometheus.Labels{"device": d})
43+
}
44+
45+
mc := newMetricsCollector(func() ([]*wgtypes.Device, error) {
46+
var devices []*wgtypes.Device
47+
for _, name := range wgDeviceNames {
48+
device, err := wgMetricsClient.Device(name)
49+
if err != nil {
50+
return nil, err
51+
}
52+
devices = append(devices, device)
53+
}
54+
return devices, nil
55+
})
56+
57+
prometheus.MustRegister(
58+
mc,
59+
syncPeersAttempt,
60+
syncQueueFullFailures,
61+
syncRequeue,
62+
)
63+
}
64+
3365
// A collector is a prometheus.Collector for a WireGuard device.
3466
type collector struct {
3567
DeviceInfo *prometheus.Desc
@@ -42,13 +74,7 @@ type collector struct {
4274
devices func() ([]*wgtypes.Device, error) // to allow testing
4375
}
4476

45-
func init() {
46-
prometheus.MustRegister(syncPeersAttempt)
47-
prometheus.MustRegister(syncQueueFullFailures)
48-
prometheus.MustRegister(syncRequeue)
49-
}
50-
51-
// NewMetricsCollector constructs a prometheus.Collector to collect metrics for
77+
// newMetricsCollector constructs a prometheus.Collector to collect metrics for
5278
// all present wg devices and correlate with user if possible
5379
func newMetricsCollector(devices func() ([]*wgtypes.Device, error)) prometheus.Collector {
5480
// common labels for all metrics
@@ -182,7 +208,7 @@ func (c *collector) Collect(ch chan<- prometheus.Metric) {
182208
}
183209
}
184210

185-
func MetricsSyncPeerAttempt(device string, err error) {
211+
func metricsSyncPeerAttempt(device string, err error) {
186212
s := "1"
187213
if err != nil {
188214
s = "0"
@@ -193,13 +219,13 @@ func MetricsSyncPeerAttempt(device string, err error) {
193219
}).Inc()
194220
}
195221

196-
func MetricsIncSyncQueueFullFailures(device string) {
222+
func metricsIncSyncQueueFullFailures(device string) {
197223
syncQueueFullFailures.With(prometheus.Labels{
198224
"device": device,
199225
}).Inc()
200226
}
201227

202-
func MetricsIncSyncRequeue(device string) {
228+
func metricsIncSyncRequeue(device string) {
203229
syncRequeue.With(prometheus.Labels{
204230
"device": device,
205231
}).Inc()

runner.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ func (r *Runner) syncLoop() {
123123
continue
124124
}
125125
err := r.syncPeers()
126-
MetricsSyncPeerAttempt(r.device.Name(), err)
126+
metricsSyncPeerAttempt(r.device.Name(), err)
127127
if err != nil {
128128
log.Logger.Warn("Failed to sync wg peers", "err", err)
129129
r.requeuePeersSync()
@@ -165,7 +165,7 @@ func (r *Runner) enqueuePeersSync() {
165165
log.Logger.Debug("Sync task queued")
166166
case <-time.After(5 * time.Second):
167167
log.Logger.Error("Timed out trying to queue a sync action for netset, sync queue is full")
168-
MetricsIncSyncQueueFullFailures(r.device.Name())
168+
metricsIncSyncQueueFullFailures(r.device.Name())
169169
r.requeuePeersSync()
170170
}
171171
}
@@ -174,7 +174,7 @@ func (r *Runner) requeuePeersSync() {
174174
log.Logger.Debug("Requeueing peers sync task")
175175
go func() {
176176
time.Sleep(1)
177-
MetricsIncSyncRequeue(r.device.Name())
177+
metricsIncSyncRequeue(r.device.Name())
178178
r.enqueuePeersSync()
179179
}()
180180
}

0 commit comments

Comments
 (0)