use tonic::Request;
const TRACEPARENT: &str = "traceparent";
const TRACESTATE: &str = "tracestate";
pub fn inject_traceparent<T>(req: &mut Request<T>, traceparent: &str) -> bool {
match traceparent.parse() {
Ok(v) => {
req.metadata_mut().insert(TRACEPARENT, v);
true
}
Err(_) => {
tracing::warn!(traceparent, "malformed traceparent — not injected");
false
}
}
}
pub fn inject_tracestate<T>(req: &mut Request<T>, tracestate: &str) -> bool {
match tracestate.parse() {
Ok(v) => {
req.metadata_mut().insert(TRACESTATE, v);
true
}
Err(_) => false,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn inject_traceparent_writes_header() {
let mut req = Request::new(());
let ok = inject_traceparent(
&mut req,
"00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01",
);
assert!(ok);
let v = req.metadata().get("traceparent").unwrap();
assert!(v.to_str().unwrap().starts_with("00-"));
}
#[test]
fn inject_malformed_traceparent_is_noop() {
let mut req = Request::new(());
let ok = inject_traceparent(&mut req, "bad\nvalue");
assert!(!ok);
assert!(req.metadata().get("traceparent").is_none());
}
}