minitrace 0.6.7

A high-performance timeline tracing library for Rust
Documentation
#![allow(dead_code)]
#![allow(unused_imports)]

use minitrace::prelude::*;
use test_harness::test;

type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;

#[test(harness = test_util::setup_minitrace)]
#[trace]
fn test_sync() -> Result<()> {
    std::thread::sleep(std::time::Duration::from_millis(50));
    Ok(())
}

#[test(harness = test_util::setup_minitrace_async)]
#[trace]
async fn test_async() -> Result<()> {
    tokio::time::sleep(std::time::Duration::from_millis(50)).await;
    Ok(())
}

#[cfg(test)]
mod test_util {
    use minitrace::collector::Config;
    use minitrace::collector::ConsoleReporter;
    use minitrace::prelude::*;

    use super::*;

    pub fn setup_minitrace<F>(test: F)
    where F: FnOnce() -> Result<()> + 'static {
        minitrace::set_reporter(ConsoleReporter, Config::default());
        {
            let root = Span::root(closure_name::<F>(), SpanContext::random());
            let _guard = root.set_local_parent();
            test().expect("test success");
        }
        minitrace::flush();
    }

    pub fn setup_minitrace_async<F, Fut>(test: F)
    where
        F: FnOnce() -> Fut + 'static,
        Fut: std::future::Future<Output = Result<()>> + Send + 'static,
    {
        minitrace::set_reporter(ConsoleReporter, Config::default());
        let rt = tokio::runtime::Builder::new_multi_thread()
            .worker_threads(3)
            .enable_all()
            .build()
            .unwrap();
        let root = Span::root(closure_name::<F>(), SpanContext::random());
        rt.block_on(test().in_span(root)).unwrap();
        minitrace::flush();
    }

    pub fn closure_name<F: std::any::Any>() -> &'static str {
        let full_name = std::any::type_name::<F>();
        full_name
            .rsplit("::")
            .find(|name| *name != "{{closure}}")
            .unwrap()
    }
}

fn main() {}