Console Dev Diary #1

September 8, 2021

Since the start of a Tokio Console prototype a few months ago, we've been hard at work turning it into an awesome async task debugger. We wanted to provide some concentrated updates around how it's been progressing.

What's the Console?

wow! whoa! it's like top(1) for tasks!

The Console is a Rust async debugging tool. The goal is to make the tool you reach for when trying to better understand how your async tasks are behaving. It makes use of tracing events and spans, and thus is aimed at being runtime-agnostic.

Updates

Easy init and Builder: We made it way easier to add instrumentation to your app. For most, simply adding console_subscriber::init() to the top of your main function is enough! It will use sensible defaults, checking some environment variables for customization and build an isolated subscriber. There's also a convenient console_subscriber::Builder API if you need more control integrating with existing tracing or runtimes.

task list screenshot

Everything is prettier! The main list view looks a lot better. We made task "names" a first-class thing, getting their own column in the list. Task IDs were made prettier and more consistent with what a user would expect. There's better better color and UTF-8 usage, which by default checks what the terminal supports. For example, fields displaying durations use a subtlely different color for different magnitudes (nanoseconds vs milliseconds vs seconds).

task details screenshot

You can select a task to see a "Task Details" view. This includes more details and metrics about that task. There's a graphed histogram of all the poll times for the task, letting you see how long your tasks take to do work before yielding. There's also information about how many times a task has been woken, which you can compare with the number of times polled, as well as time since the last wake call.

Temporality: After talking with users, we prioritized some "time control" features for the console. We've so far implemented the ability to pause the console (and still explore the existing tasks), and then resume back to "live". There's now an option to record all relevant events to a file on disk, with the goal of being able to replay that file in the console.

Video Demo: We put together a demo showing off the console, and how to use it to debug some common task misbehaviors.

Thanks to...

  • Eliza Weisman
  • Sean McArthur
  • Zahari Dichev
  • Oğuz Bilgener
  • @gneito
  • @memoryruins
  • Jacob Rothstein
  • Artem Vorotnikov
  • David Barsky
  • Wu Aoxiang

We also want to thank all of you have been trying it out in your applications and giving us valuable feedback!

There's plenty more to be done. Want to join us?