tdm_server_rust/telemetry/
propagation.rs1use axum::http::{HeaderMap, HeaderName, HeaderValue, Request};
4use opentelemetry::{
5 global,
6 propagation::{Extractor, Injector},
7 Context,
8};
9use opentelemetry_sdk::propagation::TraceContextPropagator;
10use std::str::FromStr;
11
12struct HeaderExtractor<'a> {
14 headers: &'a HeaderMap,
16}
17
18impl Extractor for HeaderExtractor<'_> {
19 fn get(&self, key: &str) -> Option<&str> {
20 self.headers.get(key).and_then(|v| v.to_str().ok())
21 }
22
23 fn keys(&self) -> Vec<&str> {
24 self.headers.keys().map(|k| k.as_str()).collect()
25 }
26}
27
28struct HeaderInjector<'a> {
30 headers: &'a mut HeaderMap,
32}
33
34impl Injector for HeaderInjector<'_> {
35 fn set(&mut self, key: &str, value: String) {
36 if let (Ok(name), Ok(val)) = (HeaderName::from_str(key), HeaderValue::from_str(&value)) {
37 self.headers.insert(name, val);
38 }
39 }
40}
41
42pub fn extract_parent(headers: &HeaderMap) -> Context {
44 global::get_text_map_propagator(|prop| prop.extract(&HeaderExtractor { headers }))
45}
46
47pub fn inject_response_headers(headers: &mut HeaderMap) {
49 global::get_text_map_propagator(|prop| {
50 prop.inject_context(
51 &opentelemetry::Context::current(),
52 &mut HeaderInjector { headers },
53 );
54 });
55}
56
57pub fn inject_reqwest(headers: &mut reqwest::header::HeaderMap) {
59 struct ReqwestInjector<'a>(&'a mut reqwest::header::HeaderMap);
60
61 impl Injector for ReqwestInjector<'_> {
62 fn set(&mut self, key: &str, value: String) {
63 if let (Ok(name), Ok(val)) = (
64 reqwest::header::HeaderName::from_str(key),
65 reqwest::header::HeaderValue::from_str(&value),
66 ) {
67 self.0.insert(name, val);
68 }
69 }
70 }
71
72 global::get_text_map_propagator(|prop| {
73 prop.inject_context(
74 &opentelemetry::Context::current(),
75 &mut ReqwestInjector(headers),
76 );
77 });
78}
79
80pub fn install_propagator() {
82 global::set_text_map_propagator(TraceContextPropagator::new());
83}
84
85pub fn extract_from_request<B>(req: &Request<B>) -> Context {
87 extract_parent(req.headers())
88}