mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-29 00:49:42 +08:00
feat(analytics): add issuer as filter for authentication analytics (#7535)
This commit is contained in:
@ -169,6 +169,7 @@ pub async fn get_filters(
|
||||
AuthEventDimensions::ErrorMessage => fil.error_message,
|
||||
AuthEventDimensions::AuthenticationConnector => fil.authentication_connector.map(|i| i.as_ref().to_string()),
|
||||
AuthEventDimensions::MessageVersion => fil.message_version,
|
||||
AuthEventDimensions::AcsReferenceNumber => fil.acs_reference_number,
|
||||
})
|
||||
.collect::<Vec<String>>();
|
||||
res.query_data.push(AuthEventFilterValue {
|
||||
|
||||
@ -59,4 +59,5 @@ pub struct AuthEventFilterRow {
|
||||
pub error_message: Option<String>,
|
||||
pub authentication_connector: Option<DBEnumWrapper<AuthenticationConnectors>>,
|
||||
pub message_version: Option<String>,
|
||||
pub acs_reference_number: Option<String>,
|
||||
}
|
||||
|
||||
@ -45,6 +45,7 @@ pub struct AuthEventMetricRow {
|
||||
pub error_message: Option<String>,
|
||||
pub authentication_connector: Option<DBEnumWrapper<storage_enums::AuthenticationConnectors>>,
|
||||
pub message_version: Option<String>,
|
||||
pub acs_reference_number: Option<String>,
|
||||
#[serde(with = "common_utils::custom_serde::iso8601::option")]
|
||||
pub start_bucket: Option<PrimitiveDateTime>,
|
||||
#[serde(with = "common_utils::custom_serde::iso8601::option")]
|
||||
|
||||
@ -110,6 +110,7 @@ where
|
||||
i.error_message.clone(),
|
||||
i.authentication_connector.as_ref().map(|i| i.0),
|
||||
i.message_version.clone(),
|
||||
i.acs_reference_number.clone(),
|
||||
TimeRange {
|
||||
start_time: match (granularity, i.start_bucket) {
|
||||
(Some(g), Some(st)) => g.clip_to_start(st)?,
|
||||
|
||||
@ -100,6 +100,7 @@ where
|
||||
i.error_message.clone(),
|
||||
i.authentication_connector.as_ref().map(|i| i.0),
|
||||
i.message_version.clone(),
|
||||
i.acs_reference_number.clone(),
|
||||
TimeRange {
|
||||
start_time: match (granularity, i.start_bucket) {
|
||||
(Some(g), Some(st)) => g.clip_to_start(st)?,
|
||||
|
||||
@ -119,6 +119,7 @@ where
|
||||
i.error_message.clone(),
|
||||
i.authentication_connector.as_ref().map(|i| i.0),
|
||||
i.message_version.clone(),
|
||||
i.acs_reference_number.clone(),
|
||||
TimeRange {
|
||||
start_time: match (granularity, i.start_bucket) {
|
||||
(Some(g), Some(st)) => g.clip_to_start(st)?,
|
||||
|
||||
@ -111,6 +111,7 @@ where
|
||||
i.error_message.clone(),
|
||||
i.authentication_connector.as_ref().map(|i| i.0),
|
||||
i.message_version.clone(),
|
||||
i.acs_reference_number.clone(),
|
||||
TimeRange {
|
||||
start_time: match (granularity, i.start_bucket) {
|
||||
(Some(g), Some(st)) => g.clip_to_start(st)?,
|
||||
|
||||
@ -105,6 +105,7 @@ where
|
||||
i.error_message.clone(),
|
||||
i.authentication_connector.as_ref().map(|i| i.0),
|
||||
i.message_version.clone(),
|
||||
i.acs_reference_number.clone(),
|
||||
TimeRange {
|
||||
start_time: match (granularity, i.start_bucket) {
|
||||
(Some(g), Some(st)) => g.clip_to_start(st)?,
|
||||
|
||||
@ -115,6 +115,7 @@ where
|
||||
i.error_message.clone(),
|
||||
i.authentication_connector.as_ref().map(|i| i.0),
|
||||
i.message_version.clone(),
|
||||
i.acs_reference_number.clone(),
|
||||
TimeRange {
|
||||
start_time: match (granularity, i.start_bucket) {
|
||||
(Some(g), Some(st)) => g.clip_to_start(st)?,
|
||||
|
||||
@ -107,6 +107,7 @@ where
|
||||
i.error_message.clone(),
|
||||
i.authentication_connector.as_ref().map(|i| i.0),
|
||||
i.message_version.clone(),
|
||||
i.acs_reference_number.clone(),
|
||||
TimeRange {
|
||||
start_time: match (granularity, i.start_bucket) {
|
||||
(Some(g), Some(st)) => g.clip_to_start(st)?,
|
||||
|
||||
@ -112,6 +112,7 @@ where
|
||||
i.error_message.clone(),
|
||||
i.authentication_connector.as_ref().map(|i| i.0),
|
||||
i.message_version.clone(),
|
||||
i.acs_reference_number.clone(),
|
||||
TimeRange {
|
||||
start_time: match (granularity, i.start_bucket) {
|
||||
(Some(g), Some(st)) => g.clip_to_start(st)?,
|
||||
|
||||
@ -108,6 +108,7 @@ where
|
||||
i.error_message.clone(),
|
||||
i.authentication_connector.as_ref().map(|i| i.0),
|
||||
i.message_version.clone(),
|
||||
i.acs_reference_number.clone(),
|
||||
TimeRange {
|
||||
start_time: match (granularity, i.start_bucket) {
|
||||
(Some(g), Some(st)) => g.clip_to_start(st)?,
|
||||
|
||||
@ -112,6 +112,7 @@ where
|
||||
i.error_message.clone(),
|
||||
i.authentication_connector.as_ref().map(|i| i.0),
|
||||
i.message_version.clone(),
|
||||
i.acs_reference_number.clone(),
|
||||
TimeRange {
|
||||
start_time: match (granularity, i.start_bucket) {
|
||||
(Some(g), Some(st)) => g.clip_to_start(st)?,
|
||||
|
||||
@ -53,6 +53,15 @@ where
|
||||
)
|
||||
.attach_printable("Error adding message version filter")?;
|
||||
}
|
||||
|
||||
if !self.acs_reference_number.is_empty() {
|
||||
builder
|
||||
.add_filter_in_range_clause(
|
||||
AuthEventDimensions::AcsReferenceNumber,
|
||||
&self.acs_reference_number,
|
||||
)
|
||||
.attach_printable("Error adding acs reference number filter")?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
@ -231,6 +231,11 @@ impl<'a> FromRow<'a, PgRow> for super::auth_events::metrics::AuthEventMetricRow
|
||||
ColumnNotFound(_) => Ok(Default::default()),
|
||||
e => Err(e),
|
||||
})?;
|
||||
let acs_reference_number: Option<String> =
|
||||
row.try_get("acs_reference_number").or_else(|e| match e {
|
||||
ColumnNotFound(_) => Ok(Default::default()),
|
||||
e => Err(e),
|
||||
})?;
|
||||
let count: Option<i64> = row.try_get("count").or_else(|e| match e {
|
||||
ColumnNotFound(_) => Ok(Default::default()),
|
||||
e => Err(e),
|
||||
@ -249,6 +254,7 @@ impl<'a> FromRow<'a, PgRow> for super::auth_events::metrics::AuthEventMetricRow
|
||||
error_message,
|
||||
authentication_connector,
|
||||
message_version,
|
||||
acs_reference_number,
|
||||
count,
|
||||
start_bucket,
|
||||
end_bucket,
|
||||
@ -288,6 +294,11 @@ impl<'a> FromRow<'a, PgRow> for super::auth_events::filters::AuthEventFilterRow
|
||||
ColumnNotFound(_) => Ok(Default::default()),
|
||||
e => Err(e),
|
||||
})?;
|
||||
let acs_reference_number: Option<String> =
|
||||
row.try_get("acs_reference_number").or_else(|e| match e {
|
||||
ColumnNotFound(_) => Ok(Default::default()),
|
||||
e => Err(e),
|
||||
})?;
|
||||
Ok(Self {
|
||||
authentication_status,
|
||||
trans_status,
|
||||
@ -295,6 +306,7 @@ impl<'a> FromRow<'a, PgRow> for super::auth_events::filters::AuthEventFilterRow
|
||||
error_message,
|
||||
authentication_connector,
|
||||
message_version,
|
||||
acs_reference_number,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@ -51,6 +51,7 @@ pub fn get_auth_event_dimensions() -> Vec<NameDescription> {
|
||||
vec![
|
||||
AuthEventDimensions::AuthenticationConnector,
|
||||
AuthEventDimensions::MessageVersion,
|
||||
AuthEventDimensions::AcsReferenceNumber,
|
||||
]
|
||||
.into_iter()
|
||||
.map(Into::into)
|
||||
|
||||
@ -23,6 +23,8 @@ pub struct AuthEventFilters {
|
||||
pub authentication_connector: Vec<AuthenticationConnectors>,
|
||||
#[serde(default)]
|
||||
pub message_version: Vec<String>,
|
||||
#[serde(default)]
|
||||
pub acs_reference_number: Vec<String>,
|
||||
}
|
||||
|
||||
#[derive(
|
||||
@ -50,6 +52,7 @@ pub enum AuthEventDimensions {
|
||||
ErrorMessage,
|
||||
AuthenticationConnector,
|
||||
MessageVersion,
|
||||
AcsReferenceNumber,
|
||||
}
|
||||
|
||||
#[derive(
|
||||
@ -135,6 +138,7 @@ pub struct AuthEventMetricsBucketIdentifier {
|
||||
pub error_message: Option<String>,
|
||||
pub authentication_connector: Option<AuthenticationConnectors>,
|
||||
pub message_version: Option<String>,
|
||||
pub acs_reference_number: Option<String>,
|
||||
#[serde(rename = "time_range")]
|
||||
pub time_bucket: TimeRange,
|
||||
#[serde(rename = "time_bucket")]
|
||||
@ -151,6 +155,7 @@ impl AuthEventMetricsBucketIdentifier {
|
||||
error_message: Option<String>,
|
||||
authentication_connector: Option<AuthenticationConnectors>,
|
||||
message_version: Option<String>,
|
||||
acs_reference_number: Option<String>,
|
||||
normalized_time_range: TimeRange,
|
||||
) -> Self {
|
||||
Self {
|
||||
@ -160,6 +165,7 @@ impl AuthEventMetricsBucketIdentifier {
|
||||
error_message,
|
||||
authentication_connector,
|
||||
message_version,
|
||||
acs_reference_number,
|
||||
time_bucket: normalized_time_range,
|
||||
start_time: normalized_time_range.start_time,
|
||||
}
|
||||
@ -173,6 +179,7 @@ impl Hash for AuthEventMetricsBucketIdentifier {
|
||||
self.authentication_type.hash(state);
|
||||
self.authentication_connector.hash(state);
|
||||
self.message_version.hash(state);
|
||||
self.acs_reference_number.hash(state);
|
||||
self.error_message.hash(state);
|
||||
self.time_bucket.hash(state);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user