From c3ed79c41649d1d9b964d257605e3c805c2869c3 Mon Sep 17 00:00:00 2001 From: Fabrizio Sestito Date: Wed, 20 Mar 2024 08:23:29 +0100 Subject: [PATCH] feat: add policy initialization error metric Signed-off-by: Fabrizio Sestito --- src/api/service.rs | 24 +++++++++++++++++------- src/metrics.rs | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/api/service.rs b/src/api/service.rs index 90ba7d77..02cefd91 100644 --- a/src/api/service.rs +++ b/src/api/service.rs @@ -40,11 +40,18 @@ pub(crate) fn evaluate( match evaluation_environment.validate(policy_id, validate_request) { Ok(validation_response) => validation_response, Err(EvaluationError::PolicyInitialization(error)) => { + let policy_initialization_error_metric = metrics::PolicyInitializationError { + policy_name: policy_id.to_string(), + initialization_error: error.to_string(), + }; + + metrics::add_policy_evaluation(&policy_initialization_error_metric); + return Ok(AdmissionResponse::reject( validate_request.uid().to_owned(), error.to_string(), 500, - )) + )); } Err(error) => return Err(error), @@ -97,7 +104,7 @@ pub(crate) fn evaluate( }; } } - let policy_evaluation = metrics::PolicyEvaluation { + let policy_evaluation_metric = metrics::PolicyEvaluation { policy_name, policy_mode: policy_mode.into(), resource_namespace: adm_req.clone().namespace, @@ -108,21 +115,24 @@ pub(crate) fn evaluate( request_origin: request_origin.to_string(), error_code, }; - metrics::record_policy_latency(policy_evaluation_duration, &policy_evaluation); - metrics::add_policy_evaluation(&policy_evaluation); + metrics::record_policy_latency(policy_evaluation_duration, &policy_evaluation_metric); + metrics::add_policy_evaluation(&policy_evaluation_metric); } ValidateRequest::Raw(_) => { let accepted = vanilla_validation_response.allowed; let mutated = vanilla_validation_response.patch.is_some(); - let policy_evaluation = metrics::RawPolicyEvaluation { + let raw_policy_evaluation_metric = metrics::RawPolicyEvaluation { policy_name, policy_mode: policy_mode.into(), accepted, mutated, error_code, }; - metrics::record_policy_latency(policy_evaluation_duration, &policy_evaluation); - metrics::add_policy_evaluation(&policy_evaluation); + metrics::record_policy_latency( + policy_evaluation_duration, + &raw_policy_evaluation_metric, + ); + metrics::add_policy_evaluation(&raw_policy_evaluation_metric); } }; Ok(validation_response) diff --git a/src/metrics.rs b/src/metrics.rs index c65c1bec..0d9bd8f7 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -93,3 +93,21 @@ impl Into> for &RawPolicyEvaluation { baggage } } + +#[derive(Clone)] +pub(crate) struct PolicyInitializationError { + pub(crate) policy_name: String, + pub(crate) initialization_error: String, +} + +impl PolicyEvaluationMetric for &PolicyInitializationError {} + +#[allow(clippy::from_over_into)] +impl Into> for &PolicyInitializationError { + fn into(self) -> Vec { + vec![ + KeyValue::new("policy_name", self.policy_name.clone()), + KeyValue::new("initialization_error", self.initialization_error.clone()), + ] + } +}