Skip to main content

Interactive TUI Monitor

async-inspect includes a powerful Terminal User Interface (TUI) for real-time monitoring of async tasks, similar to htop for processes.

Features​

The TUI provides:

  • Real-time task monitoring - See tasks as they spawn, run, and complete
  • Multiple view modes - Switch between list and dependency graph views
  • Advanced filtering - Filter by state and search by name/ID
  • Interactive search - Type-to-search functionality
  • Mouse support - Scroll wheel navigation
  • Data export - Export data directly from the TUI
  • Customizable sorting - Sort by ID, name, duration, state, or poll count

Running the TUI​

From Code​

use async_inspect::prelude::*;
use async_inspect::tui::run_tui;

#[tokio::main]
async fn main() -> std::io::Result<()> {
// Your async code here...

// Launch the TUI
run_tui(Inspector::global().clone())?;

Ok(())
}

Example​

Run the example to see the TUI in action:

cargo run --example tui_monitor --features cli

Keyboard Shortcuts​

KeyAction
qQuit the application
h or ?Toggle help screen
↑/↓Navigate task list
rReset selection to top

View & Display​

KeyAction
vToggle view mode (List ↔ Dependency Graph)
sCycle sort mode (ID → Name → Duration → State → Polls)
fCycle filter mode (All → Running → Completed → Failed → Blocked)

Search & Export​

KeyAction
/Activate search mode
cClear search query
ESCExit search mode (while searching)
eExport data (JSON, CSV, Chrome Trace)

Mouse​

ActionResult
Scroll wheel upNavigate up
Scroll wheel downNavigate down

View Modes​

Task List View​

The default view shows a sortable table of all tasks:

┌────────────────────────────────────────────────────────────────┐
│ Tasks (Sort: Duration | Filter: All) - 42 shown │
├────────────────────────────────────────────────────────────────┤
│ ID │ Name │ State │ Duration │ Polls │
├────────────────────────────────────────────────────────────────┤
│ #1 │ fetch_user_data │ RUNNING │ 234.5ms │ 3 │
│ #2 │ process_request │ BLOCKED │ 156.2ms │ 2 │
│ #3 │ cache_write │ DONE │ 45.3ms │ 1 │
└────────────────────────────────────────────────────────────────┘

Features:

  • Color-coded states (Blue=Running, Yellow=Blocked, Green=Done, Red=Failed)
  • Sortable by any column
  • Shows poll count and runtime
  • Highlighted selection

Dependency Graph View​

Press v to switch to the dependency graph view, which shows parent-child task relationships:

┌────────────────────────────────────────────────────────────────┐
│ Dependency Graph - 42 tasks │
├────────────────────────────────────────────────────────────────┤
│ ID │ Task Tree │ State │ Duration │
├────────────────────────────────────────────────────────────────┤
│ #1 │ main_task │ DONE │ 500.2ms │
│ #2 │ └─ fetch_user_data │ RUNNING │ 234.5ms │
│ #3 │ └─ http_get │ DONE │ 200.1ms │
│ #4 │ └─ process_data │ DONE │ 100.3ms │
└────────────────────────────────────────────────────────────────┘

Features:

  • Hierarchical tree structure
  • Shows parent-child relationships
  • Indentation shows nesting level
  • Same color coding as list view

Search Functionality​

Press / to activate search mode:

┌────────────────────────────────────────────────────────────────┐
│ Search │
├────────────────────────────────────────────────────────────────┤
│ Search: fetch█ │
└────────────────────────────────────────────────────────────────┘
  • Type to filter tasks in real-time
  • Searches task names and IDs
  • Press Enter to deactivate search (keeps filter)
  • Press ESC to cancel and clear search
  • Press c to clear search query

Filtering & Sorting​

Filter Modes​

Press f to cycle through filter modes:

  1. All - Show all tasks
  2. Running - Show only currently running tasks
  3. Completed - Show only completed tasks
  4. Failed - Show only failed tasks
  5. Blocked - Show only blocked tasks

Sort Modes​

Press s to cycle through sort modes:

  1. ID - Sort by task ID (ascending)
  2. Name - Sort alphabetically by task name
  3. Duration - Sort by total duration (slowest first)
  4. State - Sort by task state
  5. PollCount - Sort by poll count (most active first)

Export Functionality​

Press e to export current data to tui_exports/ directory.

Exports include:

  • JSON - Full task and event data
  • CSV - Tasks and events in separate files
  • Chrome Trace - Compatible with chrome://tracing

Files are timestamped, e.g.:

tui_exports/
├── export_1706024400.json
├── tasks_1706024400.csv
├── events_1706024400.csv
└── trace_1706024400.json

After exporting, you can:

# View in chrome://tracing
# 1. Open Chrome
# 2. Navigate to chrome://tracing
# 3. Click "Load" and select trace_*.json

# Analyze with jq
jq '.tasks | map(.duration_ms) | add / length' tui_exports/export_*.json

# Import to pandas
import pandas as pd
df = pd.read_csv('tui_exports/tasks_*.csv')

Statistics Panel​

The TUI displays real-time statistics at the top:

┌────────────────────────────────────────────────────────────────┐
│ Statistics │
├────────────────────────────────────────────────────────────────┤
│ Total: 142 Running: 8 Blocked: 2 │
│ Completed: 130 Failed: 2 Events: 456 │
│ Duration: 12.34s │
└────────────────────────────────────────────────────────────────┘

Help Screen​

Press h or ? to view the full help screen with all keyboard shortcuts and features.

Performance​

The TUI is designed for minimal overhead:

  • Update rate: 100ms (configurable)
  • Memory: ~1MB overhead
  • CPU: Less than 1% on typical workloads
  • Supported tasks: Tested with 10,000+ concurrent tasks

Customization​

You can customize the update interval:

use async_inspect::tui::TuiApp;
use std::time::Duration;

let mut app = TuiApp::new(inspector);
app.set_update_interval(Duration::from_millis(50)); // Faster updates

Tips & Tricks​

  1. Performance Debugging

    • Sort by Duration to find slow tasks
    • Sort by PollCount to find busy tasks
    • Use Blocked filter to find waiting tasks
  2. Hierarchy Analysis

    • Switch to Dependency Graph view
    • Look for deep nesting (potential issue)
    • Identify orphaned tasks
  3. Search Patterns

    • Search by ID: #42
    • Search by prefix: fetch
    • Search by pattern: worker_
  4. Export for Analysis

    • Export before closing TUI
    • Use Chrome Trace for timeline view
    • Use CSV for statistical analysis

Troubleshooting​

TUI Not Starting​

Error: Device not configured

This error occurs when running in non-interactive mode (e.g., without a TTY). The TUI requires a real terminal to function.

Solution: Run in an interactive terminal, not via SSH without TTY or in background mode.

Mouse Not Working​

Problem: Mouse scroll doesn't navigate

Solution: Ensure your terminal supports mouse events. Most modern terminals (iTerm2, Windows Terminal, Alacritty) support this by default.

Display Issues​

Problem: Garbled or misaligned display

Solution:

  • Ensure terminal supports UTF-8
  • Resize terminal to at least 80x24
  • Use a monospace font

Next Steps​