mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-01 11:06:50 +08:00
feat(dynamic_routing): analytics improvement using separate postgres table (#6723)
Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
@ -12,6 +12,8 @@ use api_models::routing as routing_types;
|
||||
use common_utils::ext_traits::ValueExt;
|
||||
use common_utils::{ext_traits::Encode, id_type, types::keymanager::KeyManagerState};
|
||||
use diesel_models::configs;
|
||||
#[cfg(all(feature = "v1", feature = "dynamic_routing"))]
|
||||
use diesel_models::dynamic_routing_stats::DynamicRoutingStatsNew;
|
||||
#[cfg(feature = "v1")]
|
||||
use diesel_models::routing_algorithm;
|
||||
use error_stack::ResultExt;
|
||||
@ -751,6 +753,23 @@ pub async fn push_metrics_with_update_window_for_success_based_routing(
|
||||
first_success_based_connector.to_string(),
|
||||
);
|
||||
|
||||
let dynamic_routing_stats = DynamicRoutingStatsNew {
|
||||
payment_id: payment_attempt.payment_id.to_owned(),
|
||||
attempt_id: payment_attempt.attempt_id.clone(),
|
||||
merchant_id: payment_attempt.merchant_id.to_owned(),
|
||||
profile_id: payment_attempt.profile_id.to_owned(),
|
||||
amount: payment_attempt.get_total_amount(),
|
||||
success_based_routing_connector: first_success_based_connector.to_string(),
|
||||
payment_connector: payment_connector.to_string(),
|
||||
currency: payment_attempt.currency,
|
||||
payment_method: payment_attempt.payment_method,
|
||||
capture_method: payment_attempt.capture_method,
|
||||
authentication_type: payment_attempt.authentication_type,
|
||||
payment_status: payment_attempt.status,
|
||||
conclusive_classification: outcome,
|
||||
created_at: common_utils::date_time::now(),
|
||||
};
|
||||
|
||||
core_metrics::DYNAMIC_SUCCESS_BASED_ROUTING.add(
|
||||
&metrics::CONTEXT,
|
||||
1,
|
||||
@ -812,6 +831,13 @@ pub async fn push_metrics_with_update_window_for_success_based_routing(
|
||||
);
|
||||
logger::debug!("successfully pushed success_based_routing metrics");
|
||||
|
||||
state
|
||||
.store
|
||||
.insert_dynamic_routing_stat_entry(dynamic_routing_stats)
|
||||
.await
|
||||
.change_context(errors::ApiErrorResponse::InternalServerError)
|
||||
.attach_printable("Unable to push dynamic routing stats to db")?;
|
||||
|
||||
client
|
||||
.update_success_rate(
|
||||
tenant_business_profile_id,
|
||||
|
||||
@ -12,6 +12,7 @@ pub mod configs;
|
||||
pub mod customers;
|
||||
pub mod dashboard_metadata;
|
||||
pub mod dispute;
|
||||
pub mod dynamic_routing_stats;
|
||||
pub mod ephemeral_key;
|
||||
pub mod events;
|
||||
pub mod file;
|
||||
@ -107,6 +108,7 @@ pub trait StorageInterface:
|
||||
+ payment_method::PaymentMethodInterface
|
||||
+ blocklist::BlocklistInterface
|
||||
+ blocklist_fingerprint::BlocklistFingerprintInterface
|
||||
+ dynamic_routing_stats::DynamicRoutingStatsInterface
|
||||
+ scheduler::SchedulerInterface
|
||||
+ PayoutAttemptInterface
|
||||
+ PayoutsInterface
|
||||
|
||||
58
crates/router/src/db/dynamic_routing_stats.rs
Normal file
58
crates/router/src/db/dynamic_routing_stats.rs
Normal file
@ -0,0 +1,58 @@
|
||||
use error_stack::report;
|
||||
use router_env::{instrument, tracing};
|
||||
use storage_impl::MockDb;
|
||||
|
||||
use super::Store;
|
||||
use crate::{
|
||||
connection,
|
||||
core::errors::{self, CustomResult},
|
||||
db::kafka_store::KafkaStore,
|
||||
types::storage,
|
||||
};
|
||||
|
||||
#[async_trait::async_trait]
|
||||
pub trait DynamicRoutingStatsInterface {
|
||||
async fn insert_dynamic_routing_stat_entry(
|
||||
&self,
|
||||
dynamic_routing_stat_new: storage::DynamicRoutingStatsNew,
|
||||
) -> CustomResult<storage::DynamicRoutingStats, errors::StorageError>;
|
||||
}
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl DynamicRoutingStatsInterface for Store {
|
||||
#[instrument(skip_all)]
|
||||
async fn insert_dynamic_routing_stat_entry(
|
||||
&self,
|
||||
dynamic_routing_stat: storage::DynamicRoutingStatsNew,
|
||||
) -> CustomResult<storage::DynamicRoutingStats, errors::StorageError> {
|
||||
let conn = connection::pg_connection_write(self).await?;
|
||||
dynamic_routing_stat
|
||||
.insert(&conn)
|
||||
.await
|
||||
.map_err(|error| report!(errors::StorageError::from(error)))
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl DynamicRoutingStatsInterface for MockDb {
|
||||
#[instrument(skip_all)]
|
||||
async fn insert_dynamic_routing_stat_entry(
|
||||
&self,
|
||||
_dynamic_routing_stat: storage::DynamicRoutingStatsNew,
|
||||
) -> CustomResult<storage::DynamicRoutingStats, errors::StorageError> {
|
||||
Err(errors::StorageError::MockDbError)?
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl DynamicRoutingStatsInterface for KafkaStore {
|
||||
#[instrument(skip_all)]
|
||||
async fn insert_dynamic_routing_stat_entry(
|
||||
&self,
|
||||
dynamic_routing_stat: storage::DynamicRoutingStatsNew,
|
||||
) -> CustomResult<storage::DynamicRoutingStats, errors::StorageError> {
|
||||
self.diesel_store
|
||||
.insert_dynamic_routing_stat_entry(dynamic_routing_stat)
|
||||
.await
|
||||
}
|
||||
}
|
||||
@ -12,6 +12,7 @@ pub mod configs;
|
||||
pub mod customers;
|
||||
pub mod dashboard_metadata;
|
||||
pub mod dispute;
|
||||
pub mod dynamic_routing_stats;
|
||||
pub mod enums;
|
||||
pub mod ephemeral_key;
|
||||
pub mod events;
|
||||
@ -63,12 +64,12 @@ pub use scheduler::db::process_tracker;
|
||||
pub use self::{
|
||||
address::*, api_keys::*, authentication::*, authorization::*, blocklist::*,
|
||||
blocklist_fingerprint::*, blocklist_lookup::*, business_profile::*, capture::*, cards_info::*,
|
||||
configs::*, customers::*, dashboard_metadata::*, dispute::*, ephemeral_key::*, events::*,
|
||||
file::*, fraud_check::*, generic_link::*, gsm::*, locker_mock_up::*, mandate::*,
|
||||
merchant_account::*, merchant_connector_account::*, merchant_key_store::*, payment_link::*,
|
||||
payment_method::*, process_tracker::*, refund::*, reverse_lookup::*, role::*,
|
||||
routing_algorithm::*, unified_translations::*, user::*, user_authentication_method::*,
|
||||
user_role::*,
|
||||
configs::*, customers::*, dashboard_metadata::*, dispute::*, dynamic_routing_stats::*,
|
||||
ephemeral_key::*, events::*, file::*, fraud_check::*, generic_link::*, gsm::*,
|
||||
locker_mock_up::*, mandate::*, merchant_account::*, merchant_connector_account::*,
|
||||
merchant_key_store::*, payment_link::*, payment_method::*, process_tracker::*, refund::*,
|
||||
reverse_lookup::*, role::*, routing_algorithm::*, unified_translations::*, user::*,
|
||||
user_authentication_method::*, user_role::*,
|
||||
};
|
||||
use crate::types::api::routing;
|
||||
|
||||
|
||||
1
crates/router/src/types/storage/dynamic_routing_stats.rs
Normal file
1
crates/router/src/types/storage/dynamic_routing_stats.rs
Normal file
@ -0,0 +1 @@
|
||||
pub use diesel_models::dynamic_routing_stats::{DynamicRoutingStats, DynamicRoutingStatsNew};
|
||||
Reference in New Issue
Block a user