Skip to main content

aether_telemetry/
trace_context.rs

1use opentelemetry::propagation::Extractor;
2use schemars::JsonSchema;
3use serde::{Deserialize, Serialize};
4
5#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
6#[serde(deny_unknown_fields)]
7pub struct AgentTraceContext {
8    /// W3C traceparent header: version, trace ID, parent span ID, and trace flags.
9    pub traceparent: String,
10    /// Optional W3C tracestate header carrying vendor-specific trace state.
11    #[serde(default, skip_serializing_if = "Option::is_none")]
12    pub tracestate: Option<String>,
13}
14
15impl Extractor for AgentTraceContext {
16    fn get(&self, key: &str) -> Option<&str> {
17        match key {
18            "traceparent" => Some(&self.traceparent),
19            "tracestate" => self.tracestate.as_deref(),
20            _ => None,
21        }
22    }
23
24    fn keys(&self) -> Vec<&str> {
25        let mut keys = vec!["traceparent"];
26        if self.tracestate.is_some() {
27            keys.push("tracestate");
28        }
29        keys
30    }
31}