use std::future::Future;
use trace_weft_core::{RunId, SpanId, SpanRecord, TraceId};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct SpanContext {
pub trace_id: TraceId,
pub run_id: RunId,
pub span_id: SpanId,
}
tokio::task_local! {
static CURRENT_SPAN: SpanContext;
}
pub fn current_span_context() -> Option<SpanContext> {
CURRENT_SPAN.try_with(|ctx| *ctx).ok()
}
pub fn scope_current<F>(ctx: SpanContext, future: F) -> impl Future<Output = F::Output>
where
F: Future,
{
CURRENT_SPAN.scope(ctx, future)
}
pub(crate) fn link_to_ambient(span: &mut SpanRecord) {
if span.parent_span_id.is_some() {
return;
}
if let Some(parent) = current_span_context() {
span.trace_id = parent.trace_id;
span.run_id = parent.run_id;
span.parent_span_id = Some(parent.span_id);
}
}
impl SpanContext {
pub(crate) fn of(span: &SpanRecord) -> Self {
Self {
trace_id: span.trace_id,
run_id: span.run_id,
span_id: span.span_id,
}
}
}