Skip to content

Commit e87d3ff

Browse files
erikgbCopilot
andauthored
fix: broken custom image scan metrics (#1591)
Co-authored-by: Copilot <[email protected]>
1 parent 397a27b commit e87d3ff

File tree

8 files changed

+108
-3
lines changed

8 files changed

+108
-3
lines changed

config/rbac/role.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,10 @@ rules:
4848
verbs:
4949
- create
5050
- delete
51+
- get
52+
- list
5153
- patch
54+
- watch
5255
- apiGroups:
5356
- stas.statnett.no
5457
resources:

internal/controller/stas/scan_job_controller.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"slices"
99
"strings"
1010

11+
openreportsv1alpha1 "github.com/openreports/reports-api/apis/openreports.io/v1alpha1"
1112
batchv1 "k8s.io/api/batch/v1"
1213
corev1 "k8s.io/api/core/v1"
1314
eventsv1 "k8s.io/api/events/v1"
@@ -53,7 +54,7 @@ type ScanJobReconciler struct {
5354
//+kubebuilder:rbac:groups="events.k8s.io",resources=events,verbs=get;list;watch
5455
// Must add policyreports delete verb and containerimagescans/finalizers update verb to satisfy
5556
// https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#ownerreferencespermissionenforcement
56-
//+kubebuilder:rbac:groups="openreports.io",resources=reports,verbs=create;patch;delete
57+
//+kubebuilder:rbac:groups="openreports.io",resources=reports,verbs=get;list;watch;create;patch;delete
5758
//+kubebuilder:rbac:groups=stas.statnett.no,resources=containerimagescans/finalizers,verbs=update
5859

5960
// SetupWithManager sets up the controller with the Manager.
@@ -65,7 +66,8 @@ func (r *ScanJobReconciler) SetupWithManager(mgr ctrl.Manager) error {
6566
inNamespacePredicate(r.ScanJobNamespace),
6667
jobIsFinished,
6768
ignoreDeletionPredicate(),
68-
)).
69+
)).
70+
Watches(&openreportsv1alpha1.Report{}, handler.Funcs{}). // Watches reports with empty handler to ensure informer creation for metrics collection
6971
Complete(r.reconcile())
7072
if err != nil {
7173
return err

internal/metrics/collector.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/go-logr/logr"
99
openreportsv1alpha1 "github.com/openreports/reports-api/apis/openreports.io/v1alpha1"
1010
"github.com/prometheus/client_golang/prometheus"
11+
"k8s.io/apimachinery/pkg/api/errors"
1112
"k8s.io/apimachinery/pkg/api/meta"
1213
kstatus "sigs.k8s.io/cli-utils/pkg/kstatus/status"
1314
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -171,7 +172,10 @@ func (c ImageMetricsCollector) Collect(metrics chan<- prometheus.Metric) {
171172
if config.DefaultMutableFeatureGate.Enabled(feature.PolicyReport) {
172173
report := openreportsv1alpha1.Report{}
173174
if err := c.Get(ctx, client.ObjectKeyFromObject(&cis), &report); err != nil {
174-
c.Log.Error(err, "Failed to get Report", "namespace", cis.Namespace, "name", cis.Name)
175+
if !errors.IsNotFound(err) {
176+
c.Log.Error(err, "Failed to get Report", "namespace", cis.Namespace, "name", cis.Name)
177+
}
178+
175179
continue
176180
}
177181

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
apiVersion: v1
3+
kind: Pod
4+
metadata:
5+
name: metrics-up
6+
status:
7+
phase: Succeeded
8+
---
9+
# Assert that at least one Report exists to provide the custom metrics in the next step
10+
apiVersion: openreports.io/v1alpha1
11+
kind: Report
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
---
2+
apiVersion: v1
3+
kind: Service
4+
metadata:
5+
name: metrics
6+
namespace: image-scanner
7+
spec:
8+
ports:
9+
- name: metrics
10+
port: 80
11+
protocol: TCP
12+
targetPort: metrics
13+
selector:
14+
control-plane: image-scanner
15+
---
16+
apiVersion: v1
17+
kind: Pod
18+
metadata:
19+
name: metrics-up
20+
spec:
21+
restartPolicy: Never
22+
containers:
23+
- name: run
24+
image: docker.io/curlimages/curl
25+
command:
26+
- /bin/sh
27+
- -c
28+
args:
29+
- >-
30+
curl -s "http://metrics.image-scanner.svc.cluster.local:80/metrics" | grep certwatcher_read_certificate_errors_total;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
apiVersion: v1
3+
kind: Pod
4+
metadata:
5+
name: metrics-custom
6+
status:
7+
phase: Succeeded
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
---
2+
apiVersion: v1
3+
kind: Pod
4+
metadata:
5+
name: metrics-custom
6+
spec:
7+
restartPolicy: Never
8+
containers:
9+
- name: run
10+
image: docker.io/curlimages/curl
11+
command:
12+
- /bin/sh
13+
- -c
14+
args:
15+
- >-
16+
curl -s "http://metrics.image-scanner.svc.cluster.local:80/metrics" | grep image_scanner_container_image_issues;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json
2+
apiVersion: chainsaw.kyverno.io/v1alpha1
3+
kind: Test
4+
metadata:
5+
name: metrics
6+
spec:
7+
steps:
8+
- name: step-00
9+
try:
10+
- apply:
11+
file: 00-create.yaml
12+
- assert:
13+
file: 00-assert.yaml
14+
catch:
15+
- podLogs:
16+
namespace: image-scanner
17+
selector: control-plane=image-scanner
18+
- podLogs:
19+
name: metrics-up
20+
- name: step-01
21+
try:
22+
- apply:
23+
file: 01-create.yaml
24+
- assert:
25+
file: 01-assert.yaml
26+
catch:
27+
- podLogs:
28+
namespace: image-scanner
29+
selector: control-plane=image-scanner
30+
tail: -1
31+
- podLogs:
32+
name: metrics-custom

0 commit comments

Comments
 (0)