mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-31 01:57:45 +08:00
feat(analytics): refactor and introduce analytics APIs to accommodate OrgLevel, MerchantLevel and ProfileLevel authentication (#5729)
Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com> Co-authored-by: Sampras Lopes <sampras.lopes@juspay.in>
This commit is contained in:
@ -21,6 +21,7 @@ use super::{
|
||||
metrics::ApiEventMetricRow,
|
||||
};
|
||||
use crate::{
|
||||
enums::AuthInfo,
|
||||
errors::{AnalyticsError, AnalyticsResult},
|
||||
metrics,
|
||||
types::FiltersError,
|
||||
@ -51,7 +52,7 @@ pub async fn api_events_core(
|
||||
pub async fn get_filters(
|
||||
pool: &AnalyticsProvider,
|
||||
req: GetApiEventFiltersRequest,
|
||||
merchant_id: &common_utils::id_type::MerchantId,
|
||||
auth: &AuthInfo,
|
||||
) -> AnalyticsResult<ApiEventFiltersResponse> {
|
||||
use api_models::analytics::{api_event::ApiEventDimensions, ApiEventFilterValue};
|
||||
|
||||
@ -68,8 +69,7 @@ pub async fn get_filters(
|
||||
AnalyticsProvider::Clickhouse(ckh_pool)
|
||||
| AnalyticsProvider::CombinedSqlx(_, ckh_pool)
|
||||
| AnalyticsProvider::CombinedCkh(_, ckh_pool) => {
|
||||
get_api_event_filter_for_dimension(dim, merchant_id, &req.time_range, ckh_pool)
|
||||
.await
|
||||
get_api_event_filter_for_dimension(dim, auth, &req.time_range, ckh_pool).await
|
||||
}
|
||||
}
|
||||
.switch()?
|
||||
@ -92,7 +92,7 @@ pub async fn get_filters(
|
||||
#[instrument(skip_all)]
|
||||
pub async fn get_api_event_metrics(
|
||||
pool: &AnalyticsProvider,
|
||||
merchant_id: &common_utils::id_type::MerchantId,
|
||||
auth: &AuthInfo,
|
||||
req: GetApiEventMetricRequest,
|
||||
) -> AnalyticsResult<MetricsResponse<ApiMetricsBucketResponse>> {
|
||||
let mut metrics_accumulator: HashMap<ApiEventMetricsBucketIdentifier, ApiEventMetricRow> =
|
||||
@ -109,14 +109,14 @@ pub async fn get_api_event_metrics(
|
||||
|
||||
// TODO: lifetime issues with joinset,
|
||||
// can be optimized away if joinset lifetime requirements are relaxed
|
||||
let merchant_id_scoped = merchant_id.to_owned();
|
||||
let auth_scoped = auth.to_owned();
|
||||
set.spawn(
|
||||
async move {
|
||||
let data = pool
|
||||
.get_api_event_metrics(
|
||||
&metric_type,
|
||||
&req.group_by_names.clone(),
|
||||
&merchant_id_scoped,
|
||||
&auth_scoped,
|
||||
&req.filters,
|
||||
&req.time_series.map(|t| t.granularity),
|
||||
&req.time_range,
|
||||
|
||||
@ -4,6 +4,7 @@ use error_stack::ResultExt;
|
||||
use time::PrimitiveDateTime;
|
||||
|
||||
use crate::{
|
||||
enums::AuthInfo,
|
||||
query::{Aggregate, GroupByClause, QueryBuilder, QueryFilter, ToSql, Window},
|
||||
types::{AnalyticsCollection, AnalyticsDataSource, FiltersError, FiltersResult, LoadRow},
|
||||
};
|
||||
@ -12,7 +13,7 @@ pub trait ApiEventFilterAnalytics: LoadRow<ApiEventFilter> {}
|
||||
|
||||
pub async fn get_api_event_filter_for_dimension<T>(
|
||||
dimension: ApiEventDimensions,
|
||||
merchant_id: &common_utils::id_type::MerchantId,
|
||||
auth: &AuthInfo,
|
||||
time_range: &TimeRange,
|
||||
pool: &T,
|
||||
) -> FiltersResult<Vec<ApiEventFilter>>
|
||||
@ -32,9 +33,7 @@ where
|
||||
.attach_printable("Error filtering time range")
|
||||
.switch()?;
|
||||
|
||||
query_builder
|
||||
.add_filter_clause("merchant_id", merchant_id)
|
||||
.switch()?;
|
||||
auth.set_filter_clause(&mut query_builder).switch()?;
|
||||
|
||||
query_builder.set_distinct();
|
||||
|
||||
|
||||
@ -7,6 +7,7 @@ use api_models::analytics::{
|
||||
use time::PrimitiveDateTime;
|
||||
|
||||
use crate::{
|
||||
enums::AuthInfo,
|
||||
query::{Aggregate, GroupByClause, ToSql, Window},
|
||||
types::{AnalyticsCollection, AnalyticsDataSource, LoadRow, MetricsResult},
|
||||
};
|
||||
@ -43,7 +44,7 @@ where
|
||||
async fn load_metrics(
|
||||
&self,
|
||||
dimensions: &[ApiEventDimensions],
|
||||
merchant_id: &common_utils::id_type::MerchantId,
|
||||
auth: &AuthInfo,
|
||||
filters: &ApiEventFilters,
|
||||
granularity: &Option<Granularity>,
|
||||
time_range: &TimeRange,
|
||||
@ -64,7 +65,7 @@ where
|
||||
async fn load_metrics(
|
||||
&self,
|
||||
dimensions: &[ApiEventDimensions],
|
||||
merchant_id: &common_utils::id_type::MerchantId,
|
||||
auth: &AuthInfo,
|
||||
filters: &ApiEventFilters,
|
||||
granularity: &Option<Granularity>,
|
||||
time_range: &TimeRange,
|
||||
@ -73,38 +74,17 @@ where
|
||||
match self {
|
||||
Self::Latency => {
|
||||
MaxLatency
|
||||
.load_metrics(
|
||||
dimensions,
|
||||
merchant_id,
|
||||
filters,
|
||||
granularity,
|
||||
time_range,
|
||||
pool,
|
||||
)
|
||||
.load_metrics(dimensions, auth, filters, granularity, time_range, pool)
|
||||
.await
|
||||
}
|
||||
Self::ApiCount => {
|
||||
ApiCount
|
||||
.load_metrics(
|
||||
dimensions,
|
||||
merchant_id,
|
||||
filters,
|
||||
granularity,
|
||||
time_range,
|
||||
pool,
|
||||
)
|
||||
.load_metrics(dimensions, auth, filters, granularity, time_range, pool)
|
||||
.await
|
||||
}
|
||||
Self::StatusCodeCount => {
|
||||
StatusCodeCount
|
||||
.load_metrics(
|
||||
dimensions,
|
||||
merchant_id,
|
||||
filters,
|
||||
granularity,
|
||||
time_range,
|
||||
pool,
|
||||
)
|
||||
.load_metrics(dimensions, auth, filters, granularity, time_range, pool)
|
||||
.await
|
||||
}
|
||||
}
|
||||
|
||||
@ -10,6 +10,7 @@ use time::PrimitiveDateTime;
|
||||
|
||||
use super::ApiEventMetricRow;
|
||||
use crate::{
|
||||
enums::AuthInfo,
|
||||
query::{Aggregate, GroupByClause, QueryBuilder, QueryFilter, SeriesBucket, ToSql, Window},
|
||||
types::{AnalyticsCollection, AnalyticsDataSource, MetricsError, MetricsResult},
|
||||
};
|
||||
@ -30,7 +31,7 @@ where
|
||||
async fn load_metrics(
|
||||
&self,
|
||||
_dimensions: &[ApiEventDimensions],
|
||||
merchant_id: &common_utils::id_type::MerchantId,
|
||||
auth: &AuthInfo,
|
||||
filters: &ApiEventFilters,
|
||||
granularity: &Option<Granularity>,
|
||||
time_range: &TimeRange,
|
||||
@ -69,9 +70,7 @@ where
|
||||
.switch()?;
|
||||
}
|
||||
|
||||
query_builder
|
||||
.add_filter_clause("merchant_id", merchant_id)
|
||||
.switch()?;
|
||||
auth.set_filter_clause(&mut query_builder).switch()?;
|
||||
|
||||
time_range
|
||||
.set_filter_clause(&mut query_builder)
|
||||
|
||||
@ -10,6 +10,7 @@ use time::PrimitiveDateTime;
|
||||
|
||||
use super::ApiEventMetricRow;
|
||||
use crate::{
|
||||
enums::AuthInfo,
|
||||
query::{
|
||||
Aggregate, FilterTypes, GroupByClause, QueryBuilder, QueryFilter, SeriesBucket, ToSql,
|
||||
Window,
|
||||
@ -33,7 +34,7 @@ where
|
||||
async fn load_metrics(
|
||||
&self,
|
||||
_dimensions: &[ApiEventDimensions],
|
||||
merchant_id: &common_utils::id_type::MerchantId,
|
||||
auth: &AuthInfo,
|
||||
filters: &ApiEventFilters,
|
||||
granularity: &Option<Granularity>,
|
||||
time_range: &TimeRange,
|
||||
@ -76,9 +77,7 @@ where
|
||||
|
||||
filters.set_filter_clause(&mut query_builder).switch()?;
|
||||
|
||||
query_builder
|
||||
.add_filter_clause("merchant_id", merchant_id)
|
||||
.switch()?;
|
||||
auth.set_filter_clause(&mut query_builder).switch()?;
|
||||
|
||||
time_range
|
||||
.set_filter_clause(&mut query_builder)
|
||||
|
||||
@ -10,6 +10,7 @@ use time::PrimitiveDateTime;
|
||||
|
||||
use super::ApiEventMetricRow;
|
||||
use crate::{
|
||||
enums::AuthInfo,
|
||||
query::{Aggregate, GroupByClause, QueryBuilder, QueryFilter, SeriesBucket, ToSql, Window},
|
||||
types::{AnalyticsCollection, AnalyticsDataSource, MetricsError, MetricsResult},
|
||||
};
|
||||
@ -30,7 +31,7 @@ where
|
||||
async fn load_metrics(
|
||||
&self,
|
||||
_dimensions: &[ApiEventDimensions],
|
||||
merchant_id: &common_utils::id_type::MerchantId,
|
||||
auth: &AuthInfo,
|
||||
filters: &ApiEventFilters,
|
||||
granularity: &Option<Granularity>,
|
||||
time_range: &TimeRange,
|
||||
@ -47,9 +48,7 @@ where
|
||||
|
||||
filters.set_filter_clause(&mut query_builder).switch()?;
|
||||
|
||||
query_builder
|
||||
.add_filter_clause("merchant_id", merchant_id)
|
||||
.switch()?;
|
||||
auth.set_filter_clause(&mut query_builder).switch()?;
|
||||
|
||||
time_range
|
||||
.set_filter_clause(&mut query_builder)
|
||||
|
||||
Reference in New Issue
Block a user