ledgence_worker_api/
trace.rs1use crate::{CloudEvent, Result};
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
7#[serde(deny_unknown_fields)]
8pub struct TraceContext {
9 pub traceparent: String,
10 #[serde(skip_serializing_if = "Option::is_none")]
11 pub tracestate: Option<String>,
12}
13impl TraceContext {
14 pub fn validate(&self) -> Result<()> {
15 crate::validate_traceparent(&self.traceparent)?;
16 if let Some(state) = &self.tracestate {
17 crate::validate_tracestate(state)?;
18 }
19 Ok(())
20 }
21
22 pub fn from_event(event: &CloudEvent) -> Option<Self> {
24 event.traceparent().map(|parent| Self {
25 traceparent: parent.to_owned(),
26 tracestate: event
27 .value()
28 .get("tracestate")
29 .and_then(serde_json::Value::as_str)
30 .map(str::to_owned),
31 })
32 }
33}
34
35pub trait TraceBridge: Send + Sync {
41 fn set_parent(&self, span: &tracing::Span, parent: Option<&TraceContext>);
42 fn add_link(&self, span: &tracing::Span, context: &TraceContext);
43 fn context(&self, span: &tracing::Span) -> Option<TraceContext>;
44}
45
46#[derive(Debug, Default)]
48pub struct NoopTraceBridge;
49impl TraceBridge for NoopTraceBridge {
50 fn set_parent(&self, _: &tracing::Span, _: Option<&TraceContext>) {}
51 fn add_link(&self, _: &tracing::Span, _: &TraceContext) {}
52 fn context(&self, _: &tracing::Span) -> Option<TraceContext> {
53 None
54 }
55}