iliana destroyer of worlds ad285edcc6
attributes: instrument Err (#637)
* attributes: instrument Err

This adds `#[instrument(err)]`, which will emit an error-level trace
event if the caller returns an `Err`.

Fixes #545.

* attributes: use field instead of format args

* attributes: note `err` needs Display impl
2020-03-17 15:47:21 -07:00

65 lines
1.7 KiB
Rust

#[path = "../../tracing-futures/tests/support.rs"]
// we don't use some of the test support functions, but `tracing-futures` does.
#[allow(dead_code)]
mod support;
use support::*;
use tracing::subscriber::with_default;
use tracing::Level;
use tracing_attributes::instrument;
use std::convert::TryFrom;
use std::num::TryFromIntError;
#[instrument(err)]
fn err() -> Result<u8, TryFromIntError> {
u8::try_from(1234)
}
#[test]
fn test() {
let span = span::mock().named("err");
let (subscriber, handle) = subscriber::mock()
.new_span(span.clone())
.enter(span.clone())
.event(event::mock().at_level(Level::ERROR))
.exit(span.clone())
.drop_span(span)
.done()
.run_with_handle();
with_default(subscriber, || err().ok());
handle.assert_finished();
}
#[instrument(err)]
async fn err_async(polls: usize) -> Result<u8, TryFromIntError> {
let future = PollN::new_ok(polls);
tracing::trace!(awaiting = true);
future.await.ok();
u8::try_from(1234)
}
#[test]
fn test_async() {
let span = span::mock().named("err_async");
let (subscriber, handle) = subscriber::mock()
.new_span(span.clone())
.enter(span.clone())
.event(
event::mock()
.with_fields(field::mock("awaiting").with_value(&true))
.at_level(Level::TRACE),
)
.exit(span.clone())
.enter(span.clone())
.event(event::mock().at_level(Level::ERROR))
.exit(span.clone())
.drop_span(span)
.done()
.run_with_handle();
with_default(subscriber, || {
block_on_future(async { err_async(2).await }).ok();
});
handle.assert_finished();
}