From afb2467afc9d383bdd265ffce3ce97ee6396f78b Mon Sep 17 00:00:00 2001 From: Floriane TUERNAL SABOTINOV Date: Thu, 2 Oct 2025 15:54:46 +0200 Subject: [PATCH] otel adaptation for sphinx instrumentation --- Cargo.lock | 1 + common/bin-common/Cargo.toml | 4 +- .../src/opentelemetry/compact_id_generator.rs | 46 +++++++++++++++++++ .../bin-common/src/opentelemetry/context.rs | 4 ++ common/bin-common/src/opentelemetry/mod.rs | 6 ++- 5 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 common/bin-common/src/opentelemetry/compact_id_generator.rs diff --git a/Cargo.lock b/Cargo.lock index 141157ef10..27d463afe6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4964,6 +4964,7 @@ dependencies = [ "opentelemetry-semantic-conventions", "opentelemetry-stdout", "opentelemetry_sdk", + "rand 0.8.5", "schemars 0.8.22", "serde", "serde_json", diff --git a/common/bin-common/Cargo.toml b/common/bin-common/Cargo.toml index 5243aaec77..7da4c7a55c 100644 --- a/common/bin-common/Cargo.toml +++ b/common/bin-common/Cargo.toml @@ -20,6 +20,7 @@ opentelemetry-otlp = { workspace = true,features=["metrics", "grpc-tonic", "tls" opentelemetry-semantic-conventions = { workspace = true, features = ["semconv_experimental"], optional = true } opentelemetry-stdout = { workspace = true, features = ["trace", "metrics"], optional = true } opentelemetry_sdk = { workspace = true, optional = true } +rand = { workspace = true, optional = true } schemars = { workspace = true, features = ["preserve_order"], optional = true } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true, optional = true } @@ -53,12 +54,13 @@ tracing = [ "tracing-tree", ] otel = [ - "tracing", "opentelemetry", "opentelemetry-otlp", "opentelemetry-semantic-conventions", "opentelemetry-stdout", "opentelemetry_sdk", + "rand", + "tracing", ] clap = ["dep:clap", "dep:clap_complete", "dep:clap_complete_fig"] models = [] diff --git a/common/bin-common/src/opentelemetry/compact_id_generator.rs b/common/bin-common/src/opentelemetry/compact_id_generator.rs new file mode 100644 index 0000000000..37f472ec14 --- /dev/null +++ b/common/bin-common/src/opentelemetry/compact_id_generator.rs @@ -0,0 +1,46 @@ +use opentelemetry_sdk::trace::IdGenerator; +use opentelemetry::trace::{TraceId, SpanId}; +use rand::RngCore; + +#[derive(Clone, Debug)] +pub struct Compact13BytesIdGenerator; + +impl IdGenerator for Compact13BytesIdGenerator { + fn new_trace_id(&self) -> TraceId { + let mut rng = rand::thread_rng(); + let mut bytes = [0u8; 16]; + + // Fill the first 13 bytes with random data + rng.fill_bytes(&mut bytes[0..13]); + // Set the last 3 bytes to zero + bytes[13] = 0; + bytes[14] = 0; + bytes[15] = 0; + + TraceId::from_bytes(bytes) + } + + fn new_span_id(&self) -> SpanId { + let mut rng = rand::thread_rng(); + let mut bytes = [0u8; 8]; + rng.fill_bytes(&mut bytes); + + SpanId::from_bytes(bytes) + } +} + +pub fn compress_trace_id(trace_id: &TraceId) -> [u8; 13] { + let bytes = trace_id.to_bytes(); + + let mut compressed = [0u8; 13]; + compressed.copy_from_slice(&bytes[0..13]); + + compressed +} + +pub fn decompress_trace_id(compressed: &[u8; 13]) -> TraceId { + let mut bytes = [0u8; 16]; + bytes[0..13].copy_from_slice(compressed); + + TraceId::from_bytes(bytes) +} \ No newline at end of file diff --git a/common/bin-common/src/opentelemetry/context.rs b/common/bin-common/src/opentelemetry/context.rs index 0938d5e042..88072a3282 100644 --- a/common/bin-common/src/opentelemetry/context.rs +++ b/common/bin-common/src/opentelemetry/context.rs @@ -56,6 +56,10 @@ impl ContextCarrier { }) } + pub fn extract_trace_id_into_bytes(&self) -> Option<[u8; 16]> { + self.extract_trace_id().map(|id| id.to_bytes()) + } + pub fn extract_traceparent(&self) -> Option { self.get("traceparent").map(|s| s.to_string()) } diff --git a/common/bin-common/src/opentelemetry/mod.rs b/common/bin-common/src/opentelemetry/mod.rs index a6e2db58db..de749ffb4c 100644 --- a/common/bin-common/src/opentelemetry/mod.rs +++ b/common/bin-common/src/opentelemetry/mod.rs @@ -1,5 +1,6 @@ pub mod context; pub mod error; +mod compact_id_generator; mod trace_id_format; use tracing::{info, Level}; @@ -10,13 +11,14 @@ use tracing_subscriber::fmt; use crate::logging::{default_tracing_env_filter, default_tracing_fmt_layer}; use crate::opentelemetry::error::TracingError; +use crate::opentelemetry::compact_id_generator::Compact13BytesIdGenerator; use opentelemetry::trace::TracerProvider; 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::{RandomIdGenerator, SdkTracerProvider}; +use opentelemetry_sdk::trace::SdkTracerProvider; use opentelemetry_sdk::{trace::Sampler, Resource}; use opentelemetry_semantic_conventions::resource::{DEPLOYMENT_ENVIRONMENT_NAME, SERVICE_VERSION}; use opentelemetry_semantic_conventions::SCHEMA_URL; @@ -145,7 +147,7 @@ fn init_tracer_provider(metadata: MetadataMap, service_name: String) -> Result