-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathpropagation.rs
68 lines (59 loc) · 2.43 KB
/
propagation.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use opentelemetry::propagation::TextMapCompositePropagator;
use opentelemetry_sdk::propagation::{BaggagePropagator, TraceContextPropagator};
pub mod extension {
pub use opentelemetry::baggage::BaggageExt as _;
pub use tracing_opentelemetry::OpenTelemetrySpanExt as _;
}
/// Currently axum and reqwest have different http crate versions.
/// axum is ver 1, reqwest ver 0.2, therefore, we use each type in inject and extract.
pub mod http {
use super::extension::*;
use opentelemetry::propagation::Extractor;
use opentelemetry_http::HeaderInjector;
/// Inject current opentelemetry context into given headers
pub fn inject(cx: &opentelemetry::Context, headers: &mut reqwest::header::HeaderMap) {
opentelemetry::global::get_text_map_propagator(|propagator| {
propagator.inject_context(cx, &mut HeaderInjector(headers));
});
}
pub fn inject_with_baggage<T, I>(
cx: &opentelemetry::Context,
headers: &mut reqwest::header::HeaderMap,
baggage: T,
) where
T: IntoIterator<Item = I>,
I: Into<opentelemetry::baggage::KeyValueMetadata>,
{
inject(&cx.with_baggage(baggage), headers);
}
pub fn extract(headers: &axum::http::HeaderMap) -> opentelemetry::Context {
opentelemetry::global::get_text_map_propagator(|propagator| {
propagator.extract(&HeaderExtractor(headers))
})
}
/// `opentelemetry_http` implement `HeaderExtractor` against http 0.2
/// so, imple manually
struct HeaderExtractor<'a>(pub &'a axum::http::HeaderMap);
impl<'a> Extractor for HeaderExtractor<'a> {
/// Get a value for a key from the `HeaderMap`. If the value is not valid ASCII, returns None.
fn get(&self, key: &str) -> Option<&str> {
self.0.get(key).and_then(|value| value.to_str().ok())
}
/// Collect all the keys from the `HeaderMap`.
fn keys(&self) -> Vec<&str> {
self.0
.keys()
.map(axum::http::HeaderName::as_str)
.collect::<Vec<_>>()
}
}
}
pub fn init_propagation() {
let trace_propagator = TraceContextPropagator::new();
let baggage_propagator = BaggagePropagator::new();
let composite_propagator = TextMapCompositePropagator::new(vec![
Box::new(trace_propagator),
Box::new(baggage_propagator),
]);
opentelemetry::global::set_text_map_propagator(composite_propagator);
}