#async #futures #metrics #debugging


Runtime and task level metrics for Tokio applications

3 releases (breaking)

0.2.0 Mar 6, 2023
0.1.0 Feb 18, 2022
0.0.0 Feb 17, 2022

#216 in Asynchronous

Download history 6420/week @ 2022-11-29 5657/week @ 2022-12-06 5132/week @ 2022-12-13 4337/week @ 2022-12-20 3438/week @ 2022-12-27 5705/week @ 2023-01-03 5707/week @ 2023-01-10 5280/week @ 2023-01-17 7478/week @ 2023-01-24 7507/week @ 2023-01-31 7846/week @ 2023-02-07 9110/week @ 2023-02-14 12263/week @ 2023-02-21 13082/week @ 2023-02-28 16520/week @ 2023-03-07 16848/week @ 2023-03-14

60,112 downloads per month
Used in 4 crates (3 directly)

MIT license

653 lines

Tokio Metrics

Provides utilities for collecting metrics from a Tokio application, including runtime and per-task metrics.

tokio-metrics = { version = "0.2.0", default-features = false }

Getting Started With Task Metrics

Use TaskMonitor to instrument tasks before spawning them, and to observe metrics for those tasks. All tasks instrumented with a given TaskMonitor aggregate their metrics together. To split out metrics for different tasks, use separate TaskMetrics instances.

// construct a TaskMonitor
let monitor = tokio_metrics::TaskMonitor::new();

// print task metrics every 500ms
    let frequency = std::time::Duration::from_millis(500);
    let monitor = monitor.clone();
    tokio::spawn(async move {
        for metrics in monitor.intervals() {
            println!("{:?}", metrics);

// instrument some tasks and spawn them
loop {

Task Metrics

Base Metrics

Derived Metrics

Getting Started With Runtime Metrics

This unstable functionality requires tokio_unstable, and the rt crate feature. To enable tokio_unstable, the --cfg tokio_unstable must be passed to rustc when compiling. You can do this by setting the RUSTFLAGS environment variable before compiling your application; e.g.:

RUSTFLAGS="--cfg tokio_unstable" cargo build

Or, by creating the file .cargo/config.toml in the root directory of your crate. If you're using a workspace, put this file in the root directory of your workspace instead.

rustflags = ["--cfg", "tokio_unstable"]
rustdocflags = ["--cfg", "tokio_unstable"] 

Putting .cargo/config.toml files below the workspace or crate root directory may lead to tools like Rust-Analyzer or VSCode not using your .cargo/config.toml since they invoke cargo from the workspace or crate root and cargo only looks for the .cargo directory in the current & parent directories. Cargo ignores configurations in child directories. More information about where cargo looks for configuration files can be found here.

Missing this configuration file during compilation will cause tokio-metrics to not work, and alternating between building with and without this configuration file included will cause full rebuilds of your project.

The rt feature of tokio-metrics is on by default; simply check that you do not set default-features = false when declaring it as a dependency; e.g.:

tokio-metrics = "0.2.0"

From within a Tokio runtime, use RuntimeMonitor to monitor key metrics of that runtime.

let handle = tokio::runtime::Handle::current();
let runtime_monitor = tokio_metrics::RuntimeMonitor::new(&handle);

// print runtime metrics every 500ms
let frequency = std::time::Duration::from_millis(500);
tokio::spawn(async move {
    for metrics in runtime_monitor.intervals() {
        println!("Metrics = {:?}", metrics);

// run some tasks

Runtime Metrics

Base Metrics

Derived Metrics

Relation to Tokio Console

Currently, Tokio Console is primarily intended for local debugging. Tokio metrics is intended to enable reporting of metrics in production to your preferred tools. Longer term, it is likely that tokio-metrics will merge with Tokio Console.


This project is licensed under the MIT license.


Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in tokio-metrics by you, shall be licensed as MIT, without any additional terms or conditions.


~105K SLoC