Skip to content

Commit 48371a6

Browse files
Make scanner and opa optional for metric handler (#197)
Co-authored-by: Arnob Kumar Saha <[email protected]> Signed-off-by: Tamal Saha <[email protected]>
1 parent 99caecf commit 48371a6

File tree

3 files changed

+133
-103
lines changed

3 files changed

+133
-103
lines changed

pkg/graph/setup.go

+13
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,14 @@ func PollNewResourceTypes(cfg *restclient.Config) func(ctx context.Context) erro
101101
}
102102
}
103103

104+
var (
105+
opaInstalled bool
106+
scannerInstalled bool
107+
)
108+
109+
func OPAInstalled() bool { return opaInstalled }
110+
func ScannerInstalled() bool { return scannerInstalled }
111+
104112
func SetupGraphReconciler(mgr manager.Manager) func(ctx context.Context) error {
105113
return func(ctx context.Context) error {
106114
for rid := range resourceChannel {
@@ -112,8 +120,13 @@ func SetupGraphReconciler(mgr manager.Manager) func(ctx context.Context) error {
112120
return err
113121
}
114122

123+
if rid.Group == "templates.gatekeeper.sh" && rid.Kind == "ConstraintTemplate" {
124+
opaInstalled = true
125+
}
126+
115127
if rid.Group == scannerapi.SchemeGroupVersion.Group &&
116128
rid.Kind == scannerapi.ResourceKindImageScanRequest {
129+
scannerInstalled = true
117130
if err := (&scannercontrollers.WorkloadReconciler{
118131
Client: mgr.GetClient(),
119132
}).SetupWithManager(mgr); err != nil {

pkg/metricshandler/handler.go

+117-100
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"io"
2121
"net/http"
2222

23+
"kubeops.dev/ui-server/pkg/graph"
2324
"kubeops.dev/ui-server/pkg/metricsstore"
2425

2526
"github.com/prometheus/client_golang/prometheus/promhttp"
@@ -64,117 +65,133 @@ func (m *MetricsHandler) Install(c *mux.PathRecorderMux) {
6465

6566
func collectMetrics(kc client.Client, w io.Writer) error {
6667
generators := getFamilyGenerators()
68+
if len(generators) == 0 {
69+
_, err := w.Write([]byte("OK"))
70+
return err
71+
}
72+
6773
// Generate the headers for the resources metrics
6874
headers := generator.ExtractMetricFamilyHeaders(generators)
6975
store := metricsstore.NewMetricsStore(headers)
7076

71-
err := collectScannerMetrics(kc, generators, store)
72-
if err != nil {
73-
return err
77+
offset := 0
78+
if graph.ScannerInstalled() {
79+
err := collectScannerMetrics(kc, generators, store)
80+
if err != nil {
81+
return err
82+
}
83+
offset = 9 // # of scanner metrics families
7484
}
75-
err = collectPolicyMetrics(kc, generators, store)
76-
if err != nil {
77-
return err
85+
if graph.OPAInstalled() {
86+
err := collectPolicyMetrics(kc, generators, store, offset)
87+
if err != nil {
88+
return err
89+
}
7890
}
7991
return store.WriteAll(w)
8092
}
8193

8294
func getFamilyGenerators() []generator.FamilyGenerator {
8395
fn := func(obj interface{}) *metric.Family { return new(metric.Family) }
8496
generators := make([]generator.FamilyGenerator, 0, 13)
85-
generators = append(generators, generator.FamilyGenerator{
86-
Name: scannerMetricPrefix + "cluster_cve_occurrence",
87-
Help: "CVE occurrence statistics",
88-
Type: metric.Gauge,
89-
DeprecatedVersion: "",
90-
GenerateFunc: fn,
91-
})
92-
generators = append(generators, generator.FamilyGenerator{
93-
Name: scannerMetricPrefix + "cluster_cve_occurrence_total",
94-
Help: "Cluster total CVE occurrence",
95-
Type: metric.Gauge,
96-
DeprecatedVersion: "",
97-
GenerateFunc: fn,
98-
})
99-
generators = append(generators, generator.FamilyGenerator{
100-
Name: scannerMetricPrefix + "cluster_cve_count_total",
101-
Help: "Cluster total unique CVE count",
102-
Type: metric.Gauge,
103-
DeprecatedVersion: "",
104-
GenerateFunc: fn,
105-
})
106-
generators = append(generators, generator.FamilyGenerator{
107-
Name: scannerMetricPrefix + "namespace_cve_occurrence",
108-
Help: "Namespace CVE occurrence statistics",
109-
Type: metric.Gauge,
110-
DeprecatedVersion: "",
111-
GenerateFunc: fn,
112-
})
113-
generators = append(generators, generator.FamilyGenerator{
114-
Name: scannerMetricPrefix + "namespace_cve_occurrence_total",
115-
Help: "Namespace total CVE occurrence",
116-
Type: metric.Gauge,
117-
DeprecatedVersion: "",
118-
GenerateFunc: fn,
119-
})
120-
generators = append(generators, generator.FamilyGenerator{
121-
Name: scannerMetricPrefix + "namespace_cve_count_total",
122-
Help: "Namespace total unique CVE count",
123-
Type: metric.Gauge,
124-
DeprecatedVersion: "",
125-
GenerateFunc: fn,
126-
})
127-
128-
generators = append(generators, generator.FamilyGenerator{
129-
Name: scannerMetricPrefix + "image_cve_occurrence_total",
130-
Help: "Image total CVE occurrence",
131-
Type: metric.Gauge,
132-
DeprecatedVersion: "",
133-
GenerateFunc: fn,
134-
})
135-
generators = append(generators, generator.FamilyGenerator{
136-
Name: scannerMetricPrefix + "image_cve_count_total",
137-
Help: "Image total unique CVE count",
138-
Type: metric.Gauge,
139-
DeprecatedVersion: "",
140-
GenerateFunc: fn,
141-
})
142-
generators = append(generators, generator.FamilyGenerator{
143-
Name: scannerMetricPrefix + "image_lineage",
144-
Help: "Image Lineage",
145-
Type: metric.Gauge,
146-
DeprecatedVersion: "",
147-
GenerateFunc: fn,
148-
})
149-
150-
// Policy related metrics
151-
generators = append(generators, generator.FamilyGenerator{
152-
Name: policyMetricPrefix + "cluster_violation_occurrence_total",
153-
Help: "Cluster-wide Violation Occurrence statistics",
154-
Type: metric.Gauge,
155-
DeprecatedVersion: "",
156-
GenerateFunc: fn,
157-
})
158-
generators = append(generators, generator.FamilyGenerator{
159-
Name: policyMetricPrefix + "cluster_violation_occurrence_by_constraint_type",
160-
Help: "Cluster-wide Violation Occurrence statistics by constraint type",
161-
Type: metric.Gauge,
162-
DeprecatedVersion: "",
163-
GenerateFunc: fn,
164-
})
165-
generators = append(generators, generator.FamilyGenerator{
166-
Name: policyMetricPrefix + "namespace_violation_occurrence_total",
167-
Help: "Namespace-wise total Violation Occurrence statistics",
168-
Type: metric.Gauge,
169-
DeprecatedVersion: "",
170-
GenerateFunc: fn,
171-
})
172-
generators = append(generators, generator.FamilyGenerator{
173-
Name: policyMetricPrefix + "namespace_violation_occurrence_by_constraint_type",
174-
Help: "Namespace-wise Violation Occurrence statistics by constraint type",
175-
Type: metric.Gauge,
176-
DeprecatedVersion: "",
177-
GenerateFunc: fn,
178-
})
97+
98+
if graph.ScannerInstalled() {
99+
generators = append(generators, generator.FamilyGenerator{
100+
Name: scannerMetricPrefix + "cluster_cve_occurrence",
101+
Help: "CVE occurrence statistics",
102+
Type: metric.Gauge,
103+
DeprecatedVersion: "",
104+
GenerateFunc: fn,
105+
})
106+
generators = append(generators, generator.FamilyGenerator{
107+
Name: scannerMetricPrefix + "cluster_cve_occurrence_total",
108+
Help: "Cluster total CVE occurrence",
109+
Type: metric.Gauge,
110+
DeprecatedVersion: "",
111+
GenerateFunc: fn,
112+
})
113+
generators = append(generators, generator.FamilyGenerator{
114+
Name: scannerMetricPrefix + "cluster_cve_count_total",
115+
Help: "Cluster total unique CVE count",
116+
Type: metric.Gauge,
117+
DeprecatedVersion: "",
118+
GenerateFunc: fn,
119+
})
120+
generators = append(generators, generator.FamilyGenerator{
121+
Name: scannerMetricPrefix + "namespace_cve_occurrence",
122+
Help: "Namespace CVE occurrence statistics",
123+
Type: metric.Gauge,
124+
DeprecatedVersion: "",
125+
GenerateFunc: fn,
126+
})
127+
generators = append(generators, generator.FamilyGenerator{
128+
Name: scannerMetricPrefix + "namespace_cve_occurrence_total",
129+
Help: "Namespace total CVE occurrence",
130+
Type: metric.Gauge,
131+
DeprecatedVersion: "",
132+
GenerateFunc: fn,
133+
})
134+
generators = append(generators, generator.FamilyGenerator{
135+
Name: scannerMetricPrefix + "namespace_cve_count_total",
136+
Help: "Namespace total unique CVE count",
137+
Type: metric.Gauge,
138+
DeprecatedVersion: "",
139+
GenerateFunc: fn,
140+
})
141+
142+
generators = append(generators, generator.FamilyGenerator{
143+
Name: scannerMetricPrefix + "image_cve_occurrence_total",
144+
Help: "Image total CVE occurrence",
145+
Type: metric.Gauge,
146+
DeprecatedVersion: "",
147+
GenerateFunc: fn,
148+
})
149+
generators = append(generators, generator.FamilyGenerator{
150+
Name: scannerMetricPrefix + "image_cve_count_total",
151+
Help: "Image total unique CVE count",
152+
Type: metric.Gauge,
153+
DeprecatedVersion: "",
154+
GenerateFunc: fn,
155+
})
156+
generators = append(generators, generator.FamilyGenerator{
157+
Name: scannerMetricPrefix + "image_lineage",
158+
Help: "Image Lineage",
159+
Type: metric.Gauge,
160+
DeprecatedVersion: "",
161+
GenerateFunc: fn,
162+
})
163+
}
164+
165+
if graph.OPAInstalled() {
166+
// Policy related metrics
167+
generators = append(generators, generator.FamilyGenerator{
168+
Name: policyMetricPrefix + "cluster_violation_occurrence_total",
169+
Help: "Cluster-wide Violation Occurrence statistics",
170+
Type: metric.Gauge,
171+
DeprecatedVersion: "",
172+
GenerateFunc: fn,
173+
})
174+
generators = append(generators, generator.FamilyGenerator{
175+
Name: policyMetricPrefix + "cluster_violation_occurrence_by_constraint_type",
176+
Help: "Cluster-wide Violation Occurrence statistics by constraint type",
177+
Type: metric.Gauge,
178+
DeprecatedVersion: "",
179+
GenerateFunc: fn,
180+
})
181+
generators = append(generators, generator.FamilyGenerator{
182+
Name: policyMetricPrefix + "namespace_violation_occurrence_total",
183+
Help: "Namespace-wise total Violation Occurrence statistics",
184+
Type: metric.Gauge,
185+
DeprecatedVersion: "",
186+
GenerateFunc: fn,
187+
})
188+
generators = append(generators, generator.FamilyGenerator{
189+
Name: policyMetricPrefix + "namespace_violation_occurrence_by_constraint_type",
190+
Help: "Namespace-wise Violation Occurrence statistics by constraint type",
191+
Type: metric.Gauge,
192+
DeprecatedVersion: "",
193+
GenerateFunc: fn,
194+
})
195+
}
179196
return generators
180197
}

pkg/metricshandler/handler_policy.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ import (
2828
"sigs.k8s.io/controller-runtime/pkg/client"
2929
)
3030

31-
func collectPolicyMetrics(kc client.Client, generators []generator.FamilyGenerator, store *metricsstore.MetricsStore) error {
32-
if clTotal, clByType, err := collectForCluster(kc, generators[9], generators[10]); err != nil {
31+
func collectPolicyMetrics(kc client.Client, generators []generator.FamilyGenerator, store *metricsstore.MetricsStore, offset int) error {
32+
if clTotal, clByType, err := collectForCluster(kc, generators[offset], generators[offset+1]); err != nil {
3333
return err
3434
} else {
3535
store.Add(clTotal, clByType)
3636
}
3737

38-
if nsTotal, nsByType, err := collectForNamespace(kc, generators[11], generators[12]); err != nil {
38+
if nsTotal, nsByType, err := collectForNamespace(kc, generators[offset+2], generators[offset+3]); err != nil {
3939
return err
4040
} else {
4141
store.Add(nsTotal, nsByType)

0 commit comments

Comments
 (0)