impl(o11y-tracing): add opentelemetry dependencies and HeaderInjector#4980
impl(o11y-tracing): add opentelemetry dependencies and HeaderInjector#4980westarle merged 7 commits intogoogleapis:mainfrom
Conversation
5649b5d to
df4f4cd
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #4980 +/- ##
=======================================
Coverage 92.80% 92.81%
=======================================
Files 224 225 +1
Lines 8656 8665 +9
=======================================
+ Hits 8033 8042 +9
Misses 623 623 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
230a7cc to
060718e
Compare
ecf1086 to
378d2dd
Compare
378d2dd to
4153ca6
Compare
|
|
||
| impl<'a> opentelemetry::propagation::Injector for HeaderInjector<'a> { | ||
| fn set(&mut self, key: &str, value: String) { | ||
| if let Ok(name) = http::header::HeaderName::from_bytes(key.as_bytes()) { |
There was a problem hiding this comment.
Move to the module as use http::header::HeaderName.
|
|
||
| impl<'a> opentelemetry::propagation::Injector for HeaderInjector<'a> { | ||
| fn set(&mut self, key: &str, value: String) { | ||
| if let Ok(name) = http::header::HeaderName::from_bytes(key.as_bytes()) { |
There was a problem hiding this comment.
| // If the tracing span doesn't have a valid trace ID (e.g., the user isn't | ||
| // using the tracing_opentelemetry subscriber bridge), fall back to the global | ||
| // OTel context (for pure opentelemetry_sdk users). | ||
| use opentelemetry::trace::TraceContextExt; |
| // OTel context (for pure opentelemetry_sdk users). | ||
| use opentelemetry::trace::TraceContextExt; | ||
| if !context.span().span_context().is_valid() { | ||
| context = opentelemetry::Context::current(); |
There was a problem hiding this comment.
add a use declaration at the module level.
| let propagator = opentelemetry_sdk::propagation::TraceContextPropagator::new(); | ||
| use opentelemetry::propagation::TextMapPropagator; |
There was a problem hiding this comment.
After several refactors I convinced myself that use declarations work better in practice that fully qualified names. And the Google Style Guide recommends them too (if that convinces you).
| // 4. Verify the traceparent header was successfully injected | ||
| assert!( | ||
| headers.contains_key("traceparent"), | ||
| "Headers: {:?}", | ||
| headers | ||
| ); | ||
| let traceparent = headers.get("traceparent").unwrap().to_str().unwrap(); | ||
| assert!(traceparent.starts_with("00-")); |
There was a problem hiding this comment.
see below, these assertions can be simplified with matches!()
| #[test] | ||
| fn test_inject_context_success() { | ||
| // 1. Setup tracing with OpenTelemetry layer | ||
| let tracer_provider = opentelemetry_sdk::trace::SdkTracerProvider::builder().build(); | ||
| use opentelemetry::trace::TracerProvider as _; | ||
| let tracer = tracer_provider.tracer("test"); | ||
|
|
||
| use tracing_subscriber::layer::SubscriberExt; | ||
| let telemetry = tracing_opentelemetry::layer().with_tracer(tracer); | ||
| let subscriber = tracing_subscriber::registry().with(telemetry); | ||
| let dispatcher = tracing::Dispatch::new(subscriber); |
There was a problem hiding this comment.
You can save yourself explanations with a helper function:
| #[test] | |
| fn test_inject_context_success() { | |
| // 1. Setup tracing with OpenTelemetry layer | |
| let tracer_provider = opentelemetry_sdk::trace::SdkTracerProvider::builder().build(); | |
| use opentelemetry::trace::TracerProvider as _; | |
| let tracer = tracer_provider.tracer("test"); | |
| use tracing_subscriber::layer::SubscriberExt; | |
| let telemetry = tracing_opentelemetry::layer().with_tracer(tracer); | |
| let subscriber = tracing_subscriber::registry().with(telemetry); | |
| let dispatcher = tracing::Dispatch::new(subscriber); | |
| fn set_up_otel_and_tracing() -> Dispatch { | |
| let tracer_provider = opentelemetry_sdk::trace::SdkTracerProvider::builder().build(); | |
| use opentelemetry::trace::TracerProvider as _; | |
| let tracer = tracer_provider.tracer("test"); | |
| use tracing_subscriber::layer::SubscriberExt; | |
| let telemetry = tracing_opentelemetry::layer().with_tracer(tracer); | |
| let subscriber = tracing_subscriber::registry().with(telemetry); | |
| tracing::Dispatch::new(subscriber) | |
| } | |
| #[test] | |
| fn inject_context_success() { | |
| let dispatch = set_up_otel_and_tracing(); |
There was a problem hiding this comment.
done, this is much better.
| use opentelemetry::propagation::Injector; | ||
|
|
||
| #[test] | ||
| fn test_injector_valid_headers() { |
There was a problem hiding this comment.
The test_ prefix is not idiomatic in Rust.
|
|
||
| impl<'a> opentelemetry::propagation::Injector for HeaderInjector<'a> { | ||
| fn set(&mut self, key: &str, value: String) { | ||
| if let Ok(name) = http::header::HeaderName::from_bytes(key.as_bytes()) { |
There was a problem hiding this comment.
I think you can write:
| if let Ok(name) = http::header::HeaderName::from_bytes(key.as_bytes()) { | |
| if let (Ok(key), Ok(value)) = (HeaderName::from_str(key), HeaderValue::from_str(&value)) { |
There was a problem hiding this comment.
Done, looks much better this way!
| // Invalid characters in header key | ||
| injector.set("invalid key\n", "value".to_string()); | ||
|
|
||
| assert!(headers.is_empty()); |
There was a problem hiding this comment.
| assert!(headers.is_empty()); | |
| assert!(headers.is_empty(), "{headers:?}"); |
In general, assert!(expr); is typically too little context to debug things.
No description provided.