@@ -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
1417type 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
5458var _ 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.
84102func (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.
279304type 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+ }
0 commit comments