The Async Runtime Instrumentation Subscriber (ari-subscriber
) is a tracing-subscriber
optimized for visually debugging Tokio tracing instrumentation.
This crate provides a Layer
which writes tracing
information to stdout
. It colorizes
the traces that result from the tracing instrumentation in Tokio to make identifying them
easier.
This example will set up a formatting tracing_subscriber::Layer
which is then added to the
registry. The output from the task spawned afterwards will be seen in stdout
.
use tracing_subscriber::prelude::*;
#[tokio::main]
async fn main() {
let layer = ari_subscriber::layer();
tracing_subscriber::registry().with(layer).init();
tokio::spawn(async {
tokio::time::sleep(std::time::Duration::from_millis(100)).await;
})
.await
.unwrap();
}
A common use case is to use ari-subscriber
together with the console-subscriber
, which
aggregates the same Tokio tracing instrumentation to be visualized in Tokio Console.
use tracing_subscriber::prelude::*;
#[tokio::main]
async fn main() {
let fmt_layer = ari_subscriber::layer();
let console_layer = console_subscriber::spawn();
tracing_subscriber::registry()
.with(fmt_layer)
.with(console_layer)
.init();
tokio::spawn(async {
tokio::time::sleep(std::time::Duration::from_millis(100)).await;
})
.await
.unwrap();
}
The beginning of the output of the above program would be:
2023-11-28T10:06:44.746508Z TRACE runtime.spawn[1]{kind=task, task.name=, task.id=18, loc.file="examples/tokio-task.rs", loc.line=14, loc.col=5} new 2023-11-28T10:06:44.747110Z TRACE runtime.spawn[1]{kind=task, task.name=, task.id=18, loc.file="examples/tokio-task.rs", loc.line=14, loc.col=5} enter 2023-11-28T10:06:44.747340Z TRACE runtime.spawn[1]{kind=task, task.name=, task.id=18, loc.file="examples/tokio-task.rs", loc.line=14, loc.col=5} runtime.resource[274877906945]{concrete_type="Sleep", kind="timer", loc.file="examples/tokio-task.rs", loc.line=15, loc.col=9} new 2023-11-28T10:06:44.747539Z TRACE runtime.spawn[1]{kind=task, task.name=, task.id=18, loc.file="examples/tokio-task.rs", loc.line=14, loc.col=5} runtime.resource[274877906945]{concrete_type="Sleep", kind="timer", loc.file="examples/tokio-task.rs", loc.line=15, loc.col=9} enter 2023-11-28T10:06:44.747683Z TRACE runtime.spawn[1]{kind=task, task.name=, task.id=18, loc.file="examples/tokio-task.rs", loc.line=14, loc.col=5} runtime.resource[274877906945]{concrete_type="Sleep", kind="timer", loc.file="examples/tokio-task.rs", loc.line=15, loc.col=9} runtime::resource::state_update: duration=101, duration.unit="ms", duration.op="override" 2023-11-28T10:06:44.747854Z TRACE runtime.spawn[1]{kind=task, task.name=, task.id=18, loc.file="examples/tokio-task.rs", loc.line=14, loc.col=5} runtime.resource[274877906945]{concrete_type="Sleep", kind="timer", loc.file="examples/tokio-task.rs", loc.line=15, loc.col=9} runtime.resource.async_op[274877906946]{source="Sleep::new_timeout"} new 2023-11-28T10:06:44.747991Z TRACE runtime.spawn[1]{kind=task, task.name=, task.id=18, loc.file="examples/tokio-task.rs", loc.line=14, loc.col=5} runtime.resource[274877906945]{concrete_type="Sleep", kind="timer", loc.file="examples/tokio-task.rs", loc.line=15, loc.col=9} exit 2023-11-28T10:06:44.748118Z TRACE runtime.spawn[1]{kind=task, task.name=, task.id=18, loc.file="examples/tokio-task.rs", loc.line=14, loc.col=5} runtime.resource[274877906945]{concrete_type="Sleep", kind="timer", loc.file="examples/tokio-task.rs", loc.line=15, loc.col=9} runtime.resource.async_op[274877906946]{source="Sleep::new_timeout"} enter 2023-11-28T10:06:44.748196Z TRACE runtime.spawn[1]{kind=task, task.name=, task.id=18, loc.file="examples/tokio-task.rs", loc.line=14, loc.col=5} runtime.resource[274877906945]{concrete_type="Sleep", kind="timer", loc.file="examples/tokio-task.rs", loc.line=15, loc.col=9} runtime.resource.async_op[274877906946]{source="Sleep::new_timeout"} runtime.resource.async_op.poll[274877906947]{} new
ari-subscriber
is built on top of tracing-subscriber
and uses its registry (as do the majority
of tracing
subscribers). It offers an alternative to the fmt::Subscriber
and underlying
fmt::Layer
in that crate.
If you are in doubt about which format subscriber to use, pick the one from
tracing-subscriber
. It is more flexible and without a doubt, much more performant.
You would only use the ari-subscriber
format Layer
if you have a specific need to visualize
the tracing instrumentation built into Tokio.
ari-subscriber
is built against the latest stable release. The minimum supported version is
1.65. The current version of ari-subscriber
is not guaranteed to build on Rust versions earlier
than the minimum supported version.
This project is licensed under the MIT license.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion
in ari-subscriber
by you, shall be licensed as MIT, without any additional terms or conditions.