diff --git a/common/gateway-requests/src/types/text_request/authenticate.rs b/common/gateway-requests/src/types/text_request/authenticate.rs index 6c4c884957..5e755d2400 100644 --- a/common/gateway-requests/src/types/text_request/authenticate.rs +++ b/common/gateway-requests/src/types/text_request/authenticate.rs @@ -16,6 +16,9 @@ pub struct AuthenticateRequest { pub content: AuthenticateRequestContent, pub request_signature: ed25519::Signature, + + #[serde(default)] + pub debug_trace_id: Option, } impl AuthenticateRequest { @@ -23,6 +26,7 @@ impl AuthenticateRequest { protocol_version: u8, shared_key: &SharedGatewayKey, identity_keys: &ed25519::KeyPair, + debug_trace_id: Option, ) -> Result { let content = AuthenticateRequestContent::new( protocol_version, @@ -35,6 +39,7 @@ impl AuthenticateRequest { Ok(AuthenticateRequest { content, request_signature, + debug_trace_id, }) } diff --git a/common/gateway-requests/src/types/text_request/mod.rs b/common/gateway-requests/src/types/text_request/mod.rs index ff6709c38d..031bbdea40 100644 --- a/common/gateway-requests/src/types/text_request/mod.rs +++ b/common/gateway-requests/src/types/text_request/mod.rs @@ -14,7 +14,9 @@ use nym_sphinx::DestinationAddressBytes; use nym_statistics_common::types::SessionType; use opentelemetry::trace::TraceContextExt; use serde::{Deserialize, Serialize}; +use std::panic; use std::str::FromStr; +use tracing::{instrument, warn}; use tungstenite::Message; pub mod authenticate; @@ -77,7 +79,6 @@ pub enum ClientControlRequest { address: String, enc_address: String, iv: String, - /// this is a trace id that is used in testing and performance verification /// in mainnet, this will always be set to None #[serde(default)] @@ -134,9 +135,12 @@ impl ClientControlRequest { let ciphertext = shared_key.encrypt_naive(address.as_bytes_ref(), Some(&nonce))?; let otel_context = opentelemetry::Context::current(); + warn!("OTEL CONTEXT: {:?}", otel_context); let span = otel_context.span(); let context = span.span_context(); let trace_id = context.trace_id(); + warn!("TRACE_ID: {:?}", trace_id); + panic!(); Ok(ClientControlRequest::Authenticate { protocol_version, @@ -147,6 +151,7 @@ impl ClientControlRequest { }) } + #[instrument] pub fn new_authenticate_v2( shared_key: &SharedGatewayKey, identity_keys: &ed25519::KeyPair, @@ -154,8 +159,21 @@ impl ClientControlRequest { // if we're using v2 authentication, we must announce at least that protocol version let protocol_version = AUTHENTICATE_V2_PROTOCOL_VERSION; + let otel_context = opentelemetry::Context::current(); + warn!("OTEL CONTEXT: {:?}", otel_context); + let span = otel_context.span(); + let context = span.span_context(); + let trace_id = context.trace_id(); + warn!("TRACE_ID: {:?}", trace_id); + // panic!(); + Ok(ClientControlRequest::AuthenticateV2(Box::new( - AuthenticateRequest::new(protocol_version, shared_key, identity_keys)?, + AuthenticateRequest::new( + protocol_version, + shared_key, + identity_keys, + Some(trace_id.to_string()), + )?, ))) } diff --git a/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs b/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs index c0f41ee29b..069d4f0894 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/fresh.rs @@ -889,40 +889,41 @@ impl FreshHandler { │ // All child spans inherit trace_id "abc123..." │ └───────────────────────────────────────────────────────┘ */ - let span = if let ClientControlRequest::Authenticate { - debug_trace_id: Some(ref trace_id), - .. - } = request - { - warn!("RAW TRACE ID: {trace_id:?}"); - let trace_id = opentelemetry::trace::TraceId::from_hex(&trace_id) - .expect("Invalid trace ID format"); - warn!("🫂TraceID: {trace_id}🫂"); + let span = if let ClientControlRequest::AuthenticateV2(ref auth_req) = request { + if let Some(ref trace_id) = auth_req.debug_trace_id { + warn!("RAW TRACE ID: {trace_id:?}"); + let trace_id = opentelemetry::trace::TraceId::from_hex(&trace_id) + .expect("Invalid trace ID format"); + warn!("🫂TraceID: {trace_id}🫂"); - // We don't need to try and preserve the SpanID, just the TraceID (right?) so - // just making a new SpanID for the moment - let id_generator = RandomIdGenerator::default(); - let span_id = id_generator.new_span_id(); + // We don't need to try and preserve the SpanID, just the TraceID (right?) so + // just making a new SpanID for the moment + let id_generator = RandomIdGenerator::default(); + let span_id = id_generator.new_span_id(); - let span_context = opentelemetry::trace::SpanContext::new( - trace_id, - span_id, - opentelemetry::trace::TraceFlags::SAMPLED, - true, // is_remote = true since this comes from another service - Default::default(), - ); + let span_context = opentelemetry::trace::SpanContext::new( + trace_id, + span_id, + opentelemetry::trace::TraceFlags::SAMPLED, + true, // is_remote = true since this comes from another service + Default::default(), + ); - use opentelemetry::trace::TraceContextExt; - let remote_context = - opentelemetry::Context::current().with_remote_span_context(span_context); + use opentelemetry::trace::TraceContextExt; + let remote_context = + opentelemetry::Context::current().with_remote_span_context(span_context); - // Create span with remote context as parent - use tracing_opentelemetry::OpenTelemetrySpanExt; - let span = info_span!("authenticate_v1"); - span.set_parent(remote_context); - Some(span) + // Create span with remote context as parent + use tracing_opentelemetry::OpenTelemetrySpanExt; + let span = info_span!("authenticate_v2"); + span.set_parent(remote_context); + Some(span) + } else { + warn!("AuthenticateV2 request but no trace_id provided"); + None + } } else { - warn!("COULDN'T FIND TRACE_ID"); + warn!("Not an AuthenticateV2 request"); None }; diff --git a/sdk/rust/nym-sdk/examples/surb_reply.rs b/sdk/rust/nym-sdk/examples/surb_reply.rs index 6cd5038574..2656804c83 100644 --- a/sdk/rust/nym-sdk/examples/surb_reply.rs +++ b/sdk/rust/nym-sdk/examples/surb_reply.rs @@ -3,21 +3,26 @@ use nym_sdk::mixnet::{ AnonymousSenderTag, MixnetClientBuilder, MixnetMessageSender, ReconstructedMessage, StoragePaths, }; -use std::path::PathBuf; -use tempfile::TempDir; - +use opentelemetry::trace::TraceContextExt; +use opentelemetry::trace::Tracer; use opentelemetry::trace::TracerProvider; +use opentelemetry::Context; use opentelemetry::{global, KeyValue}; use opentelemetry_otlp::tonic_types::metadata::MetadataMap; use opentelemetry_otlp::tonic_types::transport::ClientTlsConfig; use opentelemetry_otlp::{WithExportConfig, WithTonicConfig}; use opentelemetry_sdk::metrics::{MeterProviderBuilder, PeriodicReader, SdkMeterProvider}; +use opentelemetry_sdk::trace::IdGenerator; use opentelemetry_sdk::trace::{RandomIdGenerator, SdkTracerProvider}; use opentelemetry_sdk::{trace::Sampler, Resource}; use opentelemetry_semantic_conventions::{ attribute::{DEPLOYMENT_ENVIRONMENT_NAME, SERVICE_VERSION}, SCHEMA_URL, }; +use std::path::PathBuf; +use tempfile::TempDir; +use tracing::instrument; +use tracing::{info, warn}; use tracing_core::Level; use tracing_opentelemetry::{MetricsLayer, OpenTelemetryLayer}; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; @@ -64,6 +69,10 @@ fn init_tracer_provider(metadata: MetadataMap) -> anyhow::Result anyhow::Result<()> { // nym_bin_common::logging::setup_tracing_logger(); @@ -149,6 +159,21 @@ async fn main() -> anyhow::Result<()> { metadata.insert("signoz-ingestion-key", key.parse()?); let _guard = init_tracing_subscriber(metadata); + let tracer = global::tracer("sdk-example-surb-reply"); + let span = tracer.start("test_span"); + let cx = Context::current_with_span(span); + let _guard = cx.clone().attach(); + + let trace_id = cx.span().span_context().trace_id(); + warn!("Main TRACE_ID (should be valid): {:?}", trace_id); + + let otel_context = opentelemetry::Context::current(); + warn!("OTEL CONTEXT: {:?}", otel_context); + let span = otel_context.span(); + let context = span.span_context(); + let trace_id = context.trace_id(); + warn!("TRACE_ID: {:?}", trace_id); + // panic!(); // Specify some config options // let config_dir: PathBuf = TempDir::new().unwrap().path().to_path_buf();