11package controllers
22
33import (
4+ "context"
5+ "strconv"
6+
7+ kuikenixiov1alpha1 "github.com/enix/kube-image-keeper/api/v1alpha1"
48 kuikMetrics "github.com/enix/kube-image-keeper/internal/metrics"
59 "github.com/prometheus/client_golang/prometheus"
10+ "sigs.k8s.io/controller-runtime/pkg/client"
11+ "sigs.k8s.io/controller-runtime/pkg/log"
612 "sigs.k8s.io/controller-runtime/pkg/metrics"
713)
814
@@ -25,13 +31,50 @@ var (
2531 Help : "Number of images removed from cache successfully" ,
2632 },
2733 )
34+ cachedImagesMetric = prometheus .BuildFQName (kuikMetrics .Namespace , subsystem , "cached_images" )
35+ cachedImagesHelp = "Number of images expected to be cached"
36+ cachedImagesDesc = prometheus .NewDesc (cachedImagesMetric , cachedImagesHelp , []string {"cached" , "expiring" }, nil )
2837)
2938
30- func init ( ) {
39+ func RegisterMetrics ( client client. Client ) {
3140 // Register custom metrics with the global prometheus registry
3241 metrics .Registry .MustRegister (
3342 imagePutInCache ,
3443 imageRemovedFromCache ,
3544 kuikMetrics .NewInfo (subsystem ),
45+ & ControllerCollector {
46+ Client : client ,
47+ },
3648 )
3749}
50+
51+ func cachedImagesWithLabelValues (gaugeVec * prometheus.GaugeVec , cachedImage * kuikenixiov1alpha1.CachedImage ) prometheus.Gauge {
52+ return gaugeVec .WithLabelValues (strconv .FormatBool (cachedImage .Status .IsCached ), strconv .FormatBool (cachedImage .Spec .ExpiresAt != nil ))
53+ }
54+
55+ type ControllerCollector struct {
56+ client.Client
57+ }
58+
59+ func (c * ControllerCollector ) Describe (ch chan <- * prometheus.Desc ) {
60+ ch <- cachedImagesDesc
61+ }
62+
63+ func (c * ControllerCollector ) Collect (ch chan <- prometheus.Metric ) {
64+ cachedImageList := & kuikenixiov1alpha1.CachedImageList {}
65+ if err := c .List (context .Background (), cachedImageList ); err == nil {
66+ cachedImageGaugeVec := prometheus .NewGaugeVec (
67+ prometheus.GaugeOpts {
68+ Name : cachedImagesMetric ,
69+ Help : cachedImagesHelp ,
70+ },
71+ []string {"cached" , "expiring" },
72+ )
73+ for _ , cachedImage := range cachedImageList .Items {
74+ cachedImagesWithLabelValues (cachedImageGaugeVec , & cachedImage ).Inc ()
75+ }
76+ cachedImageGaugeVec .Collect (ch )
77+ } else {
78+ log .FromContext (context .TODO ()).Error (err , "could not collect " + cachedImagesMetric + " metric" )
79+ }
80+ }
0 commit comments