rama-core 0.3.0

rama service core code, used by rama and service authors
Documentation
//! Tracing core rexport and utilities, for your conveneince

#[doc(inline)]
pub use tracing::*;

/// Re-export of [`tracing_appender`] plus rama utilities that go with it.
#[cfg(feature = "std")]
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
pub mod appender {
    #[doc(inline)]
    pub use ::tracing_appender::*;

    #[doc(inline)]
    pub use ::tracing_appender::{
        non_blocking::{NonBlocking, NonBlockingBuilder, WorkerGuard},
        rolling::{RollingFileAppender, Rotation},
    };

    use std::path::Path;

    /// Build a [`RollingFileAppender`] wrapped in [`NonBlocking`] so
    /// file I/O (including rotation) runs on the appender's worker
    /// thread instead of the caller's. The returned [`WorkerGuard`]
    /// must be kept alive for the program's lifetime; drop it just
    /// before exit to flush pending records.
    pub fn rolling_dedicated_thread(
        rotation: Rotation,
        directory: impl AsRef<Path>,
        file_name_prefix: impl AsRef<Path>,
    ) -> (NonBlocking, WorkerGuard) {
        let appender = RollingFileAppender::new(rotation, directory, file_name_prefix);
        rolling_dedicated_thread_with_builder(NonBlockingBuilder::default(), appender)
    }

    /// [`rolling_dedicated_thread`] variant accepting a pre-configured
    /// [`NonBlockingBuilder`] (custom buffer limit, lossy vs.
    /// blocking back-pressure, thread name, …).
    pub fn rolling_dedicated_thread_with_builder(
        builder: NonBlockingBuilder,
        appender: RollingFileAppender,
    ) -> (NonBlocking, WorkerGuard) {
        builder.finish(appender)
    }
}

#[cfg(feature = "opentelemetry")]
#[cfg_attr(docsrs, doc(cfg(feature = "opentelemetry")))]
#[doc(inline)]
pub use tracing_opentelemetry::*;

// NOTE: once <https://github.com/tokio-rs/tracing/issues/3310>
// is resolved (if ever) we should be able to remove these utility macros again

#[doc(hidden)]
pub mod __private {
    pub use tracing::span as __og_span;
}

#[cfg(not(feature = "opentelemetry"))]
#[macro_export]
#[doc(hidden)]
macro_rules! __span {
    ($lvl:expr, $name:expr) => {
        $crate::telemetry::tracing::span!(target: module_path!(), $lvl, $name, )
    };
    ($lvl:expr, $name:expr, $($fields:tt)*) => {
        $crate::telemetry::tracing::span!(target: module_path!(), $lvl, $name, $($fields)*)
    };
    (target: $target:expr, $lvl:expr, $name:expr, $($fields:tt)*) => {
        {
            $crate::telemetry::tracing::__private::__og_span!(
                target: $target,
                $lvl,
                $name,
                $($fields)*
            )
        }
    };
    (target: $target:expr, parent: $parent:expr, $lvl:expr, $name:expr, $($fields:tt)*) => {
        {
            $crate::telemetry::tracing::__private::__og_span!(
                target: $target,
                parent: $parent,
                $lvl,
                $name,
                $($fields)*
            )
        }
    };
}

#[cfg(feature = "opentelemetry")]
#[macro_export]
#[doc(hidden)]
macro_rules! __span {
    ($lvl:expr, $name:expr) => {
        $crate::telemetry::tracing::span!(target: module_path!(), $lvl, $name, )
    };
    ($lvl:expr, $name:expr, $($fields:tt)*) => {
        $crate::telemetry::tracing::span!(target: module_path!(), $lvl, $name, $($fields)*)
    };
    (target: $target:expr, $lvl:expr, $name:expr, $($fields:tt)*) => {
        {
            use $crate::telemetry::tracing::{OpenTelemetrySpanExt as _, field};
            use $crate::telemetry::opentelemetry::trace::TraceContextExt as _;
            use $crate::telemetry::opentelemetry::{SpanId, TraceId};

            let span = $crate::telemetry::tracing::__private::__og_span!(
                target: $target,
                $lvl,
                $name,
                span.id = field::Empty,
                trace.id = field::Empty,
                $($fields)*
            );

            let otel_ctx = span.context();
            let span_ref = otel_ctx.span();
            let span_ctx = span_ref.span_context();

            let span_id = span_ctx.span_id();
            if span_id != SpanId::INVALID {
                span.record("span.id", span_id.to_string());
            }

            let trace_id = span_ctx.trace_id();
            if trace_id != TraceId::INVALID {
                span.record("trace.id", trace_id.to_string());
            }

            span
        }
    };
    (target: $target:expr, parent: $parent:expr, $lvl:expr, $name:expr, $($fields:tt)*) => {
        {
            use $crate::telemetry::tracing::{OpenTelemetrySpanExt as _, field};
            use $crate::telemetry::opentelemetry::trace::TraceContextExt as _;
            use $crate::telemetry::opentelemetry::{SpanId, TraceId};

            let src_span = $crate::telemetry::tracing::Span::current();

            let span = $crate::telemetry::tracing::__private::__og_span!(
                target: $target,
                parent: $parent,
                $lvl,
                $name,
                span.id = field::Empty,
                trace.id = field::Empty,
                $($fields)*
            );

            let otel_ctx = span.context();
            let span_ref = otel_ctx.span();
            let span_ctx = span_ref.span_context();

            let span_id = span_ctx.span_id();
            if span_id != SpanId::INVALID {
                span.record("span.id", span_id.to_string());
            }

            let trace_id = span_ctx.trace_id();
            if trace_id != TraceId::INVALID {
                span.record("trace.id", trace_id.to_string());
            }

            span
        }
    };
}

#[doc(inline)]
pub use crate::__span as span;

#[macro_export]
#[doc(hidden)]
macro_rules! __trace_span {
    ($name:expr) => {
        $crate::telemetry::tracing::span!($crate::telemetry::tracing::Level::TRACE, $name)
    };
    ($name:expr, $($fields:tt)*) => {
        $crate::telemetry::tracing::span!($crate::telemetry::tracing::Level::TRACE, $name, $($fields)*)
    };
    (target: $target:expr, $name:expr, $($fields:tt)*) => {
        $crate::telemetry::tracing::span!(target: $target, $crate::telemetry::tracing::Level::TRACE, $name, $($fields)*)
    }
}

#[doc(inline)]
pub use crate::__trace_span as trace_span;

#[macro_export]
#[doc(hidden)]
macro_rules! __debug_span {
    ($name:expr) => {
        $crate::telemetry::tracing::span!($crate::telemetry::tracing::Level::DEBUG, $name)
    };
    ($name:expr, $($fields:tt)*) => {
        $crate::telemetry::tracing::span!($crate::telemetry::tracing::Level::DEBUG, $name, $($fields)*)
    };
    (target: $target:expr, $name:expr, $($fields:tt)*) => {
        $crate::telemetry::tracing::span!(target: $target, $crate::telemetry::tracing::Level::DEBUG, $name, $($fields)*)
    }
}

#[doc(inline)]
pub use crate::__debug_span as debug_span;

#[macro_export]
#[doc(hidden)]
macro_rules! __info_span {
    ($name:expr) => {
        $crate::telemetry::tracing::span!($crate::telemetry::tracing::Level::INFO, $name)
    };
    ($name:expr, $($fields:tt)*) => {
        $crate::telemetry::tracing::span!($crate::telemetry::tracing::Level::INFO, $name, $($fields)*)
    };
    (target: $target:expr, $name:expr, $($fields:tt)*) => {
        $crate::telemetry::tracing::span!(target: $target, $crate::telemetry::tracing::Level::INFO, $name, $($fields)*)
    }
}

#[doc(inline)]
pub use crate::__info_span as info_span;

#[cfg(not(feature = "opentelemetry"))]
#[macro_export]
#[doc(hidden)]
macro_rules! __root_span {
    ($lvl:expr, $name:expr) => {
        $crate::telemetry::tracing::root_span!(target: module_path!(), $lvl, $name,)
    };
    ($lvl:expr, $name:expr, $($fields:tt)*) => {
        $crate::telemetry::tracing::root_span!(target: module_path!(), $lvl, $name, $($fields)*)
    };
    (target: $target:expr, $lvl:expr, $name:expr, $($fields:tt)*) => {
        {
            let src_span = $crate::telemetry::tracing::Span::current();

            let span = $crate::telemetry::tracing::span!(
                target: $target,
                parent: None,
                $lvl,
                $name,
                $($fields)*
            );

            span.follows_from(src_span);

            span
        }
    };
}

#[cfg(feature = "opentelemetry")]
#[macro_export]
#[doc(hidden)]
macro_rules! __root_span {
    ($lvl:expr, $name:expr) => {
        $crate::telemetry::tracing::root_span!(target: module_path!(), $lvl, $name,)
    };
    ($lvl:expr, $name:expr, $($fields:tt)*) => {
        $crate::telemetry::tracing::root_span!(target: module_path!(), $lvl, $name, $($fields)*)
    };
    (target: $target:expr, $lvl:expr, $name:expr, $($fields:tt)*) => {
        {
            use $crate::telemetry::tracing::OpenTelemetrySpanExt as _;
            use $crate::telemetry::opentelemetry::{trace::{get_active_span, TraceContextExt}, KeyValue};

            let src_span = $crate::telemetry::tracing::Span::current();

            let span = $crate::telemetry::tracing::span!(
                target: $target,
                parent: None,
                $lvl,
                $name,
                $($fields)*
            );

            src_span.add_link_with_attributes(
                span.context().span().span_context().clone(),
                vec![KeyValue::new("opentracing.ref_type", "child_of")],
            );

            span.follows_from(src_span);
            span.add_link_with_attributes(
                get_active_span(|span| span.span_context().clone()),
                vec![KeyValue::new("opentracing.ref_type", "follows_from")],
            );

            span
        }
    };
}

#[doc(inline)]
pub use crate::__root_span as root_span;

#[macro_export]
#[doc(hidden)]
macro_rules! __trace_root_span {
    ($name:expr) => {
        $crate::telemetry::tracing::root_span!($crate::telemetry::tracing::Level::TRACE, $name,)
    };
    ($name:expr, $($fields:tt)*) => {
        $crate::telemetry::tracing::root_span!($crate::telemetry::tracing::Level::TRACE, $name, $($fields)*)
    };
    (target: $target:expr, $name:expr, $($fields:tt)*) => {
        $crate::telemetry::tracing::root_span!(target: $target, $crate::telemetry::tracing::Level::TRACE, $name, $($fields)*)
    }
}

#[doc(inline)]
pub use crate::__trace_root_span as trace_root_span;

#[macro_export]
#[doc(hidden)]
macro_rules! __debug_root_span {
    ($name:expr) => {
        $crate::telemetry::tracing::root_span!($crate::telemetry::tracing::Level::DEBUG, $name,)
    };
    ($name:expr, $($fields:tt)*) => {
        $crate::telemetry::tracing::root_span!($crate::telemetry::tracing::Level::DEBUG, $name, $($fields)*)
    };
    (target: $target:expr, $name:expr, $($fields:tt)*) => {
        $crate::telemetry::tracing::root_span!(target: $target, $crate::telemetry::tracing::Level::DEBUG, $name, $($fields)*)
    }
}

#[doc(inline)]
pub use crate::__debug_root_span as debug_root_span;

#[macro_export]
#[doc(hidden)]
macro_rules! __info_root_span {
    ($name:expr) => {
        $crate::telemetry::tracing::root_span!($crate::telemetry::tracing::Level::INFO, $name,)
    };
    ($name:expr, $($fields:tt)*) => {
        $crate::telemetry::tracing::root_span!($crate::telemetry::tracing::Level::INFO, $name, $($fields)*)
    };
    (target: $target:expr, $name:expr, $($fields:tt)*) => {
        $crate::telemetry::tracing::root_span!(target: $target, $crate::telemetry::tracing::Level::INFO, $name, $($fields)*)
    }
}

#[doc(inline)]
pub use crate::__info_root_span as info_root_span;