#![forbid(unsafe_code)]
#![warn(clippy::perf)]
#![warn(clippy::pedantic)]
#![allow(clippy::module_name_repetitions)]
#![doc = include_str!("../README.md")]
#[cfg(feature = "http")]
pub mod http;
mod span_type;
use opentelemetry::Context;
pub const TRACING_TARGET: &str = "otel::tracing";
#[cfg(not(feature = "tracing_level_info"))]
pub const TRACING_LEVEL: tracing::Level = tracing::Level::TRACE;
#[cfg(feature = "tracing_level_info")]
pub const TRACING_LEVEL: tracing::Level = tracing::Level::INFO;
#[macro_export]
macro_rules! otel_trace_span {
(parent: $parent:expr, $name:expr, $($field:tt)*) => {
tracing::span!(
target: $crate::TRACING_TARGET,
parent: $parent,
$crate::TRACING_LEVEL,
$name,
$($field)*
)
};
(parent: $parent:expr, $name:expr) => {
$crate::otel_trace_span!(parent: $parent, $name,)
};
($name:expr, $($field:tt)*) => {
tracing::span!(
target: $crate::TRACING_TARGET,
$crate::TRACING_LEVEL,
$name,
$($field)*
)
};
($name:expr) => {
$crate::otel_trace_span!($name,)
};
}
#[inline]
#[must_use]
pub fn find_current_context() -> Context {
use tracing_opentelemetry::OpenTelemetrySpanExt;
tracing::Span::current().context()
}
#[inline]
#[must_use]
pub fn find_current_trace_id() -> Option<String> {
find_trace_id(&find_current_context())
}
#[inline]
#[must_use]
pub fn find_context_from_tracing(span: &tracing::Span) -> Context {
use tracing_opentelemetry::OpenTelemetrySpanExt;
span.context()
}
#[inline]
#[must_use]
pub fn find_trace_id_from_tracing(span: &tracing::Span) -> Option<String> {
use tracing_opentelemetry::OpenTelemetrySpanExt;
find_trace_id(&span.context())
}
#[inline]
#[must_use]
pub fn find_trace_id(context: &Context) -> Option<String> {
use opentelemetry::trace::TraceContextExt;
let span = context.span();
let span_context = span.span_context();
span_context
.is_valid()
.then(|| span_context.trace_id().to_string())
}
#[inline]
#[must_use]
pub fn find_span_id(context: &Context) -> Option<String> {
use opentelemetry::trace::TraceContextExt;
let span = context.span();
let span_context = span.span_context();
span_context
.is_valid()
.then(|| span_context.span_id().to_string())
}
pub type BoxError = Box<dyn std::error::Error + Send + Sync>;