Skip to content

Commit 8311a9b

Browse files
authoredOct 30, 2024
feat(rrset): Add custom metrics (#45)
Signed-off-by: Anthony TREUILLIER <anthony.treuillier.ext@orange.com>
1 parent da9465a commit 8311a9b

File tree

5 files changed

+127
-2
lines changed

5 files changed

+127
-2
lines changed
 

‎config/default/kustomization.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ resources:
2424
# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. 'WEBHOOK' components are required.
2525
#- ../certmanager
2626
# [PROMETHEUS] To enable prometheus monitor, uncomment all sections with 'PROMETHEUS'.
27-
#- ../prometheus
27+
- ../prometheus
2828

2929
patches:
3030
- path: manager_env_patch.yaml

‎go.mod

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require (
66
github.com/joeig/go-powerdns/v3 v3.14.1
77
github.com/onsi/ginkgo/v2 v2.20.0
88
github.com/onsi/gomega v1.34.1
9+
github.com/prometheus/client_golang v1.20.0
910
k8s.io/apimachinery v0.31.0
1011
k8s.io/client-go v0.31.0
1112
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8
@@ -38,12 +39,12 @@ require (
3839
github.com/josharian/intern v1.0.0 // indirect
3940
github.com/json-iterator/go v1.1.12 // indirect
4041
github.com/klauspost/compress v1.17.9 // indirect
42+
github.com/kylelemons/godebug v1.1.0 // indirect
4143
github.com/mailru/easyjson v0.7.7 // indirect
4244
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
4345
github.com/modern-go/reflect2 v1.0.2 // indirect
4446
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
4547
github.com/pkg/errors v0.9.1 // indirect
46-
github.com/prometheus/client_golang v1.20.0 // indirect
4748
github.com/prometheus/client_model v0.6.1 // indirect
4849
github.com/prometheus/common v0.55.0 // indirect
4950
github.com/prometheus/procfs v0.15.1 // indirect

‎internal/controller/pdns_metrics.go

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package controller
2+
3+
import (
4+
"github.com/prometheus/client_golang/prometheus"
5+
"github.com/prometheus/client_golang/prometheus/testutil"
6+
)
7+
8+
var (
9+
rrsetsStatusesMetric = prometheus.NewGaugeVec(
10+
prometheus.GaugeOpts{
11+
Name: "rrsets_status",
12+
Help: "Statuses of RRsets processed",
13+
},
14+
[]string{"fqdn", "type", "status", "name", "namespace"},
15+
)
16+
)
17+
18+
func updateRrsetsMetrics(fqdn, rrsetType, rrsetStatus, name, namespace string) {
19+
rrsetsStatusesMetric.With(map[string]string{
20+
"fqdn": fqdn,
21+
"type": rrsetType,
22+
"status": rrsetStatus,
23+
"name": name,
24+
"namespace": namespace,
25+
}).Set(1)
26+
}
27+
func removeRrsetMetrics(name, namespace string) {
28+
rrsetsStatusesMetric.DeletePartialMatch(
29+
map[string]string{
30+
"namespace": namespace,
31+
"name": name,
32+
},
33+
)
34+
}
35+
36+
//nolint:unparam
37+
func getMetricWithLabels(rrsetFQDN, rrsetType, rrsetStatus, rrsetName, rrsetNamespace string) float64 {
38+
return testutil.ToFloat64(rrsetsStatusesMetric.With(prometheus.Labels{
39+
"fqdn": rrsetFQDN,
40+
"type": rrsetType,
41+
"status": rrsetStatus,
42+
"name": rrsetName,
43+
"namespace": rrsetNamespace,
44+
}))
45+
}
46+
47+
func countMetrics() int {
48+
return testutil.CollectAndCount(rrsetsStatusesMetric)
49+
}

‎internal/controller/rrset_controller.go

+21
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"sigs.k8s.io/controller-runtime/pkg/client"
2525
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2626
"sigs.k8s.io/controller-runtime/pkg/log"
27+
"sigs.k8s.io/controller-runtime/pkg/metrics"
2728

2829
dnsv1alpha1 "github.com/orange-opensource/powerdns-operator/api/v1alpha1"
2930
)
@@ -40,6 +41,11 @@ type RRsetReconciler struct {
4041
PDNSClient PdnsClienter
4142
}
4243

44+
func init() {
45+
// Register custom metrics with the global prometheus registry
46+
metrics.Registry.MustRegister(rrsetsStatusesMetric)
47+
}
48+
4349
// +kubebuilder:rbac:groups=dns.cav.enablers.ob,resources=rrsets,verbs=get;list;watch;create;update;patch;delete
4450
// +kubebuilder:rbac:groups=dns.cav.enablers.ob,resources=rrsets/status,verbs=get;update;patch
4551
// +kubebuilder:rbac:groups=dns.cav.enablers.ob,resources=rrsets/finalizers,verbs=update
@@ -77,6 +83,8 @@ func (r *RRsetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
7783
log.Error(err, "Failed to remove finalizer")
7884
return ctrl.Result{}, err
7985
}
86+
// Remove resource metrics
87+
removeRrsetMetrics(rrset.Name, rrset.Namespace)
8088
}
8189
// Race condition when creating Zone+RRset at the same time
8290
// RRset is not created because Zone is not created yet
@@ -119,6 +127,9 @@ func (r *RRsetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
119127
log.Error(err, "Failed to remove finalizer")
120128
return ctrl.Result{}, err
121129
}
130+
// Remove resource metrics
131+
removeRrsetMetrics(rrset.Name, rrset.Namespace)
132+
122133
//nolint:ineffassign
123134
lastUpdateTime = &metav1.Time{Time: time.Now().UTC()}
124135
}
@@ -129,6 +140,9 @@ func (r *RRsetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
129140

130141
// We cannot exit previously (at the early moments of reconcile), because we have to allow deletion process
131142
if isInFailedStatus {
143+
// Update resource metrics
144+
updateRrsetsMetrics(getRRsetName(rrset), rrset.Spec.Type, *rrset.Status.SyncStatus, rrset.Name, rrset.Namespace)
145+
132146
return ctrl.Result{}, nil
133147
}
134148

@@ -151,6 +165,10 @@ func (r *RRsetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
151165
log.Error(err, "unable to patch RRSet status")
152166
return ctrl.Result{}, err
153167
}
168+
169+
// Update resource metrics
170+
updateRrsetsMetrics(getRRsetName(rrset), rrset.Spec.Type, *rrset.Status.SyncStatus, rrset.Name, rrset.Namespace)
171+
154172
return ctrl.Result{}, nil
155173
}
156174

@@ -195,6 +213,9 @@ func (r *RRsetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
195213
return ctrl.Result{}, err
196214
}
197215

216+
// Metrics calculation
217+
updateRrsetsMetrics(getRRsetName(rrset), rrset.Spec.Type, *rrset.Status.SyncStatus, rrset.Name, rrset.Namespace)
218+
198219
return ctrl.Result{}, nil
199220
}
200221

0 commit comments

Comments
 (0)
Please sign in to comment.