diff --git a/Cargo.lock b/Cargo.lock index 94d137885d..d9999a69ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2767,7 +2767,7 @@ dependencies = [ [[package]] name = "opentelemetry" version = "0.18.0" -source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" +source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" dependencies = [ "opentelemetry_api", "opentelemetry_sdk", @@ -2776,7 +2776,7 @@ dependencies = [ [[package]] name = "opentelemetry-otlp" version = "0.11.0" -source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" +source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" dependencies = [ "async-trait", "futures", @@ -2793,7 +2793,7 @@ dependencies = [ [[package]] name = "opentelemetry-proto" version = "0.1.0" -source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" +source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" dependencies = [ "futures", "futures-util", @@ -2805,7 +2805,7 @@ dependencies = [ [[package]] name = "opentelemetry_api" version = "0.18.0" -source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" +source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" dependencies = [ "fnv", "futures-channel", @@ -2820,7 +2820,7 @@ dependencies = [ [[package]] name = "opentelemetry_sdk" version = "0.18.0" -source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" +source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" dependencies = [ "async-trait", "crossbeam-channel", diff --git a/crates/api_models/src/payments.rs b/crates/api_models/src/payments.rs index db2c7bd66a..f820c3bfa4 100644 --- a/crates/api_models/src/payments.rs +++ b/crates/api_models/src/payments.rs @@ -728,6 +728,23 @@ pub enum PaymentIdType { PaymentAttemptId(String), } +impl std::fmt::Display for PaymentIdType { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::PaymentIntentId(payment_id) => { + write!(f, "payment_intent_id = \"{payment_id}\"") + } + Self::ConnectorTransactionId(connector_transaction_id) => write!( + f, + "connector_transaction_id = \"{connector_transaction_id}\"" + ), + Self::PaymentAttemptId(payment_attempt_id) => { + write!(f, "payment_attempt_id = \"{payment_attempt_id}\"") + } + } + } +} + impl Default for PaymentIdType { fn default() -> Self { Self::PaymentIntentId(Default::default()) diff --git a/crates/router/src/core/payments.rs b/crates/router/src/core/payments.rs index 4bfb173de0..9cf54c5316 100644 --- a/crates/router/src/core/payments.rs +++ b/crates/router/src/core/payments.rs @@ -9,7 +9,7 @@ use std::{fmt::Debug, marker::PhantomData, time::Instant}; use api_models::payments::Metadata; use error_stack::{IntoReport, ResultExt}; use futures::future::join_all; -use router_env::tracing; +use router_env::{instrument, tracing}; use time; pub use self::operations::{ @@ -38,6 +38,7 @@ use crate::{ utils::{Encode, OptionExt, ValueExt}, }; +#[instrument(skip_all, fields(payment_id, merchant_id))] pub async fn payments_operation_core( state: &AppState, merchant_account: storage::MerchantAccount, @@ -63,11 +64,13 @@ where { let operation: BoxedOperation<'_, F, Req> = Box::new(operation); + tracing::Span::current().record("merchant_id", merchant_account.merchant_id.as_str()); + let (operation, validate_result) = operation .to_validate_request()? .validate_request(&req, &merchant_account)?; - tracing::Span::current().record("payment_id", &format!("{:?}", validate_result.payment_id)); + tracing::Span::current().record("payment_id", &format!("{}", validate_result.payment_id)); let (operation, mut payment_data, customer_details) = operation .to_get_tracker()? diff --git a/crates/router_env/Cargo.toml b/crates/router_env/Cargo.toml index e91993c3e7..a7bca49ea5 100644 --- a/crates/router_env/Cargo.toml +++ b/crates/router_env/Cargo.toml @@ -40,3 +40,4 @@ default = ["actix_web"] actix_web = ["tracing-actix-web"] log_custom_entries_to_extra = [] log_extra_implicit_fields = [] +log_active_span_json = [] diff --git a/crates/router_env/src/logger/formatter.rs b/crates/router_env/src/logger/formatter.rs index 97351c8a89..a015f0e48e 100644 --- a/crates/router_env/src/logger/formatter.rs +++ b/crates/router_env/src/logger/formatter.rs @@ -13,7 +13,7 @@ use serde::ser::{SerializeMap, Serializer}; use serde_json::Value; // use time::format_description::well_known::Rfc3339; use time::format_description::well_known::Iso8601; -use tracing::{Event, Id, Metadata, Subscriber}; +use tracing::{Event, Metadata, Subscriber}; use tracing_subscriber::{ fmt::MakeWriter, layer::Context, @@ -282,6 +282,7 @@ where } /// Serialize entries of span. + #[cfg(feature = "log_active_span_json")] fn span_serialize( &self, span: &SpanRef<'_, S>, @@ -407,14 +408,16 @@ where } } - fn on_enter(&self, id: &Id, ctx: Context<'_, S>) { + #[cfg(feature = "log_active_span_json")] + fn on_enter(&self, id: &tracing::Id, ctx: Context<'_, S>) { let span = ctx.span(id).expect("No span"); if let Ok(serialized) = self.span_serialize(&span, RecordType::EnterSpan) { let _ = self.flush(serialized); } } - fn on_close(&self, id: Id, ctx: Context<'_, S>) { + #[cfg(feature = "log_active_span_json")] + fn on_close(&self, id: tracing::Id, ctx: Context<'_, S>) { let span = ctx.span(&id).expect("No span"); if let Ok(serialized) = self.span_serialize(&span, RecordType::ExitSpan) { let _ = self.flush(serialized);