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"
2022-05-17 13:12:43 +02:00
kyvernov1 "github.com/kyverno/kyverno/api/kyverno/v1"
2021-05-15 19:15:04 +05:30
"github.com/kyverno/kyverno/pkg/engine/response"
"github.com/kyverno/kyverno/pkg/metrics"
2022-04-04 17:31:33 +02:00
"github.com/kyverno/kyverno/pkg/utils"
2021-05-15 19:15:04 +05:30
)
2022-04-06 20:14:13 +02:00
func registerPolicyResultsMetric (
2022-07-11 23:19:47 +05:30
m * metrics . MetricsConfig ,
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 = "-"
}
2022-07-11 23:19:47 +05:30
includeNamespaces , excludeNamespaces := m . Config . GetIncludeNamespaces ( ) , m . Config . GetExcludeNamespaces ( )
2022-04-04 17:31:33 +02:00
if ( resourceNamespace != "" && resourceNamespace != "-" ) && utils . ContainsString ( excludeNamespaces , resourceNamespace ) {
2022-08-18 18:54:59 +05:30
m . Log . V ( 2 ) . 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 ) )
2021-09-11 03:09:12 +05:30
return nil
}
2022-04-04 17:31:33 +02:00
if ( resourceNamespace != "" && resourceNamespace != "-" ) && len ( includeNamespaces ) > 0 && ! utils . ContainsString ( includeNamespaces , resourceNamespace ) {
2022-08-18 18:54:59 +05:30
m . Log . V ( 2 ) . 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 ) )
2021-09-11 03:09:12 +05:30
return nil
}
2022-07-11 23:19:47 +05:30
m . RecordPolicyResults ( policyValidationMode , policyType , policyBackgroundMode , policyNamespace , policyName , resourceKind , resourceNamespace , resourceRequestOperation , ruleName , ruleResult , ruleType , ruleExecutionCause )
2021-05-15 19:15:04 +05:30
return nil
}
2022-07-11 23:19:47 +05:30
//policy - policy related data
//engineResponse - resource and rule related data
func ProcessEngineResponse ( m * metrics . MetricsConfig , policy kyvernov1 . PolicyInterface , engineResponse response . EngineResponse , executionCause metrics . RuleExecutionCause , resourceRequestOperation metrics . ResourceRequestOperation ) error {
2022-07-20 23:22:03 +08:00
name , namespace , policyType , backgroundMode , validationMode , err := metrics . GetPolicyInfos ( policy )
2021-05-15 19:15:04 +05:30
if err != nil {
return err
}
resourceSpec := engineResponse . PolicyResponse . Resource
resourceKind := resourceSpec . Kind
resourceNamespace := resourceSpec . Namespace
ruleResponses := engineResponse . PolicyResponse . Rules
for _ , rule := range ruleResponses {
ruleName := rule . Name
2022-04-06 20:14:13 +02:00
ruleType := metrics . ParseRuleTypeFromEngineRuleResponse ( rule )
2021-10-30 02:56:04 +05:30
var ruleResult metrics . RuleResult
switch rule . Status {
case response . RuleStatusPass :
2021-05-15 19:15:04 +05:30
ruleResult = metrics . Pass
2021-10-30 02:56:04 +05:30
case response . RuleStatusFail :
ruleResult = metrics . Fail
case response . RuleStatusWarn :
ruleResult = metrics . Warn
case response . RuleStatusError :
ruleResult = metrics . Error
case response . RuleStatusSkip :
ruleResult = metrics . Skip
default :
ruleResult = metrics . Fail
2021-05-15 19:15:04 +05:30
}
2022-04-06 20:14:13 +02:00
if err := registerPolicyResultsMetric (
2022-07-11 23:19:47 +05:30
m ,
2022-04-06 20:14:13 +02:00
validationMode ,
2021-05-15 19:15:04 +05:30
policyType ,
2022-04-06 20:14:13 +02:00
backgroundMode ,
namespace , name ,
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
}