use nodedb_types::TraceId;
pub fn generate_trace_id() -> TraceId {
TraceId::generate()
}
pub fn extract_from_headers(headers: &axum::http::HeaderMap) -> TraceId {
if let Some(val) = headers.get("traceparent")
&& let Ok(s) = val.to_str()
&& let Some((tid, _sid, _flags)) = TraceId::from_traceparent(s)
{
return tid;
}
if let Some(val) = headers.get("x-trace-id")
&& let Ok(s) = val.to_str()
&& let Ok(tid) = s.parse::<TraceId>()
{
return tid;
}
TraceId::generate()
}
pub fn extract_from_pgwire_params(params: &std::collections::HashMap<String, String>) -> TraceId {
if let Some(val) = params.get("trace_id")
&& let Ok(tid) = val.parse::<TraceId>()
{
return tid;
}
TraceId::generate()
}
pub fn make_span(trace_id: TraceId, operation: &str) -> tracing::Span {
tracing::info_span!("op", trace_id = %trace_id, operation)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn generate_unique_ids() {
let id1 = generate_trace_id();
let id2 = generate_trace_id();
assert_ne!(id1, id2);
}
#[test]
fn generate_produces_nonzero_id() {
let id = generate_trace_id();
assert_ne!(id, TraceId::ZERO);
}
#[test]
fn extract_from_traceparent_header() {
let mut headers = axum::http::HeaderMap::new();
headers.insert(
"traceparent",
"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"
.parse()
.unwrap(),
);
let id = extract_from_headers(&headers);
assert_eq!(id.to_string(), "4bf92f3577b34da6a3ce929d0e0e4736");
}
#[test]
fn extract_from_x_trace_id_header() {
let mut headers = axum::http::HeaderMap::new();
headers.insert(
"x-trace-id",
"4bf92f3577b34da6a3ce929d0e0e4736".parse().unwrap(),
);
let id = extract_from_headers(&headers);
assert_eq!(id.to_string(), "4bf92f3577b34da6a3ce929d0e0e4736");
}
#[test]
fn traceparent_takes_priority_over_x_trace_id() {
let mut headers = axum::http::HeaderMap::new();
headers.insert(
"traceparent",
"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"
.parse()
.unwrap(),
);
headers.insert(
"x-trace-id",
"aaaabbbbccccddddaaaabbbbccccdddd".parse().unwrap(),
);
let id = extract_from_headers(&headers);
assert_eq!(id.to_string(), "4bf92f3577b34da6a3ce929d0e0e4736");
}
#[test]
fn extract_generates_when_missing() {
let headers = axum::http::HeaderMap::new();
let id = extract_from_headers(&headers);
assert_ne!(id, TraceId::ZERO);
}
#[test]
fn pgwire_param_extraction_roundtrips() {
let tid = TraceId::generate();
let mut params = std::collections::HashMap::new();
params.insert("trace_id".into(), tid.to_string());
let extracted = extract_from_pgwire_params(¶ms);
assert_eq!(extracted, tid);
}
#[test]
fn pgwire_param_generates_when_missing() {
let params = std::collections::HashMap::new();
let id = extract_from_pgwire_params(¶ms);
assert_ne!(id, TraceId::ZERO);
}
}