@@ -3,9 +3,36 @@ package metrics
3
3
import (
4
4
"github.com/kubescape/storage/pkg/apis/softwarecomposition/v1beta1"
5
5
"github.com/prometheus/client_golang/prometheus"
6
+ "os"
7
+ "strings"
6
8
)
7
9
8
10
var (
11
+ workloadCritical = prometheus .NewGaugeVec (prometheus.GaugeOpts {
12
+ Name : "kubescape_controls_total_workload_critical" ,
13
+ Help : "Total number of critical vulnerabilities in the workload" ,
14
+ }, []string {"namespace" , "workload" , "workload_kind" })
15
+
16
+ workloadHigh = prometheus .NewGaugeVec (prometheus.GaugeOpts {
17
+ Name : "kubescape_controls_total_workload_high" ,
18
+ Help : "Total number of high vulnerabilities in the workload" ,
19
+ }, []string {"namespace" , "workload" , "workload_kind" })
20
+
21
+ workloadMedium = prometheus .NewGaugeVec (prometheus.GaugeOpts {
22
+ Name : "kubescape_controls_total_workload_medium" ,
23
+ Help : "Total number of medium vulnerabilities in the workload" ,
24
+ }, []string {"namespace" , "workload" , "workload_kind" })
25
+
26
+ workloadLow = prometheus .NewGaugeVec (prometheus.GaugeOpts {
27
+ Name : "kubescape_controls_total_workload_low" ,
28
+ Help : "Total number of low vulnerabilities in the workload" ,
29
+ }, []string {"namespace" , "workload" , "workload_kind" })
30
+
31
+ workloadUnknown = prometheus .NewGaugeVec (prometheus.GaugeOpts {
32
+ Name : "kubescape_controls_total_workload_unknown" ,
33
+ Help : "Total number of unknown vulnerabilities in the workload" ,
34
+ }, []string {"namespace" , "workload" , "workload_kind" })
35
+
9
36
namespaceCritical = prometheus .NewGaugeVec (prometheus.GaugeOpts {
10
37
Name : "kubescape_controls_total_namespace_critical" ,
11
38
Help : "Total number of critical vulnerabilities in the namespace" ,
55
82
Help : "Total number of unknown vulnerabilities in the cluster" ,
56
83
})
57
84
85
+ workloadVulnCritical = prometheus .NewGaugeVec (prometheus.GaugeOpts {
86
+ Name : "kubescape_vulnerabilities_total_workload_critical" ,
87
+ Help : "Total number of critical vulnerabilities in the workload" ,
88
+ }, []string {"namespace" , "workload" , "workload_kind" , "workload_container_name" })
89
+
90
+ workloadVulnHigh = prometheus .NewGaugeVec (prometheus.GaugeOpts {
91
+ Name : "kubescape_vulnerabilities_total_workload_high" ,
92
+ Help : "Total number of high vulnerabilities in the workload" ,
93
+ }, []string {"namespace" , "workload" , "workload_kind" , "workload_container_name" })
94
+
95
+ workloadVulnMedium = prometheus .NewGaugeVec (prometheus.GaugeOpts {
96
+ Name : "kubescape_vulnerabilities_total_workload_medium" ,
97
+ Help : "Total number of medium vulnerabilities in the workload" ,
98
+ }, []string {"namespace" , "workload" , "workload_kind" , "workload_container_name" })
99
+
100
+ workloadVulnLow = prometheus .NewGaugeVec (prometheus.GaugeOpts {
101
+ Name : "kubescape_vulnerabilities_total_workload_low" ,
102
+ Help : "Total number of low vulnerabilities in the workload" ,
103
+ }, []string {"namespace" , "workload" , "workload_kind" , "workload_container_name" })
104
+
105
+ workloadVulnUnknown = prometheus .NewGaugeVec (prometheus.GaugeOpts {
106
+ Name : "kubescape_vulnerabilities_total_workload_unknown" ,
107
+ Help : "Total number of unknown vulnerabilities in the workload" ,
108
+ }, []string {"namespace" , "workload" , "workload_kind" , "workload_container_name" })
109
+
58
110
namespaceVulnCritical = prometheus .NewGaugeVec (prometheus.GaugeOpts {
59
111
Name : "kubescape_vulnerabilities_total_namespace_critical" ,
60
112
Help : "Total number of critical vulnerabilities in the namespace" ,
@@ -104,6 +156,31 @@ var (
104
156
Help : "Total number of unknown vulnerabilities in the cluster" ,
105
157
})
106
158
159
+ workloadVulnCriticalRelevant = prometheus .NewGaugeVec (prometheus.GaugeOpts {
160
+ Name : "kubescape_vulnerabilities_relevant_workload_critical" ,
161
+ Help : "Number of relevant critical vulnerabilities in the workload" ,
162
+ }, []string {"namespace" , "workload" , "workload_kind" , "workload_container_name" })
163
+
164
+ workloadVulnHighRelevant = prometheus .NewGaugeVec (prometheus.GaugeOpts {
165
+ Name : "kubescape_vulnerabilities_relevant_workload_high" ,
166
+ Help : "Number of relevant high vulnerabilities in the workload" ,
167
+ }, []string {"namespace" , "workload" , "workload_kind" , "workload_container_name" })
168
+
169
+ workloadVulnMediumRelevant = prometheus .NewGaugeVec (prometheus.GaugeOpts {
170
+ Name : "kubescape_vulnerabilities_relevant_workload_medium" ,
171
+ Help : "Number of relevant medium vulnerabilities in the workload" ,
172
+ }, []string {"namespace" , "workload" , "workload_kind" , "workload_container_name" })
173
+
174
+ workloadVulnLowRelevant = prometheus .NewGaugeVec (prometheus.GaugeOpts {
175
+ Name : "kubescape_vulnerabilities_relevant_workload_low" ,
176
+ Help : "Number of relevant low vulnerabilities in the workload" ,
177
+ }, []string {"namespace" , "workload" , "workload_kind" , "workload_container_name" })
178
+
179
+ workloadVulnUnknownRelevant = prometheus .NewGaugeVec (prometheus.GaugeOpts {
180
+ Name : "kubescape_vulnerabilities_relevant_workload_unknown" ,
181
+ Help : "Number of relevant unknown vulnerabilities in the workload" ,
182
+ }, []string {"namespace" , "workload" , "workload_kind" , "workload_container_name" })
183
+
107
184
namespaceVulnCriticalRelevant = prometheus .NewGaugeVec (prometheus.GaugeOpts {
108
185
Name : "kubescape_vulnerabilities_relevant_namespace_critical" ,
109
186
Help : "Number of relevant critical vulnerabilities in the namespace" ,
@@ -156,6 +233,23 @@ var (
156
233
)
157
234
158
235
func init () {
236
+ if os .Getenv ("ENABLE_WORKLOAD_METRICS" ) == "true" {
237
+ prometheus .MustRegister (workloadCritical )
238
+ prometheus .MustRegister (workloadHigh )
239
+ prometheus .MustRegister (workloadMedium )
240
+ prometheus .MustRegister (workloadLow )
241
+ prometheus .MustRegister (workloadUnknown )
242
+ prometheus .MustRegister (workloadVulnCritical )
243
+ prometheus .MustRegister (workloadVulnHigh )
244
+ prometheus .MustRegister (workloadVulnMedium )
245
+ prometheus .MustRegister (workloadVulnLow )
246
+ prometheus .MustRegister (workloadVulnUnknown )
247
+ prometheus .MustRegister (workloadVulnCriticalRelevant )
248
+ prometheus .MustRegister (workloadVulnHighRelevant )
249
+ prometheus .MustRegister (workloadVulnMediumRelevant )
250
+ prometheus .MustRegister (workloadVulnLowRelevant )
251
+ prometheus .MustRegister (workloadVulnUnknownRelevant )
252
+ }
159
253
prometheus .MustRegister (namespaceCritical )
160
254
prometheus .MustRegister (namespaceHigh )
161
255
prometheus .MustRegister (namespaceMedium )
@@ -188,6 +282,32 @@ func init() {
188
282
prometheus .MustRegister (clusterVulnUnknownRelevant )
189
283
}
190
284
285
+ func ProcessConfigscanWorkloadMetrics (summary * v1beta1.WorkloadConfigurationScanSummaryList ) {
286
+ for _ , item := range summary .Items {
287
+ namespace := item .ObjectMeta .Labels ["kubescape.io/workload-namespace" ]
288
+ workload := item .ObjectMeta .Labels ["kubescape.io/workload-name" ]
289
+ kind := strings .ToLower (item .ObjectMeta .Labels ["kubescape.io/workload-kind" ])
290
+
291
+ workloadCritical .WithLabelValues (namespace , workload , kind ).Set (float64 (item .Spec .Severities .Critical ))
292
+ workloadHigh .WithLabelValues (namespace , workload , kind ).Set (float64 (item .Spec .Severities .High ))
293
+ workloadLow .WithLabelValues (namespace , workload , kind ).Set (float64 (item .Spec .Severities .Low ))
294
+ workloadMedium .WithLabelValues (namespace , workload , kind ).Set (float64 (item .Spec .Severities .Medium ))
295
+ workloadUnknown .WithLabelValues (namespace , workload , kind ).Set (float64 (item .Spec .Severities .Unknown ))
296
+ }
297
+ }
298
+
299
+ func DeleteConfigscanWorkloadMetric (item * v1beta1.WorkloadConfigurationScanSummary ) {
300
+ namespace := item .ObjectMeta .Labels ["kubescape.io/workload-namespace" ]
301
+ workload := item .ObjectMeta .Labels ["kubescape.io/workload-name" ]
302
+ kind := strings .ToLower (item .ObjectMeta .Labels ["kubescape.io/workload-kind" ])
303
+
304
+ workloadCritical .DeleteLabelValues (namespace , workload , kind )
305
+ workloadHigh .DeleteLabelValues (namespace , workload , kind )
306
+ workloadMedium .DeleteLabelValues (namespace , workload , kind )
307
+ workloadLow .DeleteLabelValues (namespace , workload , kind )
308
+ workloadUnknown .DeleteLabelValues (namespace , workload , kind )
309
+ }
310
+
191
311
func ProcessConfigscanNamespaceMetrics (summary * v1beta1.ConfigurationScanSummaryList ) {
192
312
for _ , item := range summary .Items {
193
313
namespace := item .ObjectMeta .Name
@@ -218,6 +338,44 @@ func ProcessConfigscanClusterMetrics(summary *v1beta1.ConfigurationScanSummaryLi
218
338
return totalCritical , totalHigh , totalMedium , totalLow , totalUnknown
219
339
}
220
340
341
+ func ProcessVulnWorkloadMetrics (summary * v1beta1.VulnerabilityManifestSummaryList ) {
342
+ for _ , item := range summary .Items {
343
+ namespace := item .ObjectMeta .Labels ["kubescape.io/workload-namespace" ]
344
+ workload := item .ObjectMeta .Labels ["kubescape.io/workload-name" ]
345
+ kind := strings .ToLower (item .ObjectMeta .Labels ["kubescape.io/workload-kind" ])
346
+ containerName := strings .ToLower (item .ObjectMeta .Labels ["kubescape.io/workload-container-name" ])
347
+
348
+ workloadVulnCritical .WithLabelValues (namespace , workload , kind , containerName ).Set (float64 (item .Spec .Severities .Critical .All ))
349
+ workloadVulnHigh .WithLabelValues (namespace , workload , kind , containerName ).Set (float64 (item .Spec .Severities .High .All ))
350
+ workloadVulnMedium .WithLabelValues (namespace , workload , kind , containerName ).Set (float64 (item .Spec .Severities .Medium .All ))
351
+ workloadVulnLow .WithLabelValues (namespace , workload , kind , containerName ).Set (float64 (item .Spec .Severities .Low .All ))
352
+ workloadVulnUnknown .WithLabelValues (namespace , workload , kind , containerName ).Set (float64 (item .Spec .Severities .Unknown .All ))
353
+ workloadVulnCriticalRelevant .WithLabelValues (namespace , workload , kind , containerName ).Set (float64 (item .Spec .Severities .Critical .Relevant ))
354
+ workloadVulnHighRelevant .WithLabelValues (namespace , workload , kind , containerName ).Set (float64 (item .Spec .Severities .High .Relevant ))
355
+ workloadVulnMediumRelevant .WithLabelValues (namespace , workload , kind , containerName ).Set (float64 (item .Spec .Severities .Medium .Relevant ))
356
+ workloadVulnLowRelevant .WithLabelValues (namespace , workload , kind , containerName ).Set (float64 (item .Spec .Severities .Low .Relevant ))
357
+ workloadVulnUnknownRelevant .WithLabelValues (namespace , workload , kind , containerName ).Set (float64 (item .Spec .Severities .Unknown .Relevant ))
358
+ }
359
+ }
360
+
361
+ func DeleteVulnWorkloadMetric (item * v1beta1.VulnerabilityManifestSummary ) {
362
+ namespace := item .ObjectMeta .Labels ["kubescape.io/workload-namespace" ]
363
+ workload := item .ObjectMeta .Labels ["kubescape.io/workload-name" ]
364
+ kind := strings .ToLower (item .ObjectMeta .Labels ["kubescape.io/workload-kind" ])
365
+ containerName := strings .ToLower (item .ObjectMeta .Labels ["kubescape.io/workload-container-name" ])
366
+
367
+ workloadVulnCritical .DeleteLabelValues (namespace , workload , kind , containerName )
368
+ workloadVulnHigh .DeleteLabelValues (namespace , workload , kind , containerName )
369
+ workloadVulnMedium .DeleteLabelValues (namespace , workload , kind , containerName )
370
+ workloadVulnLow .DeleteLabelValues (namespace , workload , kind , containerName )
371
+ workloadVulnUnknown .DeleteLabelValues (namespace , workload , kind , containerName )
372
+ workloadVulnCriticalRelevant .DeleteLabelValues (namespace , workload , kind , containerName )
373
+ workloadVulnHighRelevant .DeleteLabelValues (namespace , workload , kind , containerName )
374
+ workloadVulnMediumRelevant .DeleteLabelValues (namespace , workload , kind , containerName )
375
+ workloadVulnLowRelevant .DeleteLabelValues (namespace , workload , kind , containerName )
376
+ workloadVulnUnknownRelevant .DeleteLabelValues (namespace , workload , kind , containerName )
377
+ }
378
+
221
379
func ProcessVulnNamespaceMetrics (summary * v1beta1.VulnerabilitySummaryList ) {
222
380
for _ , item := range summary .Items {
223
381
namespace := item .ObjectMeta .Name
0 commit comments