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