Skip to main content

tdm_server_rust/telemetry/skywalking/
exit.rs

1//! 出站 HTTP ExitSpan
2
3use super::{context, sw_propagation};
4use ::skywalking::trace::span::Span;
5
6/// 创建 ExitSpan 并注入 sw8(需在请求 SW 上下文内)
7pub fn create_exit_span(operation: &str, url: &str) -> Option<(Span, String)> {
8    let peer = remote_peer(url);
9    let span = context::with_current_mut(|ctx| ctx.create_exit_span(operation, &peer))?;
10    Some((span, peer))
11}
12
13/// 为 reqwest 请求注入 sw8 / traceparent
14pub fn inject_outbound(headers: &mut reqwest::header::HeaderMap, endpoint: &str, peer: &str) {
15    context::with_current(|ctx| {
16        let sw8 = sw_propagation::encode_sw8_value(ctx, endpoint, peer);
17        if let Ok(name) = reqwest::header::HeaderName::from_bytes(b"sw8") {
18            if let Ok(val) = reqwest::header::HeaderValue::from_str(&sw8) {
19                headers.insert(name, val);
20            }
21        }
22        sw_propagation::inject_traceparent_reqwest(headers, ctx.trace_id());
23    });
24}
25
26/// 从 URL 提取 remote_peer(host:port)
27fn remote_peer(url: &str) -> String {
28    reqwest::Url::parse(url)
29        .ok()
30        .and_then(|u| {
31            let host = u.host_str()?.to_string();
32            u.port().map(|p| format!("{host}:{p}")).or(Some(host))
33        })
34        .unwrap_or_else(|| "unknown".into())
35}