mirror of
https://git.proxmox.com/git/rustc
synced 2025-08-24 12:51:31 +00:00
633 lines
18 KiB
Rust
633 lines
18 KiB
Rust
//! A crate providing macros for creating spans in various detail levels. `coarse!` should be used for top-level operations, whereas
|
|
//! `detail!` should be used in plumbing crates unless their operations are likely to cost a lot of time.
|
|
//!
|
|
//! The application is supposed to explicitly turn on tracing via `gix-features`.
|
|
//! Crates that use `gix-features` should use `gix_features::trace`, and those who don't can use `gix_trace` directly.
|
|
//! ## Feature Flags
|
|
#![cfg_attr(
|
|
all(doc, feature = "document-features"),
|
|
doc = ::document_features::document_features!()
|
|
)]
|
|
#![cfg_attr(all(doc, feature = "document-features"), feature(doc_cfg, doc_auto_cfg))]
|
|
#![deny(missing_docs, rust_2018_idioms, unsafe_code)]
|
|
|
|
/// The level at which the tracing item should be created.
|
|
///
|
|
/// It's used to filter items early.
|
|
#[derive(Debug, Copy, Clone, PartialEq, Eq, Ord, PartialOrd)]
|
|
pub enum Level {
|
|
/// A coarse-grained trace level, one that should span entire operations with low frequency.
|
|
Coarse = 1,
|
|
/// Finer grained trace level that further subdivides coarse-level traces.
|
|
///
|
|
/// Note that these should only be created for areas of the code which have significant cost.
|
|
Detail = 2,
|
|
}
|
|
|
|
/// The maximum allowed level for tracing items, as compiled in.
|
|
#[cfg(feature = "tracing-detail")]
|
|
pub const MAX_LEVEL: Level = Level::Detail;
|
|
/// The maximum allowed level for tracing items, as compiled in.
|
|
#[cfg(not(feature = "tracing-detail"))]
|
|
pub const MAX_LEVEL: Level = Level::Coarse;
|
|
|
|
#[cfg(feature = "tracing")]
|
|
mod enabled;
|
|
|
|
#[cfg(feature = "tracing")]
|
|
pub use enabled::{field, Span};
|
|
|
|
impl Span {
|
|
/// Execute `f` in with this span active, consuming it.
|
|
pub fn into_scope<T>(self, f: impl FnOnce() -> T) -> T {
|
|
f()
|
|
}
|
|
}
|
|
|
|
#[cfg(feature = "tracing")]
|
|
#[doc(hidden)]
|
|
pub use enabled::{metadata, Event, MetaOnlyCallsite, Metadata};
|
|
|
|
#[cfg(not(feature = "tracing"))]
|
|
mod disabled;
|
|
#[cfg(not(feature = "tracing"))]
|
|
pub use disabled::Span;
|
|
|
|
///
|
|
pub mod event {
|
|
#[cfg(feature = "tracing")]
|
|
pub use tracing_core::Level;
|
|
|
|
/// All available tracing levels for use in `event!()` macro.
|
|
#[cfg(not(feature = "tracing"))]
|
|
#[repr(usize)]
|
|
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
|
|
pub enum Level {
|
|
/// The "trace" level.
|
|
///
|
|
/// Designates very low priority, often extremely verbose, information.
|
|
TRACE = 0,
|
|
/// The "debug" level.
|
|
///
|
|
/// Designates lower priority information.
|
|
DEBUG = 1,
|
|
/// The "info" level.
|
|
///
|
|
/// Designates useful information.
|
|
INFO = 2,
|
|
/// The "warn" level.
|
|
///
|
|
/// Designates hazardous situations.
|
|
WARN = 3,
|
|
/// The "error" level.
|
|
///
|
|
/// Designates very serious errors.
|
|
ERROR = 4,
|
|
}
|
|
}
|
|
|
|
/// Create a new [coarse][Level::Coarse] span.
|
|
#[macro_export]
|
|
macro_rules! coarse {
|
|
(target: $target:expr, $name:expr, $($field:tt)*) => {
|
|
$crate::span!(
|
|
target: $target,
|
|
$crate::Level::Coarse,
|
|
$name,
|
|
$($field)*
|
|
)
|
|
};
|
|
(target: $target:expr, $name:expr) => {
|
|
$crate::coarse!(target: $target, $name,)
|
|
};
|
|
($name:expr, $($field:tt)*) => {
|
|
$crate::span!(
|
|
target: module_path!(),
|
|
$crate::Level::Coarse,
|
|
$name,
|
|
$($field)*
|
|
)
|
|
};
|
|
($name:expr) => {$crate::coarse!($name,)};
|
|
}
|
|
|
|
/// Create a new [detail][Level::Detail] span.
|
|
#[macro_export]
|
|
macro_rules! detail {
|
|
(target: $target:expr, $name:expr, $($field:tt)*) => {
|
|
$crate::span!(
|
|
target: $target,
|
|
$crate::Level::Detail,
|
|
$name,
|
|
$($field)*
|
|
)
|
|
};
|
|
(target: $target:expr, $name:expr) => {
|
|
$crate::detail!(target: $target, $name,)
|
|
};
|
|
($name:expr, $($field:tt)*) => {
|
|
$crate::span!(
|
|
target: module_path!(),
|
|
$crate::Level::Detail,
|
|
$name,
|
|
$($field)*
|
|
)
|
|
};
|
|
($name:expr) => {$crate::coarse!($name,)};
|
|
}
|
|
|
|
/// Emit an error event.
|
|
#[macro_export]
|
|
macro_rules! error {
|
|
(target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::ERROR, { $($field)* }, $($arg)*)
|
|
);
|
|
(target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::ERROR, { $($k).+ $($field)* })
|
|
);
|
|
(target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::ERROR, { ?$($k).+ $($field)* })
|
|
);
|
|
(target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::ERROR, { %$($k).+ $($field)* })
|
|
);
|
|
(target: $target:expr, $($arg:tt)+ ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::ERROR, {}, $($arg)+)
|
|
);
|
|
({ $($field:tt)+ }, $($arg:tt)+ ) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::ERROR,
|
|
{ $($field)+ },
|
|
$($arg)+
|
|
)
|
|
);
|
|
($($k:ident).+ = $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::ERROR,
|
|
{ $($k).+ = $($field)*}
|
|
)
|
|
);
|
|
(?$($k:ident).+ = $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::ERROR,
|
|
{ ?$($k).+ = $($field)*}
|
|
)
|
|
);
|
|
(%$($k:ident).+ = $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::ERROR,
|
|
{ %$($k).+ = $($field)*}
|
|
)
|
|
);
|
|
($($k:ident).+, $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::ERROR,
|
|
{ $($k).+, $($field)*}
|
|
)
|
|
);
|
|
(?$($k:ident).+, $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::ERROR,
|
|
{ ?$($k).+, $($field)*}
|
|
)
|
|
);
|
|
(%$($k:ident).+, $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::ERROR,
|
|
{ %$($k).+, $($field)*}
|
|
)
|
|
);
|
|
(?$($k:ident).+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::ERROR,
|
|
{ ?$($k).+ }
|
|
)
|
|
);
|
|
(%$($k:ident).+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::ERROR,
|
|
{ %$($k).+ }
|
|
)
|
|
);
|
|
($($k:ident).+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::ERROR,
|
|
{ $($k).+ }
|
|
)
|
|
);
|
|
($($arg:tt)+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::ERROR,
|
|
{},
|
|
$($arg)+
|
|
)
|
|
);
|
|
}
|
|
|
|
/// Emit a warn event.
|
|
#[macro_export]
|
|
macro_rules! warn {
|
|
(target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::WARN, { $($field)* }, $($arg)*)
|
|
);
|
|
(target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::WARN, { $($k).+ $($field)* })
|
|
);
|
|
(target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::WARN, { ?$($k).+ $($field)* })
|
|
);
|
|
(target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::WARN, { %$($k).+ $($field)* })
|
|
);
|
|
(target: $target:expr, $($arg:tt)+ ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::WARN, {}, $($arg)+)
|
|
);
|
|
({ $($field:tt)+ }, $($arg:tt)+ ) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::WARN,
|
|
{ $($field)+ },
|
|
$($arg)+
|
|
)
|
|
);
|
|
($($k:ident).+ = $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::WARN,
|
|
{ $($k).+ = $($field)*}
|
|
)
|
|
);
|
|
(?$($k:ident).+ = $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::WARN,
|
|
{ ?$($k).+ = $($field)*}
|
|
)
|
|
);
|
|
(%$($k:ident).+ = $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::WARN,
|
|
{ %$($k).+ = $($field)*}
|
|
)
|
|
);
|
|
($($k:ident).+, $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::WARN,
|
|
{ $($k).+, $($field)*}
|
|
)
|
|
);
|
|
(?$($k:ident).+, $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::WARN,
|
|
{ ?$($k).+, $($field)*}
|
|
)
|
|
);
|
|
(%$($k:ident).+, $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::WARN,
|
|
{ %$($k).+, $($field)*}
|
|
)
|
|
);
|
|
(?$($k:ident).+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::WARN,
|
|
{ ?$($k).+ }
|
|
)
|
|
);
|
|
(%$($k:ident).+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::WARN,
|
|
{ %$($k).+ }
|
|
)
|
|
);
|
|
($($k:ident).+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::WARN,
|
|
{ $($k).+ }
|
|
)
|
|
);
|
|
($($arg:tt)+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::WARN,
|
|
{},
|
|
$($arg)+
|
|
)
|
|
);
|
|
}
|
|
|
|
/// Emit an info event.
|
|
#[macro_export]
|
|
macro_rules! info {
|
|
(target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::INFO, { $($field)* }, $($arg)*)
|
|
);
|
|
(target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::INFO, { $($k).+ $($field)* })
|
|
);
|
|
(target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::INFO, { ?$($k).+ $($field)* })
|
|
);
|
|
(target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::INFO, { %$($k).+ $($field)* })
|
|
);
|
|
(target: $target:expr, $($arg:tt)+ ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::INFO, {}, $($arg)+)
|
|
);
|
|
({ $($field:tt)+ }, $($arg:tt)+ ) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::INFO,
|
|
{ $($field)+ },
|
|
$($arg)+
|
|
)
|
|
);
|
|
($($k:ident).+ = $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::INFO,
|
|
{ $($k).+ = $($field)*}
|
|
)
|
|
);
|
|
(?$($k:ident).+ = $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::INFO,
|
|
{ ?$($k).+ = $($field)*}
|
|
)
|
|
);
|
|
(%$($k:ident).+ = $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::INFO,
|
|
{ %$($k).+ = $($field)*}
|
|
)
|
|
);
|
|
($($k:ident).+, $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::INFO,
|
|
{ $($k).+, $($field)*}
|
|
)
|
|
);
|
|
(?$($k:ident).+, $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::INFO,
|
|
{ ?$($k).+, $($field)*}
|
|
)
|
|
);
|
|
(%$($k:ident).+, $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::INFO,
|
|
{ %$($k).+, $($field)*}
|
|
)
|
|
);
|
|
(?$($k:ident).+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::INFO,
|
|
{ ?$($k).+ }
|
|
)
|
|
);
|
|
(%$($k:ident).+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::INFO,
|
|
{ %$($k).+ }
|
|
)
|
|
);
|
|
($($k:ident).+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::INFO,
|
|
{ $($k).+ }
|
|
)
|
|
);
|
|
($($arg:tt)+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::INFO,
|
|
{},
|
|
$($arg)+
|
|
)
|
|
);
|
|
}
|
|
|
|
/// Emit a debug event.
|
|
#[macro_export]
|
|
macro_rules! debug {
|
|
(target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::DEBUG, { $($field)* }, $($arg)*)
|
|
);
|
|
(target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::DEBUG, { $($k).+ $($field)* })
|
|
);
|
|
(target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::DEBUG, { ?$($k).+ $($field)* })
|
|
);
|
|
(target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::DEBUG, { %$($k).+ $($field)* })
|
|
);
|
|
(target: $target:expr, $($arg:tt)+ ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::DEBUG, {}, $($arg)+)
|
|
);
|
|
({ $($field:tt)+ }, $($arg:tt)+ ) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::DEBUG,
|
|
{ $($field)+ },
|
|
$($arg)+
|
|
)
|
|
);
|
|
($($k:ident).+ = $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::DEBUG,
|
|
{ $($k).+ = $($field)*}
|
|
)
|
|
);
|
|
(?$($k:ident).+ = $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::DEBUG,
|
|
{ ?$($k).+ = $($field)*}
|
|
)
|
|
);
|
|
(%$($k:ident).+ = $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::DEBUG,
|
|
{ %$($k).+ = $($field)*}
|
|
)
|
|
);
|
|
($($k:ident).+, $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::DEBUG,
|
|
{ $($k).+, $($field)*}
|
|
)
|
|
);
|
|
(?$($k:ident).+, $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::DEBUG,
|
|
{ ?$($k).+, $($field)*}
|
|
)
|
|
);
|
|
(%$($k:ident).+, $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::DEBUG,
|
|
{ %$($k).+, $($field)*}
|
|
)
|
|
);
|
|
(?$($k:ident).+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::DEBUG,
|
|
{ ?$($k).+ }
|
|
)
|
|
);
|
|
(%$($k:ident).+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::DEBUG,
|
|
{ %$($k).+ }
|
|
)
|
|
);
|
|
($($k:ident).+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::DEBUG,
|
|
{ $($k).+ }
|
|
)
|
|
);
|
|
($($arg:tt)+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::DEBUG,
|
|
{},
|
|
$($arg)+
|
|
)
|
|
);
|
|
}
|
|
|
|
/// Emit a trace event.
|
|
#[macro_export]
|
|
macro_rules! trace {
|
|
(target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::TRACE, { $($field)* }, $($arg)*)
|
|
);
|
|
(target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::TRACE, { $($k).+ $($field)* })
|
|
);
|
|
(target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::TRACE, { ?$($k).+ $($field)* })
|
|
);
|
|
(target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::TRACE, { %$($k).+ $($field)* })
|
|
);
|
|
(target: $target:expr, $($arg:tt)+ ) => (
|
|
$crate::event!(target: $target, $crate::event::Level::TRACE, {}, $($arg)+)
|
|
);
|
|
({ $($field:tt)+ }, $($arg:tt)+ ) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::TRACE,
|
|
{ $($field)+ },
|
|
$($arg)+
|
|
)
|
|
);
|
|
($($k:ident).+ = $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::TRACE,
|
|
{ $($k).+ = $($field)*}
|
|
)
|
|
);
|
|
(?$($k:ident).+ = $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::TRACE,
|
|
{ ?$($k).+ = $($field)*}
|
|
)
|
|
);
|
|
(%$($k:ident).+ = $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::TRACE,
|
|
{ %$($k).+ = $($field)*}
|
|
)
|
|
);
|
|
($($k:ident).+, $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::TRACE,
|
|
{ $($k).+, $($field)*}
|
|
)
|
|
);
|
|
(?$($k:ident).+, $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::TRACE,
|
|
{ ?$($k).+, $($field)*}
|
|
)
|
|
);
|
|
(%$($k:ident).+, $($field:tt)*) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::TRACE,
|
|
{ %$($k).+, $($field)*}
|
|
)
|
|
);
|
|
(?$($k:ident).+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::TRACE,
|
|
{ ?$($k).+ }
|
|
)
|
|
);
|
|
(%$($k:ident).+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::TRACE,
|
|
{ %$($k).+ }
|
|
)
|
|
);
|
|
($($k:ident).+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::TRACE,
|
|
{ $($k).+ }
|
|
)
|
|
);
|
|
($($arg:tt)+) => (
|
|
$crate::event!(
|
|
target: module_path!(),
|
|
$crate::event::Level::TRACE,
|
|
{},
|
|
$($arg)+
|
|
)
|
|
);
|
|
}
|