mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-10-31 01:57:45 +08:00 
			
		
		
		
	feat(routing): Integrate global success rates (#6950)
Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
		| @ -25202,9 +25202,19 @@ | |||||||
|               } |               } | ||||||
|             ], |             ], | ||||||
|             "nullable": true |             "nullable": true | ||||||
|  |           }, | ||||||
|  |           "specificity_level": { | ||||||
|  |             "$ref": "#/components/schemas/SuccessRateSpecificityLevel" | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       }, |       }, | ||||||
|  |       "SuccessRateSpecificityLevel": { | ||||||
|  |         "type": "string", | ||||||
|  |         "enum": [ | ||||||
|  |           "merchant", | ||||||
|  |           "global" | ||||||
|  |         ] | ||||||
|  |       }, | ||||||
|       "SupportedPaymentMethod": { |       "SupportedPaymentMethod": { | ||||||
|         "allOf": [ |         "allOf": [ | ||||||
|           { |           { | ||||||
|  | |||||||
| @ -779,6 +779,7 @@ impl Default for SuccessBasedRoutingConfig { | |||||||
|                     duration_in_mins: Some(5), |                     duration_in_mins: Some(5), | ||||||
|                     max_total_count: Some(2), |                     max_total_count: Some(2), | ||||||
|                 }), |                 }), | ||||||
|  |                 specificity_level: SuccessRateSpecificityLevel::default(), | ||||||
|             }), |             }), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @ -801,6 +802,8 @@ pub struct SuccessBasedRoutingConfigBody { | |||||||
|     pub default_success_rate: Option<f64>, |     pub default_success_rate: Option<f64>, | ||||||
|     pub max_aggregates_size: Option<u32>, |     pub max_aggregates_size: Option<u32>, | ||||||
|     pub current_block_threshold: Option<CurrentBlockThreshold>, |     pub current_block_threshold: Option<CurrentBlockThreshold>, | ||||||
|  |     #[serde(default)] | ||||||
|  |     pub specificity_level: SuccessRateSpecificityLevel, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, ToSchema)] | #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, ToSchema)] | ||||||
| @ -809,6 +812,14 @@ pub struct CurrentBlockThreshold { | |||||||
|     pub max_total_count: Option<u64>, |     pub max_total_count: Option<u64>, | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #[derive(serde::Serialize, serde::Deserialize, Debug, Default, Clone, ToSchema)] | ||||||
|  | #[serde(rename_all = "snake_case")] | ||||||
|  | pub enum SuccessRateSpecificityLevel { | ||||||
|  |     #[default] | ||||||
|  |     Merchant, | ||||||
|  |     Global, | ||||||
|  | } | ||||||
|  |  | ||||||
| #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] | #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] | ||||||
| pub struct SuccessBasedRoutingPayloadWrapper { | pub struct SuccessBasedRoutingPayloadWrapper { | ||||||
|     pub updated_config: SuccessBasedRoutingConfig, |     pub updated_config: SuccessBasedRoutingConfig, | ||||||
| @ -849,6 +860,7 @@ impl SuccessBasedRoutingConfigBody { | |||||||
|                 .as_mut() |                 .as_mut() | ||||||
|                 .map(|threshold| threshold.update(current_block_threshold)); |                 .map(|threshold| threshold.update(current_block_threshold)); | ||||||
|         } |         } | ||||||
|  |         self.specificity_level = new.specificity_level | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -20,6 +20,7 @@ pub struct DynamicRoutingStatsNew { | |||||||
|     pub conclusive_classification: common_enums::SuccessBasedRoutingConclusiveState, |     pub conclusive_classification: common_enums::SuccessBasedRoutingConclusiveState, | ||||||
|     pub created_at: time::PrimitiveDateTime, |     pub created_at: time::PrimitiveDateTime, | ||||||
|     pub payment_method_type: Option<common_enums::PaymentMethodType>, |     pub payment_method_type: Option<common_enums::PaymentMethodType>, | ||||||
|  |     pub global_success_based_connector: Option<String>, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Clone, Debug, Eq, PartialEq, Queryable, Selectable, Insertable)] | #[derive(Clone, Debug, Eq, PartialEq, Queryable, Selectable, Insertable)] | ||||||
| @ -40,4 +41,5 @@ pub struct DynamicRoutingStats { | |||||||
|     pub conclusive_classification: common_enums::SuccessBasedRoutingConclusiveState, |     pub conclusive_classification: common_enums::SuccessBasedRoutingConclusiveState, | ||||||
|     pub created_at: time::PrimitiveDateTime, |     pub created_at: time::PrimitiveDateTime, | ||||||
|     pub payment_method_type: Option<common_enums::PaymentMethodType>, |     pub payment_method_type: Option<common_enums::PaymentMethodType>, | ||||||
|  |     pub global_success_based_connector: Option<String>, | ||||||
| } | } | ||||||
|  | |||||||
| @ -435,6 +435,8 @@ diesel::table! { | |||||||
|         created_at -> Timestamp, |         created_at -> Timestamp, | ||||||
|         #[max_length = 64] |         #[max_length = 64] | ||||||
|         payment_method_type -> Nullable<Varchar>, |         payment_method_type -> Nullable<Varchar>, | ||||||
|  |         #[max_length = 64] | ||||||
|  |         global_success_based_connector -> Nullable<Varchar>, | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -447,6 +447,8 @@ diesel::table! { | |||||||
|         created_at -> Timestamp, |         created_at -> Timestamp, | ||||||
|         #[max_length = 64] |         #[max_length = 64] | ||||||
|         payment_method_type -> Nullable<Varchar>, |         payment_method_type -> Nullable<Varchar>, | ||||||
|  |         #[max_length = 64] | ||||||
|  |         global_success_based_connector -> Nullable<Varchar>, | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -1,15 +1,17 @@ | |||||||
| use api_models::routing::{ | use api_models::routing::{ | ||||||
|     CurrentBlockThreshold, RoutableConnectorChoice, RoutableConnectorChoiceWithStatus, |     CurrentBlockThreshold, RoutableConnectorChoice, RoutableConnectorChoiceWithStatus, | ||||||
|     SuccessBasedRoutingConfig, SuccessBasedRoutingConfigBody, |     SuccessBasedRoutingConfig, SuccessBasedRoutingConfigBody, SuccessRateSpecificityLevel, | ||||||
| }; | }; | ||||||
| use common_utils::{ext_traits::OptionExt, transformers::ForeignTryFrom}; | use common_utils::{ext_traits::OptionExt, transformers::ForeignTryFrom}; | ||||||
| use error_stack::ResultExt; | use error_stack::ResultExt; | ||||||
| use router_env::{instrument, logger, tracing}; | use router_env::{instrument, logger, tracing}; | ||||||
| pub use success_rate::{ | pub use success_rate::{ | ||||||
|     success_rate_calculator_client::SuccessRateCalculatorClient, CalSuccessRateConfig, |     success_rate_calculator_client::SuccessRateCalculatorClient, CalGlobalSuccessRateConfig, | ||||||
|  |     CalGlobalSuccessRateRequest, CalGlobalSuccessRateResponse, CalSuccessRateConfig, | ||||||
|     CalSuccessRateRequest, CalSuccessRateResponse, |     CalSuccessRateRequest, CalSuccessRateResponse, | ||||||
|     CurrentBlockThreshold as DynamicCurrentThreshold, InvalidateWindowsRequest, |     CurrentBlockThreshold as DynamicCurrentThreshold, InvalidateWindowsRequest, | ||||||
|     InvalidateWindowsResponse, LabelWithStatus, UpdateSuccessRateWindowConfig, |     InvalidateWindowsResponse, LabelWithStatus, | ||||||
|  |     SuccessRateSpecificityLevel as ProtoSpecificityLevel, UpdateSuccessRateWindowConfig, | ||||||
|     UpdateSuccessRateWindowRequest, UpdateSuccessRateWindowResponse, |     UpdateSuccessRateWindowRequest, UpdateSuccessRateWindowResponse, | ||||||
| }; | }; | ||||||
| #[allow( | #[allow( | ||||||
| @ -51,6 +53,15 @@ pub trait SuccessBasedDynamicRouting: dyn_clone::DynClone + Send + Sync { | |||||||
|         id: String, |         id: String, | ||||||
|         headers: GrpcHeaders, |         headers: GrpcHeaders, | ||||||
|     ) -> DynamicRoutingResult<InvalidateWindowsResponse>; |     ) -> DynamicRoutingResult<InvalidateWindowsResponse>; | ||||||
|  |     /// To calculate both global and merchant specific success rate for the list of chosen connectors | ||||||
|  |     async fn calculate_entity_and_global_success_rate( | ||||||
|  |         &self, | ||||||
|  |         id: String, | ||||||
|  |         success_rate_based_config: SuccessBasedRoutingConfig, | ||||||
|  |         params: String, | ||||||
|  |         label_input: Vec<RoutableConnectorChoice>, | ||||||
|  |         headers: GrpcHeaders, | ||||||
|  |     ) -> DynamicRoutingResult<CalGlobalSuccessRateResponse>; | ||||||
| } | } | ||||||
|  |  | ||||||
| #[async_trait::async_trait] | #[async_trait::async_trait] | ||||||
| @ -113,6 +124,7 @@ impl SuccessBasedDynamicRouting for SuccessRateCalculatorClient<Client> { | |||||||
|             .transpose()?; |             .transpose()?; | ||||||
|  |  | ||||||
|         let labels_with_status = label_input |         let labels_with_status = label_input | ||||||
|  |             .clone() | ||||||
|             .into_iter() |             .into_iter() | ||||||
|             .map(|conn_choice| LabelWithStatus { |             .map(|conn_choice| LabelWithStatus { | ||||||
|                 label: conn_choice.routable_connector_choice.to_string(), |                 label: conn_choice.routable_connector_choice.to_string(), | ||||||
| @ -120,12 +132,21 @@ impl SuccessBasedDynamicRouting for SuccessRateCalculatorClient<Client> { | |||||||
|             }) |             }) | ||||||
|             .collect(); |             .collect(); | ||||||
|  |  | ||||||
|  |         let global_labels_with_status = label_input | ||||||
|  |             .into_iter() | ||||||
|  |             .map(|conn_choice| LabelWithStatus { | ||||||
|  |                 label: conn_choice.routable_connector_choice.connector.to_string(), | ||||||
|  |                 status: conn_choice.status, | ||||||
|  |             }) | ||||||
|  |             .collect(); | ||||||
|  |  | ||||||
|         let request = grpc_client::create_grpc_request( |         let request = grpc_client::create_grpc_request( | ||||||
|             UpdateSuccessRateWindowRequest { |             UpdateSuccessRateWindowRequest { | ||||||
|                 id, |                 id, | ||||||
|                 params, |                 params, | ||||||
|                 labels_with_status, |                 labels_with_status, | ||||||
|                 config, |                 config, | ||||||
|  |                 global_labels_with_status, | ||||||
|             }, |             }, | ||||||
|             headers, |             headers, | ||||||
|         ); |         ); | ||||||
| @ -165,6 +186,55 @@ impl SuccessBasedDynamicRouting for SuccessRateCalculatorClient<Client> { | |||||||
|  |  | ||||||
|         Ok(response) |         Ok(response) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     async fn calculate_entity_and_global_success_rate( | ||||||
|  |         &self, | ||||||
|  |         id: String, | ||||||
|  |         success_rate_based_config: SuccessBasedRoutingConfig, | ||||||
|  |         params: String, | ||||||
|  |         label_input: Vec<RoutableConnectorChoice>, | ||||||
|  |         headers: GrpcHeaders, | ||||||
|  |     ) -> DynamicRoutingResult<CalGlobalSuccessRateResponse> { | ||||||
|  |         let labels = label_input | ||||||
|  |             .clone() | ||||||
|  |             .into_iter() | ||||||
|  |             .map(|conn_choice| conn_choice.to_string()) | ||||||
|  |             .collect::<Vec<_>>(); | ||||||
|  |  | ||||||
|  |         let global_labels = label_input | ||||||
|  |             .into_iter() | ||||||
|  |             .map(|conn_choice| conn_choice.connector.to_string()) | ||||||
|  |             .collect::<Vec<_>>(); | ||||||
|  |  | ||||||
|  |         let config = success_rate_based_config | ||||||
|  |             .config | ||||||
|  |             .map(ForeignTryFrom::foreign_try_from) | ||||||
|  |             .transpose()?; | ||||||
|  |  | ||||||
|  |         let request = grpc_client::create_grpc_request( | ||||||
|  |             CalGlobalSuccessRateRequest { | ||||||
|  |                 entity_id: id, | ||||||
|  |                 entity_params: params, | ||||||
|  |                 entity_labels: labels, | ||||||
|  |                 global_labels, | ||||||
|  |                 config, | ||||||
|  |             }, | ||||||
|  |             headers, | ||||||
|  |         ); | ||||||
|  |  | ||||||
|  |         let response = self | ||||||
|  |             .clone() | ||||||
|  |             .fetch_entity_and_global_success_rate(request) | ||||||
|  |             .await | ||||||
|  |             .change_context(DynamicRoutingError::SuccessRateBasedRoutingFailure( | ||||||
|  |                 "Failed to fetch the entity and global success rate".to_string(), | ||||||
|  |             ))? | ||||||
|  |             .into_inner(); | ||||||
|  |  | ||||||
|  |         logger::info!(dynamic_routing_response=?response); | ||||||
|  |  | ||||||
|  |         Ok(response) | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| impl ForeignTryFrom<CurrentBlockThreshold> for DynamicCurrentThreshold { | impl ForeignTryFrom<CurrentBlockThreshold> for DynamicCurrentThreshold { | ||||||
| @ -216,6 +286,30 @@ impl ForeignTryFrom<SuccessBasedRoutingConfigBody> for CalSuccessRateConfig { | |||||||
|                 .change_context(DynamicRoutingError::MissingRequiredField { |                 .change_context(DynamicRoutingError::MissingRequiredField { | ||||||
|                     field: "default_success_rate".to_string(), |                     field: "default_success_rate".to_string(), | ||||||
|                 })?, |                 })?, | ||||||
|  |             specificity_level: match config.specificity_level { | ||||||
|  |                 SuccessRateSpecificityLevel::Merchant => Some(ProtoSpecificityLevel::Entity.into()), | ||||||
|  |                 SuccessRateSpecificityLevel::Global => Some(ProtoSpecificityLevel::Global.into()), | ||||||
|  |             }, | ||||||
|  |         }) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl ForeignTryFrom<SuccessBasedRoutingConfigBody> for CalGlobalSuccessRateConfig { | ||||||
|  |     type Error = error_stack::Report<DynamicRoutingError>; | ||||||
|  |     fn foreign_try_from(config: SuccessBasedRoutingConfigBody) -> Result<Self, Self::Error> { | ||||||
|  |         Ok(Self { | ||||||
|  |             entity_min_aggregates_size: config | ||||||
|  |                 .min_aggregates_size | ||||||
|  |                 .get_required_value("min_aggregate_size") | ||||||
|  |                 .change_context(DynamicRoutingError::MissingRequiredField { | ||||||
|  |                     field: "min_aggregates_size".to_string(), | ||||||
|  |                 })?, | ||||||
|  |             entity_default_success_rate: config | ||||||
|  |                 .default_success_rate | ||||||
|  |                 .get_required_value("default_success_rate") | ||||||
|  |                 .change_context(DynamicRoutingError::MissingRequiredField { | ||||||
|  |                     field: "default_success_rate".to_string(), | ||||||
|  |                 })?, | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -624,6 +624,7 @@ Never share your secret api keys. Keep them guarded and secure. | |||||||
|         api_models::routing::StraightThroughAlgorithm, |         api_models::routing::StraightThroughAlgorithm, | ||||||
|         api_models::routing::ConnectorVolumeSplit, |         api_models::routing::ConnectorVolumeSplit, | ||||||
|         api_models::routing::ConnectorSelection, |         api_models::routing::ConnectorSelection, | ||||||
|  |         api_models::routing::SuccessRateSpecificityLevel, | ||||||
|         api_models::routing::ToggleDynamicRoutingQuery, |         api_models::routing::ToggleDynamicRoutingQuery, | ||||||
|         api_models::routing::ToggleDynamicRoutingPath, |         api_models::routing::ToggleDynamicRoutingPath, | ||||||
|         api_models::routing::ast::RoutableChoiceKind, |         api_models::routing::ast::RoutableChoiceKind, | ||||||
|  | |||||||
| @ -714,7 +714,7 @@ pub async fn push_metrics_with_update_window_for_success_based_routing( | |||||||
|             ); |             ); | ||||||
|  |  | ||||||
|         let success_based_connectors = client |         let success_based_connectors = client | ||||||
|             .calculate_success_rate( |             .calculate_entity_and_global_success_rate( | ||||||
|                 business_profile.get_id().get_string_repr().into(), |                 business_profile.get_id().get_string_repr().into(), | ||||||
|                 success_based_routing_configs.clone(), |                 success_based_routing_configs.clone(), | ||||||
|                 success_based_routing_config_params.clone(), |                 success_based_routing_config_params.clone(), | ||||||
| @ -730,28 +730,34 @@ pub async fn push_metrics_with_update_window_for_success_based_routing( | |||||||
|         let payment_status_attribute = |         let payment_status_attribute = | ||||||
|             get_desired_payment_status_for_success_routing_metrics(payment_attempt.status); |             get_desired_payment_status_for_success_routing_metrics(payment_attempt.status); | ||||||
|  |  | ||||||
|         let first_success_based_connector_label = &success_based_connectors |         let first_merchant_success_based_connector = &success_based_connectors | ||||||
|             .labels_with_score |             .entity_scores_with_labels | ||||||
|             .first() |             .first() | ||||||
|             .ok_or(errors::ApiErrorResponse::InternalServerError) |             .ok_or(errors::ApiErrorResponse::InternalServerError) | ||||||
|             .attach_printable( |             .attach_printable( | ||||||
|                 "unable to fetch the first connector from list of connectors obtained from dynamic routing service", |                 "unable to fetch the first connector from list of connectors obtained from dynamic routing service", | ||||||
|             )? |             )?; | ||||||
|             .label |  | ||||||
|             .to_string(); |  | ||||||
|  |  | ||||||
|         let (first_success_based_connector, _) = first_success_based_connector_label |         let (first_merchant_success_based_connector_label, _) = first_merchant_success_based_connector.label | ||||||
|             .split_once(':') |             .split_once(':') | ||||||
|             .ok_or(errors::ApiErrorResponse::InternalServerError) |             .ok_or(errors::ApiErrorResponse::InternalServerError) | ||||||
|             .attach_printable(format!( |             .attach_printable(format!( | ||||||
|                 "unable to split connector_name and mca_id from the first connector {:?} obtained from dynamic routing service", |                 "unable to split connector_name and mca_id from the first connector {:?} obtained from dynamic routing service", | ||||||
|                 first_success_based_connector_label |                 first_merchant_success_based_connector.label | ||||||
|             ))?; |             ))?; | ||||||
|  |  | ||||||
|  |         let first_global_success_based_connector = &success_based_connectors | ||||||
|  |             .global_scores_with_labels | ||||||
|  |             .first() | ||||||
|  |             .ok_or(errors::ApiErrorResponse::InternalServerError) | ||||||
|  |             .attach_printable( | ||||||
|  |                 "unable to fetch the first global connector from list of connectors obtained from dynamic routing service", | ||||||
|  |             )?; | ||||||
|  |  | ||||||
|         let outcome = get_success_based_metrics_outcome_for_payment( |         let outcome = get_success_based_metrics_outcome_for_payment( | ||||||
|             payment_status_attribute, |             payment_status_attribute, | ||||||
|             payment_connector.to_string(), |             payment_connector.to_string(), | ||||||
|             first_success_based_connector.to_string(), |             first_merchant_success_based_connector_label.to_string(), | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|         let dynamic_routing_stats = DynamicRoutingStatsNew { |         let dynamic_routing_stats = DynamicRoutingStatsNew { | ||||||
| @ -760,7 +766,8 @@ pub async fn push_metrics_with_update_window_for_success_based_routing( | |||||||
|             merchant_id: payment_attempt.merchant_id.to_owned(), |             merchant_id: payment_attempt.merchant_id.to_owned(), | ||||||
|             profile_id: payment_attempt.profile_id.to_owned(), |             profile_id: payment_attempt.profile_id.to_owned(), | ||||||
|             amount: payment_attempt.get_total_amount(), |             amount: payment_attempt.get_total_amount(), | ||||||
|             success_based_routing_connector: first_success_based_connector.to_string(), |             success_based_routing_connector: first_merchant_success_based_connector_label | ||||||
|  |                 .to_string(), | ||||||
|             payment_connector: payment_connector.to_string(), |             payment_connector: payment_connector.to_string(), | ||||||
|             payment_method_type: payment_attempt.payment_method_type, |             payment_method_type: payment_attempt.payment_method_type, | ||||||
|             currency: payment_attempt.currency, |             currency: payment_attempt.currency, | ||||||
| @ -770,6 +777,9 @@ pub async fn push_metrics_with_update_window_for_success_based_routing( | |||||||
|             payment_status: payment_attempt.status, |             payment_status: payment_attempt.status, | ||||||
|             conclusive_classification: outcome, |             conclusive_classification: outcome, | ||||||
|             created_at: common_utils::date_time::now(), |             created_at: common_utils::date_time::now(), | ||||||
|  |             global_success_based_connector: Some( | ||||||
|  |                 first_global_success_based_connector.label.to_string(), | ||||||
|  |             ), | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
|         core_metrics::DYNAMIC_SUCCESS_BASED_ROUTING.add( |         core_metrics::DYNAMIC_SUCCESS_BASED_ROUTING.add( | ||||||
| @ -788,8 +798,20 @@ pub async fn push_metrics_with_update_window_for_success_based_routing( | |||||||
|                     ), |                     ), | ||||||
|                 ), |                 ), | ||||||
|                 ( |                 ( | ||||||
|                     "success_based_routing_connector", |                     "merchant_specific_success_based_routing_connector", | ||||||
|                     first_success_based_connector.to_string(), |                     first_merchant_success_based_connector_label.to_string(), | ||||||
|  |                 ), | ||||||
|  |                 ( | ||||||
|  |                     "merchant_specific_success_based_routing_connector_score", | ||||||
|  |                     first_merchant_success_based_connector.score.to_string(), | ||||||
|  |                 ), | ||||||
|  |                 ( | ||||||
|  |                     "global_success_based_routing_connector", | ||||||
|  |                     first_global_success_based_connector.label.to_string(), | ||||||
|  |                 ), | ||||||
|  |                 ( | ||||||
|  |                     "global_success_based_routing_connector_score", | ||||||
|  |                     first_global_success_based_connector.score.to_string(), | ||||||
|                 ), |                 ), | ||||||
|                 ("payment_connector", payment_connector.to_string()), |                 ("payment_connector", payment_connector.to_string()), | ||||||
|                 ( |                 ( | ||||||
|  | |||||||
| @ -0,0 +1,3 @@ | |||||||
|  | -- This file should undo anything in `up.sql` | ||||||
|  | ALTER TABLE dynamic_routing_stats | ||||||
|  | DROP COLUMN IF EXISTS global_success_based_connector; | ||||||
| @ -0,0 +1,3 @@ | |||||||
|  | -- Your SQL goes here | ||||||
|  | ALTER TABLE dynamic_routing_stats | ||||||
|  | ADD COLUMN IF NOT EXISTS global_success_based_connector VARCHAR(64); | ||||||
| @ -7,6 +7,8 @@ service SuccessRateCalculator { | |||||||
|     rpc UpdateSuccessRateWindow (UpdateSuccessRateWindowRequest) returns (UpdateSuccessRateWindowResponse); |     rpc UpdateSuccessRateWindow (UpdateSuccessRateWindowRequest) returns (UpdateSuccessRateWindowResponse); | ||||||
|  |  | ||||||
|     rpc InvalidateWindows (InvalidateWindowsRequest) returns (InvalidateWindowsResponse); |     rpc InvalidateWindows (InvalidateWindowsRequest) returns (InvalidateWindowsResponse); | ||||||
|  |  | ||||||
|  |     rpc FetchEntityAndGlobalSuccessRate (CalGlobalSuccessRateRequest) returns (CalGlobalSuccessRateResponse); | ||||||
| } | } | ||||||
|  |  | ||||||
| // API-1 types | // API-1 types | ||||||
| @ -20,6 +22,12 @@ message CalSuccessRateRequest { | |||||||
| message CalSuccessRateConfig { | message CalSuccessRateConfig { | ||||||
|     uint32 min_aggregates_size = 1; |     uint32 min_aggregates_size = 1; | ||||||
|     double default_success_rate = 2; |     double default_success_rate = 2; | ||||||
|  |     optional SuccessRateSpecificityLevel specificity_level = 3; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | enum SuccessRateSpecificityLevel { | ||||||
|  |     ENTITY = 0; | ||||||
|  |     GLOBAL = 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| message CalSuccessRateResponse { | message CalSuccessRateResponse { | ||||||
| @ -37,6 +45,7 @@ message UpdateSuccessRateWindowRequest { | |||||||
|     string params = 2; |     string params = 2; | ||||||
|     repeated LabelWithStatus labels_with_status = 3; |     repeated LabelWithStatus labels_with_status = 3; | ||||||
|     UpdateSuccessRateWindowConfig config = 4; |     UpdateSuccessRateWindowConfig config = 4; | ||||||
|  |     repeated LabelWithStatus global_labels_with_status = 5; | ||||||
| } | } | ||||||
|  |  | ||||||
| message LabelWithStatus { | message LabelWithStatus { | ||||||
| @ -74,3 +83,22 @@ message InvalidateWindowsResponse { | |||||||
|    } |    } | ||||||
|    InvalidationStatus status = 1; |    InvalidationStatus status = 1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // API-4 types | ||||||
|  | message CalGlobalSuccessRateRequest { | ||||||
|  |     string entity_id = 1; | ||||||
|  |     string entity_params = 2; | ||||||
|  |     repeated string entity_labels = 3; | ||||||
|  |     repeated string global_labels = 4; | ||||||
|  |     CalGlobalSuccessRateConfig config = 5; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | message CalGlobalSuccessRateConfig { | ||||||
|  |     uint32 entity_min_aggregates_size = 1; | ||||||
|  |     double entity_default_success_rate = 2; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | message CalGlobalSuccessRateResponse { | ||||||
|  |     repeated LabelWithScore entity_scores_with_labels = 1; | ||||||
|  |     repeated LabelWithScore global_scores_with_labels = 2; | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 Sarthak Soni
					Sarthak Soni