Skip to content

Commit 66e3a5e

Browse files
committed
WIP: Add registry metrics collectors
1 parent c17c40e commit 66e3a5e

7 files changed

+118
-2
lines changed

controllers/hcpvaultsecretsapp_controller.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import (
3232
"sigs.k8s.io/controller-runtime/pkg/controller"
3333
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3434
"sigs.k8s.io/controller-runtime/pkg/log"
35+
ctrlmetrics "sigs.k8s.io/controller-runtime/pkg/metrics"
3536

3637
"github.com/hashicorp/vault-secrets-operator/credentials"
3738
"github.com/hashicorp/vault-secrets-operator/credentials/hcp"
@@ -302,9 +303,16 @@ func (r *HCPVaultSecretsAppReconciler) updateStatus(ctx context.Context, o *secr
302303
// SetupWithManager sets up the controller with the Manager.
303304
func (r *HCPVaultSecretsAppReconciler) SetupWithManager(mgr ctrl.Manager, opts controller.Options) error {
304305
r.referenceCache = newResourceReferenceCache()
306+
ctrlmetrics.Registry.MustRegister(
307+
newResourceReferenceCacheCollector(r.referenceCache, "hcpvaultsecretsapp"),
308+
)
309+
305310
if r.BackOffRegistry == nil {
306311
r.BackOffRegistry = NewBackOffRegistry()
307312
}
313+
ctrlmetrics.Registry.MustRegister(
314+
newBackoffRegistryCacheCollector(r.BackOffRegistry, "hcpvaultsecretsapp"),
315+
)
308316

309317
return ctrl.NewControllerManagedBy(mgr).
310318
For(&secretsv1beta1.HCPVaultSecretsApp{}).

controllers/registry.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ import (
88
"time"
99

1010
"github.com/cenkalti/backoff/v4"
11+
"github.com/prometheus/client_golang/prometheus"
1112
"sigs.k8s.io/controller-runtime/pkg/client"
13+
14+
"github.com/hashicorp/vault-secrets-operator/internal/metrics"
1215
)
1316

1417
type ResourceKind int
@@ -49,6 +52,7 @@ type ResourceReferenceCache interface {
4952
Get(ResourceKind, client.ObjectKey) []client.ObjectKey
5053
Remove(ResourceKind, client.ObjectKey) bool
5154
Prune(ResourceKind, client.ObjectKey) int
55+
Len() int
5256
}
5357

5458
var _ ResourceReferenceCache = (*resourceReferenceCache)(nil)
@@ -80,6 +84,20 @@ type resourceReferenceCache struct {
8084
mu sync.RWMutex
8185
}
8286

87+
func (c *resourceReferenceCache) Len() int {
88+
c.mu.RLock()
89+
defer c.mu.RUnlock()
90+
91+
var l int
92+
for _, scope := range c.m {
93+
for _, refs := range scope {
94+
l += len(refs)
95+
}
96+
}
97+
98+
return l
99+
}
100+
83101
// Set references of kind for referrer.
84102
func (c *resourceReferenceCache) Set(kind ResourceKind, referrer client.ObjectKey, references ...client.ObjectKey) {
85103
c.mu.Lock()
@@ -274,6 +292,13 @@ func (r *BackOffRegistry) Get(objKey client.ObjectKey) (*BackOff, bool) {
274292
return entry, !ok
275293
}
276294

295+
func (r *BackOffRegistry) Len() int {
296+
r.mu.RLock()
297+
defer r.mu.RUnlock()
298+
299+
return len(r.m)
300+
}
301+
277302
// BackOff is a wrapper around backoff.BackOff that does not implement
278303
// BackOff.Reset, since elements in BackOffRegistry are meant to be ephemeral.
279304
type BackOff struct {
@@ -304,3 +329,57 @@ func NewBackOffRegistry(opts ...backoff.ExponentialBackOffOpts) *BackOffRegistry
304329
opts: opts,
305330
}
306331
}
332+
333+
// registryCacheCollector provides a prometheus.Collector for ClientCache metrics.
334+
type registryCacheCollector struct {
335+
cache ResourceReferenceCache
336+
size float64
337+
lenDesc *prometheus.Desc
338+
}
339+
340+
func (c registryCacheCollector) Describe(ch chan<- *prometheus.Desc) {
341+
ch <- c.lenDesc
342+
}
343+
344+
func (c registryCacheCollector) Collect(ch chan<- prometheus.Metric) {
345+
ch <- prometheus.MustNewConstMetric(c.lenDesc, prometheus.GaugeValue, float64(c.cache.Len()))
346+
}
347+
348+
func newResourceReferenceCacheCollector(cache ResourceReferenceCache, name string) prometheus.Collector {
349+
metricsFQNClientCacheLength := prometheus.BuildFQName(
350+
metrics.Namespace, "rsc_ref_cache", metrics.NameLength)
351+
return &registryCacheCollector{
352+
cache: cache,
353+
lenDesc: prometheus.NewDesc(
354+
metricsFQNClientCacheLength,
355+
"Number of object references in the cache.",
356+
nil, map[string]string{"name": name}),
357+
}
358+
}
359+
360+
// backoffRegistryCacheCollector
361+
type backoffRegistryCacheCollector struct {
362+
cache *BackOffRegistry
363+
size float64
364+
lenDesc *prometheus.Desc
365+
}
366+
367+
func (c backoffRegistryCacheCollector) Describe(ch chan<- *prometheus.Desc) {
368+
ch <- c.lenDesc
369+
}
370+
371+
func (c backoffRegistryCacheCollector) Collect(ch chan<- prometheus.Metric) {
372+
ch <- prometheus.MustNewConstMetric(c.lenDesc, prometheus.GaugeValue, float64(c.cache.Len()))
373+
}
374+
375+
func newBackoffRegistryCacheCollector(cache *BackOffRegistry, name string) prometheus.Collector {
376+
metricsFQNClientCacheLength := prometheus.BuildFQName(
377+
metrics.Namespace, "backoff_registry_cache", metrics.NameLength)
378+
return &backoffRegistryCacheCollector{
379+
cache: cache,
380+
lenDesc: prometheus.NewDesc(
381+
metricsFQNClientCacheLength,
382+
"Number of backoff objects in the cache.",
383+
nil, map[string]string{"name": name}),
384+
}
385+
}

controllers/registry_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func Test_resourceReferenceCache(t *testing.T) {
6060
{
6161
action: 0,
6262
referrer: referrer1,
63-
references: []client.ObjectKey{reference1},
63+
references: []client.ObjectKey{reference1, reference1, reference1},
6464
},
6565
},
6666
m: refCacheMap{

controllers/vaultauth_controller.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"sigs.k8s.io/controller-runtime/pkg/client"
2222
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2323
"sigs.k8s.io/controller-runtime/pkg/log"
24+
ctrlmetrics "sigs.k8s.io/controller-runtime/pkg/metrics"
2425
"sigs.k8s.io/controller-runtime/pkg/predicate"
2526

2627
secretsv1beta1 "github.com/hashicorp/vault-secrets-operator/api/v1beta1"
@@ -241,6 +242,10 @@ func (r *VaultAuthReconciler) handleFinalizer(ctx context.Context, o *secretsv1b
241242
// SetupWithManager sets up the controller with the Manager.
242243
func (r *VaultAuthReconciler) SetupWithManager(mgr ctrl.Manager) error {
243244
r.referenceCache = newResourceReferenceCache()
245+
ctrlmetrics.Registry.MustRegister(
246+
newResourceReferenceCacheCollector(r.referenceCache, "vaultauth"),
247+
)
248+
244249
return ctrl.NewControllerManagedBy(mgr).
245250
For(&secretsv1beta1.VaultAuth{}).
246251
Watches(

controllers/vaultdynamicsecret_controller.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@ import (
2222
"k8s.io/apimachinery/pkg/runtime"
2323
"k8s.io/apimachinery/pkg/types"
2424
"k8s.io/client-go/tools/record"
25+
"sigs.k8s.io/controller-runtime/pkg/builder"
26+
ctrlmetrics "sigs.k8s.io/controller-runtime/pkg/metrics"
2527

2628
ctrl "sigs.k8s.io/controller-runtime"
27-
"sigs.k8s.io/controller-runtime/pkg/builder"
2829
"sigs.k8s.io/controller-runtime/pkg/client"
2930
"sigs.k8s.io/controller-runtime/pkg/controller"
3031
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
@@ -596,9 +597,15 @@ func (r *VaultDynamicSecretReconciler) renewLease(
596597
// SetupWithManager sets up the controller with the Manager.
597598
func (r *VaultDynamicSecretReconciler) SetupWithManager(mgr ctrl.Manager, opts controller.Options) error {
598599
r.referenceCache = newResourceReferenceCache()
600+
ctrlmetrics.Registry.MustRegister(
601+
newResourceReferenceCacheCollector(r.referenceCache, "vaultdynamicsecret"),
602+
)
599603
if r.BackOffRegistry == nil {
600604
r.BackOffRegistry = NewBackOffRegistry()
601605
}
606+
ctrlmetrics.Registry.MustRegister(
607+
newBackoffRegistryCacheCollector(r.BackOffRegistry, "vaultdynamicsecret"),
608+
)
602609

603610
r.ClientFactory.RegisterClientCallbackHandler(
604611
vault.ClientCallbackHandler{

controllers/vaultpkisecret_controller.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"sigs.k8s.io/controller-runtime/pkg/controller"
2626
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2727
"sigs.k8s.io/controller-runtime/pkg/log"
28+
ctrlmetrics "sigs.k8s.io/controller-runtime/pkg/metrics"
2829

2930
secretsv1beta1 "github.com/hashicorp/vault-secrets-operator/api/v1beta1"
3031
"github.com/hashicorp/vault-secrets-operator/consts"
@@ -347,8 +348,15 @@ func (r *VaultPKISecretReconciler) handleDeletion(ctx context.Context, o *secret
347348

348349
func (r *VaultPKISecretReconciler) SetupWithManager(mgr ctrl.Manager, opts controller.Options) error {
349350
r.referenceCache = newResourceReferenceCache()
351+
ctrlmetrics.Registry.MustRegister(
352+
newResourceReferenceCacheCollector(r.referenceCache, "vaultpkisecret"),
353+
)
354+
350355
if r.BackOffRegistry == nil {
351356
r.BackOffRegistry = NewBackOffRegistry()
357+
ctrlmetrics.Registry.MustRegister(
358+
newBackoffRegistryCacheCollector(r.BackOffRegistry, "vaultpkisecret"),
359+
)
352360
}
353361
return ctrl.NewControllerManagedBy(mgr).
354362
For(&secretsv1beta1.VaultPKISecret{}).

controllers/vaultstaticsecret_controller.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2525
"sigs.k8s.io/controller-runtime/pkg/event"
2626
"sigs.k8s.io/controller-runtime/pkg/log"
27+
ctrlmetrics "sigs.k8s.io/controller-runtime/pkg/metrics"
2728
"sigs.k8s.io/controller-runtime/pkg/source"
2829

2930
"github.com/cenkalti/backoff/v4"
@@ -500,9 +501,17 @@ func (r *VaultStaticSecretReconciler) streamStaticSecretEvents(ctx context.Conte
500501

501502
func (r *VaultStaticSecretReconciler) SetupWithManager(mgr ctrl.Manager, opts controller.Options) error {
502503
r.referenceCache = newResourceReferenceCache()
504+
ctrlmetrics.Registry.MustRegister(
505+
newResourceReferenceCacheCollector(r.referenceCache, "vaultstaticsecret"),
506+
)
507+
503508
if r.BackOffRegistry == nil {
504509
r.BackOffRegistry = NewBackOffRegistry()
505510
}
511+
ctrlmetrics.Registry.MustRegister(
512+
newBackoffRegistryCacheCollector(r.BackOffRegistry, "vaultstaticsecret"),
513+
)
514+
506515
r.SourceCh = make(chan event.GenericEvent)
507516
r.eventWatcherRegistry = newEventWatcherRegistry()
508517

0 commit comments

Comments
 (0)