2021-07-23 21:46:50 +05:30
package admissionreviewduration
import (
2021-09-11 03:09:12 +05:30
"fmt"
2021-07-23 21:46:50 +05:30
"github.com/kyverno/kyverno/pkg/engine/response"
"github.com/kyverno/kyverno/pkg/metrics"
prom "github.com/prometheus/client_golang/prometheus"
)
2021-09-11 03:09:12 +05:30
func ( pc PromConfig ) registerAdmissionReviewDurationMetric (
2021-09-02 06:56:25 +05:30
resourceKind , resourceNamespace string ,
2021-07-23 21:46:50 +05:30
resourceRequestOperation metrics . ResourceRequestOperation ,
admissionRequestLatency float64 ,
) error {
2021-09-11 03:09:12 +05:30
includeNamespaces , excludeNamespaces := pc . Config . GetIncludeNamespaces ( ) , pc . Config . GetExcludeNamespaces ( )
if ( resourceNamespace != "" && resourceNamespace != "-" ) && metrics . ElementInSlice ( resourceNamespace , excludeNamespaces ) {
pc . Log . Info ( fmt . Sprintf ( "Skipping the registration of kyverno_admission_review_duration_seconds metric as the operation belongs to the namespace '%s' which is one of 'namespaces.exclude' %+v in values.yaml" , resourceNamespace , excludeNamespaces ) )
return nil
}
if ( resourceNamespace != "" && resourceNamespace != "-" ) && len ( includeNamespaces ) > 0 && ! metrics . ElementInSlice ( resourceNamespace , includeNamespaces ) {
pc . Log . Info ( fmt . Sprintf ( "Skipping the registration of kyverno_admission_review_duration_seconds metric as the operation belongs to the namespace '%s' which is not one of 'namespaces.include' %+v in values.yaml" , resourceNamespace , includeNamespaces ) )
return nil
}
pc . Metrics . AdmissionReviewDuration . With ( prom . Labels {
2021-07-23 21:46:50 +05:30
"resource_kind" : resourceKind ,
"resource_namespace" : resourceNamespace ,
"resource_request_operation" : string ( resourceRequestOperation ) ,
} ) . Observe ( admissionRequestLatency )
return nil
}
2021-09-11 03:09:12 +05:30
func ( pc PromConfig ) ProcessEngineResponses ( engineResponses [ ] * response . EngineResponse , admissionReviewLatencyDuration int64 , resourceRequestOperation metrics . ResourceRequestOperation ) error {
2021-07-23 21:46:50 +05:30
if len ( engineResponses ) == 0 {
return nil
}
2021-09-02 06:56:25 +05:30
resourceNamespace , resourceKind := engineResponses [ 0 ] . PolicyResponse . Resource . Namespace , engineResponses [ 0 ] . PolicyResponse . Resource . Kind
2021-07-23 21:46:50 +05:30
totalValidateRulesCount , totalMutateRulesCount , totalGenerateRulesCount := 0 , 0 , 0
for _ , e := range engineResponses {
validateRulesCount , mutateRulesCount , generateRulesCount := 0 , 0 , 0
for _ , rule := range e . PolicyResponse . Rules {
switch rule . Type {
case "Validation" :
validateRulesCount ++
case "Mutation" :
mutateRulesCount ++
case "Generation" :
generateRulesCount ++
}
}
// no rules triggered
if validateRulesCount + mutateRulesCount + generateRulesCount == 0 {
continue
}
totalValidateRulesCount += validateRulesCount
totalMutateRulesCount += mutateRulesCount
totalGenerateRulesCount += generateRulesCount
}
if totalValidateRulesCount + totalMutateRulesCount + totalGenerateRulesCount == 0 {
return nil
}
admissionReviewLatencyDurationInSeconds := float64 ( admissionReviewLatencyDuration ) / float64 ( 1000 * 1000 * 1000 )
2021-09-11 03:09:12 +05:30
return pc . registerAdmissionReviewDurationMetric ( resourceKind , resourceNamespace , resourceRequestOperation , admissionReviewLatencyDurationInSeconds )
2021-07-23 21:46:50 +05:30
}