#[cfg(feature = "telemetry")]
use opentelemetry::{
global,
trace::TracerProvider as _,
};
#[cfg(feature = "telemetry")]
use opentelemetry_sdk::{
runtime,
trace::{RandomIdGenerator, Sampler, TracerProvider},
};
pub struct TelemetryGuard {
#[cfg(feature = "telemetry")]
_private: (),
}
impl Drop for TelemetryGuard {
fn drop(&mut self) {
#[cfg(feature = "telemetry")]
{
global::shutdown_tracer_provider();
}
}
}
#[cfg(feature = "telemetry")]
pub fn init() -> TelemetryGuard {
use opentelemetry_sdk::trace;
let provider = trace::TracerProvider::builder()
.with_sampler(Sampler::AlwaysOn)
.with_id_generator(RandomIdGenerator::default())
.with_resource(opentelemetry_sdk::Resource::new(vec![
opentelemetry::KeyValue::new("service.name", "cesiumdb"),
]))
.build();
global::set_tracer_provider(provider);
TelemetryGuard { _private: () }
}
#[cfg(feature = "telemetry")]
pub fn init_with_provider(provider: TracerProvider) -> TelemetryGuard {
global::set_tracer_provider(provider);
TelemetryGuard { _private: () }
}
#[cfg(not(feature = "telemetry"))]
pub fn init() -> TelemetryGuard {
TelemetryGuard {}
}
#[macro_export]
macro_rules! telemetry_span {
($name:expr $(, $($fields:tt)*)?) => {{
#[cfg(feature = "telemetry")]
{
let _span = tracing::debug_span!($name $(, $($fields)*)?);
let _guard = _span.entered();
}
}};
}
#[macro_export]
macro_rules! telemetry_event {
($($fields:tt)*) => {{
#[cfg(feature = "telemetry")]
{
tracing::event!(tracing::Level::DEBUG, $($fields)*);
}
}};
}
#[macro_export]
macro_rules! instrument {
(
$(#[$meta:meta])*
$vis:vis fn $name:ident $(<$($generic:tt),*>)?($($arg:tt)*) $(-> $ret:ty)? $body:block
) => {
#[cfg_attr(feature = "telemetry", tracing::instrument(skip_all, level = "debug"))]
$(#[$meta])*
$vis fn $name $(<$($generic),*>)?($($arg)*) $(-> $ret)? $body
};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_telemetry_guard_drop() {
let _guard = TelemetryGuard {
#[cfg(feature = "telemetry")]
_private: (),
};
}
}