diff --git a/crates/containerd-shim-wasm/src/sandbox/shim/otel.rs b/crates/containerd-shim-wasm/src/sandbox/shim/otel.rs index 7676bd386..9c79b7b8c 100644 --- a/crates/containerd-shim-wasm/src/sandbox/shim/otel.rs +++ b/crates/containerd-shim-wasm/src/sandbox/shim/otel.rs @@ -35,10 +35,11 @@ pub use opentelemetry_otlp::{ }; use opentelemetry_sdk::propagation::TraceContextPropagator; use opentelemetry_sdk::{runtime, trace as sdktrace}; -use tracing::Span; -use tracing_opentelemetry::OpenTelemetrySpanExt as _; +use tracing::span::{Attributes, Id}; +use tracing::{Span, Subscriber}; +use tracing_opentelemetry::{OpenTelemetrySpanExt as _, OtelData}; use tracing_subscriber::layer::SubscriberExt as _; -use tracing_subscriber::{EnvFilter, Registry}; +use tracing_subscriber::{EnvFilter, Layer, Registry}; const OTEL_EXPORTER_OTLP_PROTOCOL_HTTP_JSON: &str = "http/json"; const OTEL_EXPORTER_OTLP_PROTOCOL_HTTP_PROTOBUF: &str = "http/protobuf"; @@ -91,7 +92,10 @@ impl Config { let filter = EnvFilter::try_new("info,h2=off")?; - let subscriber = Registry::default().with(telemetry).with(filter); + let subscriber = Registry::default() + .with(telemetry) + .with(filter) + .with(SpanNamingLayer); tracing::subscriber::set_global_default(subscriber)?; Ok(ShutdownGuard) @@ -179,6 +183,31 @@ fn traces_protocol_from_env() -> anyhow::Result { Ok(protocol) } +/// A layer that renames spans to include the target in the span name. +struct SpanNamingLayer; + +impl Layer for SpanNamingLayer +where + S: Subscriber + for<'a> tracing_subscriber::registry::LookupSpan<'a>, +{ + fn on_new_span( + &self, + attrs: &Attributes<'_>, + id: &Id, + ctx: tracing_subscriber::layer::Context<'_, S>, + ) { + let span = ctx.span(id).expect("Span not found"); + let mut extensions = span.extensions_mut(); + + if let Some(otel_data) = extensions.get_mut::() { + let target = attrs.metadata().target(); + let original_name = attrs.metadata().name(); + let new_name = format!("{}::{}", target, original_name); + otel_data.builder.name = new_name.into(); + } + } +} + #[cfg(test)] mod tests { use temp_env::with_vars; diff --git a/scripts/verify-jaeger-traces.sh b/scripts/verify-jaeger-traces.sh index 25d0030fe..ac9792d2d 100755 --- a/scripts/verify-jaeger-traces.sh +++ b/scripts/verify-jaeger-traces.sh @@ -4,7 +4,17 @@ set -euo pipefail TRACE_DATA=$(curl -s "http://localhost:16686/api/traces?service=containerd&limit=0" \ | jq '[ .data[].spans[].operationName ]') -REQUIRED_OPS=("task_create" "task_wait" "task_start" "task_delete" "task_state" "wait" "shutdown" "shim_main_inner") +PREFIX="containerd_shim_wasm::sandbox" +REQUIRED_OPS=( + "${PREFIX}::shim::local::task_create" + "${PREFIX}::shim::local::task_wait" + "${PREFIX}::shim::local::task_start" + "${PREFIX}::shim::local::task_delete" + "${PREFIX}::shim::local::task_state" + "${PREFIX}::shim::cli::wait" + "${PREFIX}::shim::local::shutdown" + "${PREFIX}::cli::shim_main_inner" +) for op in "${REQUIRED_OPS[@]}"; do COUNT=$(echo "$TRACE_DATA" | jq --arg op "$op" '[ .[] | select(. == $op) ] | length')