Skip to content

Commit b74c5bf

Browse files
committed
feat(metrics): export cached_images gauge
1 parent 85968d6 commit b74c5bf

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

cmd/cache/main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ func main() {
9999
os.Exit(1)
100100
}
101101

102+
controllers.RegisterMetrics(mgr.GetClient())
103+
102104
setupLog.Info("starting manager")
103105
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
104106
setupLog.Error(err, "problem running manager")

controllers/collector.go

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
package controllers
22

33
import (
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

Comments
 (0)