rogercoll/eprofiler-tui

eBPF profiler flamegraph based TUI 🐧🐝

Rust

94

66 commits

updated Oct 12, 2026

See the code

README

eprofiler-tui

CI Dependency status

A terminal-based flamegraph viewer that receives profiling data via an OTLP gRPC endpoint and renders a live, interactive flamegraph in the terminal. It can be used to visualize profiling data generated by opentelemetry-ebpf-profiler.

Features

  • OTLP gRPC profiles receiver (default 0.0.0.0:4317, configurable via --port)
  • Live icicle-style flamegraph
  • Stable frame colors: the hue comes from the runtime (Go, JVM, Python, Kernel, etc.), application code is vivid while runtime and system code is pastel, and frames with more self time are brighter
  • Freeze/live toggle to pause updates for smooth navigation
  • Detail bar showing the selected frame's runtime and origin (e.g. Go · runtime)
  • Stacks grouped by thread, using the thread.name sample attribute
  • Keyboard-driven navigation and zoom
  • Thread search (/) with substring filtering
  • Experimental: Flamescope tab (https://www.brendangregg.com/flamescope.html)
  • Experimental: Executables tab to load debug symbols from ELF/DWARF binaries for inline-aware symbolization. Symbols are kept in a persistent LSM-tree store, so they survive restarts

Demo

Installation

You don't need a Rust toolchain to try it out. Just run eprofiler-tui with Docker or Podman:

podman run -it -p 4317:4317 ghcr.io/rogercoll/eprofiler-tui:latest --data-dir /tmp

Replace podman with docker if preferred.

Alternatively, install from source with Cargo:

cargo install --git https://github.com/rogercoll/eprofiler-tui

Usage

The TUI will start and listen for OTLP profile data on port 4317. Point your OpenTelemetry profiling agent at localhost:4317.

To use a different port:

# With Cargo install:
eprofiler-tui --port 4318
OptionDescription
-p, --port <PORT>OTLP gRPC listen port (default: 4317)
-d, --data-dir <PATH>Symbol store directory (default: ~/.local/share/eprofiler-tui on Linux, ~/Library/Application Support/eprofiler-tui on macOS)
-h, --helpPrint help

Debug mode

A standalone profile inspector for troubleshooting profiling pipelines. It receives OTLP profiles on a gRPC endpoint and displays each ExportProfilesServiceRequest as a paginated, color-coded view of the raw data: dictionary tables, resource attributes, scope metadata, profile fields, and fully resolved sample stacks.

eprofiler-tui debug
eprofiler-tui debug --port 4318

Debug-Demo

Navigate between requests like pages in a book with h/l. Each page shows the complete request: string table, mapping table, attribute table, function table, resource attributes, scope info, profile metadata, and every sample with its stack trace rendered as a tree with frame-type colors.

KeyAction
h / ← l / →Previous / next request
j / ↓ k / ↑Scroll down / up
d / uPage down / up
g / GJump to first / last request
/Search within current request
n / NNext / previous match
qQuit

Building

Requires Rust 2024 edition and protobuf definitions from the opentelemetry-proto submodule.

The symbolization feature (symblib) pulls in native C/C++ dependencies that need extra build tools:

  • cmake and make, used by the zydis disassembler crate
  • g++ (or any C++ compiler) to build the C sources bundled with zydis
  • protobuf-compiler (protoc), used by prost-build to compile .proto definitions inside symblib
git submodule update --init
cargo build --release

Keybindings

Global: Tab switch tab, Ctrl-c / q quit.

Flamegraph tab

KeyAction
f / SpaceToggle freeze/live mode
j / ↓ k / ↑Navigate depth
h / ← l / →Navigate siblings
Enter / Esc (or Backspace)Zoom in / out
/Search threads
rReset

Flamescope tab (experimental)

KeyAction
h / ← l / →Move between columns (pauses auto-scroll)
j / ↓ k / ↑Move between rows
G / EndResume auto-scroll
/Filter by thread
EscClear thread filter and resume auto-scroll
rReset

Executables tab (experimental, still being tested and might be removed to keep things simple)

KeyAction
j / ↓ k / ↑Navigate list
EnterLoad symbols for selected executable
/Add new executable by path
rRemove loaded symbols

rogercoll/eprofiler-tui

eBPF profiler flamegraph based TUI 🐧🐝

Rust

94

66 commits

updated Oct 12, 2026

See the code

README

eprofiler-tui

CI Dependency status

A terminal-based flamegraph viewer that receives profiling data via an OTLP gRPC endpoint and renders a live, interactive flamegraph in the terminal. It can be used to visualize profiling data generated by opentelemetry-ebpf-profiler.

Features

  • OTLP gRPC profiles receiver (default 0.0.0.0:4317, configurable via --port)
  • Live icicle-style flamegraph
  • Stable frame colors: the hue comes from the runtime (Go, JVM, Python, Kernel, etc.), application code is vivid while runtime and system code is pastel, and frames with more self time are brighter
  • Freeze/live toggle to pause updates for smooth navigation
  • Detail bar showing the selected frame's runtime and origin (e.g. Go · runtime)
  • Stacks grouped by thread, using the thread.name sample attribute
  • Keyboard-driven navigation and zoom
  • Thread search (/) with substring filtering
  • Experimental: Flamescope tab (https://www.brendangregg.com/flamescope.html)
  • Experimental: Executables tab to load debug symbols from ELF/DWARF binaries for inline-aware symbolization. Symbols are kept in a persistent LSM-tree store, so they survive restarts

Demo

Installation

You don't need a Rust toolchain to try it out. Just run eprofiler-tui with Docker or Podman:

podman run -it -p 4317:4317 ghcr.io/rogercoll/eprofiler-tui:latest --data-dir /tmp

Replace podman with docker if preferred.

Alternatively, install from source with Cargo:

cargo install --git https://github.com/rogercoll/eprofiler-tui

Usage

The TUI will start and listen for OTLP profile data on port 4317. Point your OpenTelemetry profiling agent at localhost:4317.

To use a different port:

# With Cargo install:
eprofiler-tui --port 4318
OptionDescription
-p, --port <PORT>OTLP gRPC listen port (default: 4317)
-d, --data-dir <PATH>Symbol store directory (default: ~/.local/share/eprofiler-tui on Linux, ~/Library/Application Support/eprofiler-tui on macOS)
-h, --helpPrint help

Debug mode

A standalone profile inspector for troubleshooting profiling pipelines. It receives OTLP profiles on a gRPC endpoint and displays each ExportProfilesServiceRequest as a paginated, color-coded view of the raw data: dictionary tables, resource attributes, scope metadata, profile fields, and fully resolved sample stacks.

eprofiler-tui debug
eprofiler-tui debug --port 4318

Debug-Demo

Navigate between requests like pages in a book with h/l. Each page shows the complete request: string table, mapping table, attribute table, function table, resource attributes, scope info, profile metadata, and every sample with its stack trace rendered as a tree with frame-type colors.

KeyAction
h / ← l / →Previous / next request
j / ↓ k / ↑Scroll down / up
d / uPage down / up
g / GJump to first / last request
/Search within current request
n / NNext / previous match
qQuit

Building

Requires Rust 2024 edition and protobuf definitions from the opentelemetry-proto submodule.

The symbolization feature (symblib) pulls in native C/C++ dependencies that need extra build tools:

  • cmake and make, used by the zydis disassembler crate
  • g++ (or any C++ compiler) to build the C sources bundled with zydis
  • protobuf-compiler (protoc), used by prost-build to compile .proto definitions inside symblib
git submodule update --init
cargo build --release

Keybindings

Global: Tab switch tab, Ctrl-c / q quit.

Flamegraph tab

KeyAction
f / SpaceToggle freeze/live mode
j / ↓ k / ↑Navigate depth
h / ← l / →Navigate siblings
Enter / Esc (or Backspace)Zoom in / out
/Search threads
rReset

Flamescope tab (experimental)

KeyAction
h / ← l / →Move between columns (pauses auto-scroll)
j / ↓ k / ↑Move between rows
G / EndResume auto-scroll
/Filter by thread
EscClear thread filter and resume auto-scroll
rReset

Executables tab (experimental, still being tested and might be removed to keep things simple)

KeyAction
j / ↓ k / ↑Navigate list
EnterLoad symbols for selected executable
/Add new executable by path
rRemove loaded symbols

Significant stargazers

Felix Geisendörfer

4,241 followers · starred Feb 2026

Christian Simon

123 followers · starred Feb 2026

Ivan Babrou

298 followers · starred Feb 2026

Toby Lawrence

157 followers · starred Feb 2026