diff --git a/Cargo.lock b/Cargo.lock index beed2565..215c6d51 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5666,6 +5666,7 @@ dependencies = [ "bytes", "http 1.2.0", "opentelemetry", + "reqwest 0.12.7", ] [[package]] @@ -5682,6 +5683,7 @@ dependencies = [ "opentelemetry-proto", "opentelemetry_sdk", "prost", + "reqwest 0.12.7", "serde_json", "thiserror 1.0.62", "tokio", @@ -6575,6 +6577,7 @@ dependencies = [ "async-compression", "base64 0.22.1", "bytes", + "futures-channel", "futures-core", "futures-util", "h2 0.4.7", diff --git a/Cargo.toml b/Cargo.toml index 2e6f56d3..8112a166 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -195,7 +195,7 @@ yoke = { version = "0.7.4", features = ["derive"] } opentelemetry = "0.27.0" opentelemetry-http = "0.27.0" -opentelemetry-otlp = { version = "0.27.0", features = ["logs", "trace", "http-proto", "http-json"] } +opentelemetry-otlp = { version = "0.27.0", features = ["logs", "trace", "http-proto", "http-json", "reqwest-client"] } opentelemetry-semantic-conventions = { version = "0.27.0", features = ["semconv_experimental"] } opentelemetry_sdk = { version = "0.27.0", features = ["rt-tokio"] } diff --git a/crates/base/src/runtime/mod.rs b/crates/base/src/runtime/mod.rs index f0d496c5..135d9ea3 100644 --- a/crates/base/src/runtime/mod.rs +++ b/crates/base/src/runtime/mod.rs @@ -1320,7 +1320,6 @@ where op_state_ref .try_borrow::() .map(otel::WorkerSpanAttrs::from_event_metadata) - .unwrap_or_default() }; let inspector = self.inspector(); @@ -1383,7 +1382,8 @@ where &maybe_cpu_usage_metrics_tx, &mut accumulated_cpu_time_ns, || { - let _span = otel::start_span("v8.mod_evaluate", &otel_attrs); + let _span = + otel::start_span("v8.mod_evaluate", otel_attrs.as_ref()); locker.js_runtime.mod_evaluate(main_module_id) }, )) @@ -1465,7 +1465,7 @@ where &mut accumulated_cpu_time_ns, || { let _span = - otel::start_span("v8.dispatch_load_event", &otel_attrs); + otel::start_span("v8.dispatch_load_event", otel_attrs.as_ref()); MaybeDenoRuntime::DenoRuntime(*locker).dispatch_load_event() }, ) { @@ -1501,7 +1501,8 @@ where &maybe_cpu_usage_metrics_tx, &mut accumulated_cpu_time_ns, || { - let _span = otel::start_span("v8.dispatch_unload_event", &otel_attrs); + let _span = + otel::start_span("v8.dispatch_unload_event", otel_attrs.as_ref()); MaybeDenoRuntime::DenoRuntime(&mut locker).dispatch_unload_event() }, ) { @@ -1526,15 +1527,12 @@ where let has_inspector = self.inspector().is_some(); let is_user_worker = self.conf.is_user_worker(); let global_waker = self.waker.clone(); - - // Collect worker identity for OTLP spans. let otel_attrs = { let op_state = self.js_runtime.op_state(); let op_state_ref = op_state.borrow(); op_state_ref .try_borrow::() .map(otel::WorkerSpanAttrs::from_event_metadata) - .unwrap_or_default() }; let mut termination_request_fut = self @@ -1604,7 +1602,8 @@ where Cow::Borrowed(waker) }; - let _poll_span = otel::start_span("v8.poll_event_loop", &otel_attrs); + let _poll_span = + otel::start_span("v8.poll_event_loop", otel_attrs.as_ref()); js_runtime.poll_event_loop( &mut std::task::Context::from_waker(waker.as_ref()), PollEventLoopOptions { diff --git a/crates/base/src/runtime/otel.rs b/crates/base/src/runtime/otel.rs index 2adf9623..32fc7124 100644 --- a/crates/base/src/runtime/otel.rs +++ b/crates/base/src/runtime/otel.rs @@ -42,7 +42,7 @@ pub fn init_if_needed() { } /// Worker identity and custom otel attributes collected once at `run()` entry. -#[derive(Clone, Default)] +#[derive(Clone)] pub struct WorkerSpanAttrs(Vec); impl WorkerSpanAttrs { @@ -65,12 +65,13 @@ impl WorkerSpanAttrs { } } -/// Start a named span with worker attributes. Returns `None` if OTLP is not -/// configured. +/// Start a named span with worker attributes. +/// Returns `None` if OTLP is not configured or `attrs` is `None`. pub fn start_span( name: &'static str, - attrs: &WorkerSpanAttrs, + attrs: Option<&WorkerSpanAttrs>, ) -> Option { + let attrs = attrs?; let provider = PROVIDER.get()?.as_ref()?; let tracer = provider.tracer("edge-runtime"); let mut span = tracer