Skip to content
Clone
9301161
48 lines 1.3 KB Rust
use std::collections::HashMap;
use opentelemetry::Context;
use opentelemetry::global;
use opentelemetry::propagation::{Extractor, Injector};
use tracing::Span;
use tracing_opentelemetry::OpenTelemetrySpanExt;
#[derive(Default)]
struct Carrier(HashMap<String, String>);
impl Injector for Carrier {
fn set(&mut self, key: &str, value: String) {
self.0.insert(key.to_string(), value);
}
}
impl Extractor for Carrier {
fn get(&self, key: &str) -> Option<&str> {
self.0.get(key).map(String::as_str)
}
fn keys(&self) -> Vec<&str> {
self.0.keys().map(String::as_str).collect()
}
}
pub fn capture() -> Option<String> {
let mut carrier = Carrier::default();
global::get_text_map_propagator(|propagator| {
propagator.inject_context(&Span::current().context(), &mut carrier);
});
carrier.0.get("traceparent").cloned()
}
pub fn adopt(span: &Span, traceparent: Option<&str>) {
let Some(traceparent) = traceparent else {
return;
};
let mut carrier = Carrier::default();
carrier
.0
.insert("traceparent".to_string(), traceparent.to_string());
let parent = global::get_text_map_propagator(|propagator| {
propagator.extract_with_context(&Context::new(), &carrier)
});
let _ = span.set_parent(parent);
}