mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-01 11:06:50 +08:00
feat(router): add metrics for webhooks (#1266)
Co-authored-by: Prajjwal Kumar <prajjwal.kumar@juspay.in>
This commit is contained in:
@ -1,3 +1,4 @@
|
|||||||
|
pub use router_env::opentelemetry::KeyValue;
|
||||||
use router_env::{counter_metric, global_meter, metrics_context};
|
use router_env::{counter_metric, global_meter, metrics_context};
|
||||||
|
|
||||||
metrics_context!(CONTEXT);
|
metrics_context!(CONTEXT);
|
||||||
@ -31,3 +32,10 @@ counter_metric!(
|
|||||||
ATTACH_EVIDENCE_DISPUTE_STATUS_VALIDATION_FAILURE_METRIC,
|
ATTACH_EVIDENCE_DISPUTE_STATUS_VALIDATION_FAILURE_METRIC,
|
||||||
GLOBAL_METER
|
GLOBAL_METER
|
||||||
);
|
);
|
||||||
|
|
||||||
|
counter_metric!(WEBHOOK_INCOMING_COUNT, GLOBAL_METER);
|
||||||
|
counter_metric!(WEBHOOK_INCOMING_FILTERED_COUNT, GLOBAL_METER);
|
||||||
|
counter_metric!(WEBHOOK_SOURCE_VERIFIED_COUNT, GLOBAL_METER);
|
||||||
|
counter_metric!(WEBHOOK_OUTGOING_COUNT, GLOBAL_METER);
|
||||||
|
counter_metric!(WEBHOOK_OUTGOING_RECEIVED_COUNT, GLOBAL_METER);
|
||||||
|
counter_metric!(WEBHOOK_OUTGOING_NOT_RECEIVED_COUNT, GLOBAL_METER);
|
||||||
|
|||||||
@ -26,6 +26,7 @@ use crate::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
const OUTGOING_WEBHOOK_TIMEOUT_SECS: u64 = 5;
|
const OUTGOING_WEBHOOK_TIMEOUT_SECS: u64 = 5;
|
||||||
|
const MERCHANT_ID: &str = "merchant_id";
|
||||||
|
|
||||||
#[instrument(skip_all)]
|
#[instrument(skip_all)]
|
||||||
pub async fn payments_incoming_webhook_flow<W: api::OutgoingWebhookType>(
|
pub async fn payments_incoming_webhook_flow<W: api::OutgoingWebhookType>(
|
||||||
@ -594,6 +595,14 @@ pub async fn trigger_webhook_to_merchant<W: api::OutgoingWebhookType>(
|
|||||||
let response =
|
let response =
|
||||||
services::api::send_request(state, request, Some(OUTGOING_WEBHOOK_TIMEOUT_SECS)).await;
|
services::api::send_request(state, request, Some(OUTGOING_WEBHOOK_TIMEOUT_SECS)).await;
|
||||||
|
|
||||||
|
metrics::WEBHOOK_OUTGOING_COUNT.add(
|
||||||
|
&metrics::CONTEXT,
|
||||||
|
1,
|
||||||
|
&[metrics::KeyValue::new(
|
||||||
|
MERCHANT_ID,
|
||||||
|
merchant_account.merchant_id.clone(),
|
||||||
|
)],
|
||||||
|
);
|
||||||
logger::debug!(outgoing_webhook_response=?response);
|
logger::debug!(outgoing_webhook_response=?response);
|
||||||
|
|
||||||
match response {
|
match response {
|
||||||
@ -603,6 +612,14 @@ pub async fn trigger_webhook_to_merchant<W: api::OutgoingWebhookType>(
|
|||||||
}
|
}
|
||||||
Ok(res) => {
|
Ok(res) => {
|
||||||
if res.status().is_success() {
|
if res.status().is_success() {
|
||||||
|
metrics::WEBHOOK_OUTGOING_RECEIVED_COUNT.add(
|
||||||
|
&metrics::CONTEXT,
|
||||||
|
1,
|
||||||
|
&[metrics::KeyValue::new(
|
||||||
|
MERCHANT_ID,
|
||||||
|
merchant_account.merchant_id.clone(),
|
||||||
|
)],
|
||||||
|
);
|
||||||
let update_event = storage::EventUpdate::UpdateWebhookNotified {
|
let update_event = storage::EventUpdate::UpdateWebhookNotified {
|
||||||
is_webhook_notified: Some(true),
|
is_webhook_notified: Some(true),
|
||||||
};
|
};
|
||||||
@ -612,6 +629,14 @@ pub async fn trigger_webhook_to_merchant<W: api::OutgoingWebhookType>(
|
|||||||
.await
|
.await
|
||||||
.change_context(errors::WebhooksFlowError::WebhookEventUpdationFailed)?;
|
.change_context(errors::WebhooksFlowError::WebhookEventUpdationFailed)?;
|
||||||
} else {
|
} else {
|
||||||
|
metrics::WEBHOOK_OUTGOING_NOT_RECEIVED_COUNT.add(
|
||||||
|
&metrics::CONTEXT,
|
||||||
|
1,
|
||||||
|
&[metrics::KeyValue::new(
|
||||||
|
MERCHANT_ID,
|
||||||
|
merchant_account.merchant_id.clone(),
|
||||||
|
)],
|
||||||
|
);
|
||||||
// [#217]: Schedule webhook for retry.
|
// [#217]: Schedule webhook for retry.
|
||||||
Err(errors::WebhooksFlowError::NotReceivedByMerchant).into_report()?;
|
Err(errors::WebhooksFlowError::NotReceivedByMerchant).into_report()?;
|
||||||
}
|
}
|
||||||
@ -630,6 +655,15 @@ pub async fn webhooks_core<W: api::OutgoingWebhookType>(
|
|||||||
connector_name: &str,
|
connector_name: &str,
|
||||||
body: actix_web::web::Bytes,
|
body: actix_web::web::Bytes,
|
||||||
) -> RouterResponse<serde_json::Value> {
|
) -> RouterResponse<serde_json::Value> {
|
||||||
|
metrics::WEBHOOK_INCOMING_COUNT.add(
|
||||||
|
&metrics::CONTEXT,
|
||||||
|
1,
|
||||||
|
&[metrics::KeyValue::new(
|
||||||
|
MERCHANT_ID,
|
||||||
|
merchant_account.merchant_id.clone(),
|
||||||
|
)],
|
||||||
|
);
|
||||||
|
|
||||||
let connector = api::ConnectorData::get_connector_by_name(
|
let connector = api::ConnectorData::get_connector_by_name(
|
||||||
&state.conf.connectors,
|
&state.conf.connectors,
|
||||||
connector_name,
|
connector_name,
|
||||||
@ -687,6 +721,18 @@ pub async fn webhooks_core<W: api::OutgoingWebhookType>(
|
|||||||
.await
|
.await
|
||||||
.switch()
|
.switch()
|
||||||
.attach_printable("There was an issue in incoming webhook source verification")?;
|
.attach_printable("There was an issue in incoming webhook source verification")?;
|
||||||
|
|
||||||
|
if source_verified {
|
||||||
|
metrics::WEBHOOK_SOURCE_VERIFIED_COUNT.add(
|
||||||
|
&metrics::CONTEXT,
|
||||||
|
1,
|
||||||
|
&[metrics::KeyValue::new(
|
||||||
|
MERCHANT_ID,
|
||||||
|
merchant_account.merchant_id.clone(),
|
||||||
|
)],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
logger::info!(source_verified=?source_verified);
|
logger::info!(source_verified=?source_verified);
|
||||||
let object_ref_id = connector
|
let object_ref_id = connector
|
||||||
.get_webhook_object_reference_id(&request_details)
|
.get_webhook_object_reference_id(&request_details)
|
||||||
@ -758,6 +804,15 @@ pub async fn webhooks_core<W: api::OutgoingWebhookType>(
|
|||||||
.into_report()
|
.into_report()
|
||||||
.attach_printable("Unsupported Flow Type received in incoming webhooks")?,
|
.attach_printable("Unsupported Flow Type received in incoming webhooks")?,
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
metrics::WEBHOOK_INCOMING_FILTERED_COUNT.add(
|
||||||
|
&metrics::CONTEXT,
|
||||||
|
1,
|
||||||
|
&[metrics::KeyValue::new(
|
||||||
|
MERCHANT_ID,
|
||||||
|
merchant_account.merchant_id.clone(),
|
||||||
|
)],
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let response = connector
|
let response = connector
|
||||||
|
|||||||
Reference in New Issue
Block a user