timeout-tracing 0.1.0

Returns stack and span trace when the future hits a timeout
Documentation
use std::{fmt::Debug, time::Duration};

use itertools::Itertools;
use tracing::info;
use tracing_error::ErrorLayer;
use tracing_subscriber::layer::SubscriberExt;

use crate::{
    TimeoutElapsed,
    trace::{DefaultTraceCapturer, StackAndSpanTrace},
};

mod custom_future;
mod format_values;
mod futures_select;
mod futures_unordered;
mod join;
mod nested_tracing_timeout;
mod reqwest;
mod sleep;
mod sqlx;
mod tokio_select;

async fn run_with_tracing<Fut>(
    duration: Duration,
    f: Fut,
) -> Result<Fut::Output, TimeoutElapsed<StackAndSpanTrace>>
where
    Fut: Future,
    Fut::Output: Debug,
{
    let subscriber = tracing_subscriber::registry()
        .with(ErrorLayer::default())
        // .with(tracing_subscriber::fmt::layer().compact().with_ansi(false))
        ;

    let _guard = tracing::subscriber::set_default(subscriber);
    let old_val = std::env::var_os("RUST_BACKTRACE");
    unsafe { std::env::set_var("RUST_BACKTRACE", "1") };

    info!("before call");
    let result = crate::timeout(duration, DefaultTraceCapturer, f).await;
    info!("after call");

    match old_val {
        Some(old_val) => unsafe { std::env::set_var("RUST_BACKTRACE", old_val) },
        None => unsafe {
            std::env::remove_var("RUST_BACKTRACE");
        },
    }

    match &result {
        Ok(value) => info!("got ok {value:#?}"),
        Err(elapsed) => info!(
            "got timeout\n{} traces:\n{}",
            elapsed.active_traces.len(),
            elapsed
                .active_traces
                .iter()
                .enumerate()
                .map(|(idx, trace)| format!("async trace #{idx}:\n{}", trace.span_trace))
                .join("\n")
        ),
    }

    result
}

fn insta_trace_filters() -> Vec<(&'static str, &'static str)> {
    vec![
        (r#".*/rustlib/src/rust/.*\n"#, r#""#),
        (r#".*/rustc/[0-9a-z]+/.*\n"#, r#""#),
        (
            r#"file: ".*/index.crates.io-[0-9a-z]*/([^/]+)-[^-/]+/"#,
            r#"file: "[crates]/$1-[ver]/"#,
        ),
        (r#"line: [0-9]+"#, r#"line: [NNN]"#),
    ]
}