tdm_server_rust/telemetry/skywalking/
sw_propagation.rs1use ::skywalking::trace::{
4 propagation::{
5 context::PropagationContext, decoder::decode_propagation, encoder::encode_propagation,
6 },
7 trace_context::TracingContext,
8};
9use axum::http::{HeaderMap, HeaderName, HeaderValue};
10use std::str::FromStr;
11
12pub const SW8_HEADER: &str = "sw8";
14
15pub fn extract_sw8(headers: &HeaderMap) -> Option<PropagationContext> {
17 let raw = headers.get(SW8_HEADER)?.to_str().ok()?;
18 decode_propagation(raw).ok()
19}
20
21pub fn inject_sw8(headers: &mut HeaderMap, ctx: &TracingContext, endpoint: &str, address: &str) {
23 let value = encode_propagation(ctx, endpoint, address);
24 if let Ok(name) = HeaderName::from_str(SW8_HEADER) {
25 if let Ok(val) = HeaderValue::from_str(&value) {
26 headers.insert(name, val);
27 }
28 }
29}
30
31pub fn inject_traceparent(headers: &mut HeaderMap, trace_id: &str) {
33 let padded = if trace_id.len() >= 32 {
34 &trace_id[..32]
35 } else {
36 return;
37 };
38 let tp = format!("00-{padded}-0000000000000001-01");
39 if let Ok(name) = HeaderName::from_str("traceparent") {
40 if let Ok(val) = HeaderValue::from_str(&tp) {
41 headers.insert(name, val);
42 }
43 }
44}
45
46pub fn extract_traceparent(_headers: &HeaderMap) -> Option<PropagationContext> {
48 None
49}
50
51pub fn extract_inbound(headers: &HeaderMap) -> Option<PropagationContext> {
53 extract_sw8(headers).or_else(|| extract_traceparent(headers))
54}
55
56pub fn encode_sw8_value(ctx: &TracingContext, endpoint: &str, address: &str) -> String {
58 encode_propagation(ctx, endpoint, address)
59}
60
61pub fn inject_traceparent_reqwest(headers: &mut reqwest::header::HeaderMap, trace_id: &str) {
63 let padded = if trace_id.len() >= 32 {
64 &trace_id[..32]
65 } else {
66 return;
67 };
68 let tp = format!("00-{padded}-0000000000000001-01");
69 if let Ok(name) = reqwest::header::HeaderName::from_bytes(b"traceparent") {
70 if let Ok(val) = reqwest::header::HeaderValue::from_str(&tp) {
71 headers.insert(name, val);
72 }
73 }
74}