#[cfg(test)]
mod traced_span_tests {
use test_span::{prelude::*, RecordValue};
use tracing::Instrument;
#[test_span]
#[level(tracing::Level::DEBUG)]
fn tracing_macro_works() {
let res = do_sync_stuff();
assert_eq!(res, 104);
let res2 = do_sync_stuff();
assert_eq!(res2, 104);
let (spans, logs) = get_telemetry();
assert!(logs.contains_message("here i am!"));
assert!(logs.contains_value("number", RecordValue::Value(52.into())));
assert!(logs.contains_message("here i am again!"));
assert!(logs.contains_message("debug: here i am again!"),);
insta::assert_json_snapshot!(logs);
insta::assert_json_snapshot!(spans);
assert_eq!(spans, get_spans());
assert_eq!(logs, get_logs());
}
#[test_span(tokio::test)]
async fn async_tracing_macro_works() {
let expected = (104, 104);
let actual = futures::join!(do_async_stuff(), do_async_stuff());
assert_eq!(expected, actual);
let (spans, logs) = get_telemetry();
assert!(logs.contains_message("here i am!"));
assert!(logs.contains_value("number", RecordValue::Value(52.into())));
assert!(logs.contains_message("in a separate context!"));
insta::assert_json_snapshot!(logs);
insta::assert_json_snapshot!(spans);
assert_eq!(spans, get_spans());
assert_eq!(logs, get_logs());
}
#[test_span(tokio::test)]
#[level(tracing::Level::DEBUG)]
async fn async_tracing_macro_works_with_other_level() {
let expected = (104, 104);
let actual = futures::join!(do_async_stuff(), do_async_stuff());
assert_eq!(expected, actual);
let (spans, logs) = get_telemetry();
assert!(logs.contains_message("here i am!"));
assert!(logs.contains_value("number", RecordValue::Value(52.into())));
assert!(logs.contains_message("in a separate context!"));
insta::assert_json_snapshot!(logs);
insta::assert_json_snapshot!(spans);
assert_eq!(spans, get_spans());
assert_eq!(logs, get_logs());
}
#[test_span(tokio::test)]
#[level(tracing::Level::DEBUG)]
async fn async_tracing_macro_works_with_filter_parent_span() {
let expected = (104, 156);
let actual = futures::join!(do_async_stuff(), do_async_trace_stuff());
assert_eq!(expected, actual);
let (spans, logs) = get_telemetry();
assert!(logs.contains_message("here i am!"));
assert!(logs.contains_value("number", RecordValue::Value(52.into())));
assert!(logs.contains_message("in a separate context!"));
insta::assert_json_snapshot!(logs);
insta::assert_json_snapshot!(spans);
assert_eq!(spans, get_spans());
assert_eq!(logs, get_logs());
}
#[test]
fn tracing_works() {
test_span::init();
let root_id = {
let root_span = test_span::reexports::tracing::span!(::tracing::Level::ERROR, "root");
let root_id = root_span
.id()
.expect("couldn't get root span id; this cannot happen.");
root_span.in_scope(|| {
let res = do_sync_stuff();
assert_eq!(res, 104);
let res2 = do_sync_stuff();
assert_eq!(res2, 104);
});
root_id
};
let get_telemetry = || {
test_span::get_telemetry_for_root(
&root_id,
&::test_span::Filter::new(tracing::Level::INFO),
)
};
let (spans, logs) = get_telemetry();
dbg!(&logs);
assert!(logs.contains_message("here i am!"));
assert!(logs.contains_value("number", RecordValue::Value(52.into())));
insta::assert_json_snapshot!(logs);
insta::assert_json_snapshot!(spans);
}
#[tokio::test]
async fn async_tracing_works() {
test_span::init();
let root_id = {
let root_span = test_span::reexports::tracing::span!(::tracing::Level::INFO, "root");
let root_id = root_span
.id()
.expect("couldn't get root span id; this cannot happen.");
async {
let res = do_async_stuff().await;
assert_eq!(res, 104);
let res2 = do_async_stuff().await;
assert_eq!(res2, 104);
}
.instrument(root_span)
.await;
root_id
};
let get_telemetry = || {
test_span::get_telemetry_for_root(
&root_id,
&::test_span::Filter::new(tracing::Level::INFO),
)
};
let (spans, logs) = get_telemetry();
assert!(logs.contains_message("here i am!"));
assert!(logs.contains_value("number", RecordValue::Value(52.into())));
assert!(logs.contains_message("in a separate context!"));
insta::assert_json_snapshot!(logs);
insta::assert_json_snapshot!(spans);
}
#[test_span]
fn get_all_logs_to_have_thread_support() {
std::thread::spawn(|| {
tracing::info!("will only show up in get_all_logs!");
tracing::debug!("will only show up in DEBUG get_all_logs!");
})
.join()
.unwrap();
let test_run_logs = get_logs();
assert!(!test_run_logs.contains_message("will only show up in get_all_logs!"));
assert!(!test_run_logs.contains_message("will only show up in DEBUG get_all_logs!"));
let all_logs = test_span::get_all_logs(&::test_span::Filter::new(tracing::Level::INFO));
assert!(all_logs.contains_message("will only show up in get_all_logs!"));
assert!(!all_logs.contains_message("will only show up in DEBUG get_all_logs!"));
let all_debug_logs =
test_span::get_all_logs(&::test_span::Filter::new(tracing::Level::DEBUG));
assert!(all_debug_logs.contains_message("will only show up in get_all_logs!"));
assert!(all_debug_logs.contains_message("will only show up in DEBUG get_all_logs!"));
}
#[tracing::instrument(name = "do_sync_stuff", level = "info")]
fn do_sync_stuff() -> u8 {
tracing::info!("here i am!");
let number = do_sync_stuff_2(42);
tracing::info!(number);
number * 2
}
#[tracing::instrument(
name = "do_sync_stuff2",
target = "my_crate::an_other_target",
level = "info"
)]
fn do_sync_stuff_2(number: u8) -> u8 {
tracing::info!("here i am again!");
tracing::debug!("debug: here i am again!");
number + 10
}
#[tracing::instrument(name = "do_async_stuff", level = "info")]
async fn do_async_stuff() -> u8 {
tracing::info!("here i am!");
let number = do_async_stuff_2(42).await;
tokio::task::spawn_blocking(|| async { tracing::warn!("in a separate context!") })
.await
.unwrap()
.await;
tracing::info!(number);
number * 2
}
#[tracing::instrument(name = "do_async_trace_stuff", level = "trace")]
async fn do_async_trace_stuff() -> u8 {
tracing::trace!("here i am! trace level");
let number = do_async_stuff_2(42).await;
tokio::task::spawn_blocking(|| async { tracing::trace!("in a separate trace context!") })
.await
.unwrap()
.await;
tracing::info!(number);
number + do_async_stuff().await
}
#[tracing::instrument(
name = "do_async_stuff2",
target = "my_crate::an_other_target",
level = "info"
)]
async fn do_async_stuff_2(number: u8) -> u8 {
tracing::debug!("here i am again!");
number + 10
}
}