2021-07-23 21:46:50 +05:30
package policyresults
2021-05-15 19:15:04 +05:30
import (
2021-09-11 03:09:12 +05:30
"fmt"
2021-05-15 19:15:04 +05:30
kyverno "github.com/kyverno/kyverno/pkg/api/kyverno/v1"
"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 ) registerPolicyResultsMetric (
2021-05-15 19:15:04 +05:30
policyValidationMode metrics . PolicyValidationMode ,
policyType metrics . PolicyType ,
policyBackgroundMode metrics . PolicyBackgroundMode ,
policyNamespace , policyName string ,
2021-09-02 06:56:25 +05:30
resourceKind , resourceNamespace string ,
2021-05-15 19:15:04 +05:30
resourceRequestOperation metrics . ResourceRequestOperation ,
ruleName string ,
ruleResult metrics . RuleResult ,
ruleType metrics . RuleType ,
ruleExecutionCause metrics . RuleExecutionCause ,
) error {
if policyType == metrics . Cluster {
policyNamespace = "-"
}
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_policy_results_total 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_policy_results_total 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 . PolicyResults . With ( prom . Labels {
2021-07-23 21:46:50 +05:30
"policy_validation_mode" : string ( policyValidationMode ) ,
"policy_type" : string ( policyType ) ,
"policy_background_mode" : string ( policyBackgroundMode ) ,
"policy_namespace" : policyNamespace ,
"policy_name" : policyName ,
"resource_kind" : resourceKind ,
"resource_namespace" : resourceNamespace ,
"resource_request_operation" : string ( resourceRequestOperation ) ,
"rule_name" : ruleName ,
"rule_result" : string ( ruleResult ) ,
"rule_type" : string ( ruleType ) ,
"rule_execution_cause" : string ( ruleExecutionCause ) ,
} ) . Inc ( )
2021-05-15 19:15:04 +05:30
return nil
}
//policy - policy related data
//engineResponse - resource and rule related data
2021-09-11 03:09:12 +05:30
func ( pc PromConfig ) ProcessEngineResponse ( policy kyverno . ClusterPolicy , engineResponse response . EngineResponse , executionCause metrics . RuleExecutionCause , resourceRequestOperation metrics . ResourceRequestOperation ) error {
2021-05-15 19:15:04 +05:30
policyValidationMode , err := metrics . ParsePolicyValidationMode ( policy . Spec . ValidationFailureAction )
if err != nil {
return err
}
policyType := metrics . Namespaced
2021-06-14 13:42:57 -07:00
policyBackgroundMode := metrics . ParsePolicyBackgroundMode ( policy . Spec . Background )
2021-05-15 19:15:04 +05:30
policyNamespace := policy . ObjectMeta . Namespace
if policyNamespace == "" {
policyNamespace = "-"
policyType = metrics . Cluster
}
policyName := policy . ObjectMeta . Name
resourceSpec := engineResponse . PolicyResponse . Resource
resourceKind := resourceSpec . Kind
resourceNamespace := resourceSpec . Namespace
ruleResponses := engineResponse . PolicyResponse . Rules
for _ , rule := range ruleResponses {
ruleName := rule . Name
ruleType := ParseRuleTypeFromEngineRuleResponse ( rule )
ruleResult := metrics . Fail
if rule . Success {
ruleResult = metrics . Pass
}
2021-09-11 03:09:12 +05:30
if err := pc . registerPolicyResultsMetric (
2021-05-15 19:15:04 +05:30
policyValidationMode ,
policyType ,
policyBackgroundMode ,
policyNamespace , policyName ,
2021-09-02 06:56:25 +05:30
resourceKind , resourceNamespace ,
2021-05-15 19:15:04 +05:30
resourceRequestOperation ,
ruleName ,
ruleResult ,
ruleType ,
executionCause ,
) ; err != nil {
return err
}
}
return nil
}