Peeka
中文 | English
Runtime diagnostics for Python applications. Peeka attaches to a running Python process and lets you observe function calls, traces, stacks, logs, memory, threads, and hot paths without changing application code.
It uses PEP 768 on Python 3.14+, with debugger-based fallback for Python 3.8.1-3.13.
Screenshots
| Dashboard | Watch | Trace |
|---|---|---|
Key Features
- Non-invasive - Inject observation logic at runtime and restore it on detach or reset.
- Real-time streaming - Stream observations over Unix domain sockets with low latency.
- Production-minded - Keep overhead bounded with fixed-size buffers and graceful recovery.
- Safe filtering - Evaluate conditions with
simpleevalinstead of Pythoneval. - Dual interface - Use JSONL CLI for agents and automation, or TUI for human exploration.
What Peeka Is For
- Inspect a live service when logs and metrics are not enough.
- Watch function inputs, return values, exceptions, and latency in real time.
- Trace call trees to find where time is spent inside one request or job.
- Capture call stacks, thread state, memory summaries, loggers, and runtime objects.
Two Interfaces
Peeka is designed for two different operators:
| Interface | Designed for | Why it exists |
|---|---|---|
| CLI | Agents and automation | Stable commands with JSONL output for scripts, pipelines, and coding agents |
| TUI | Humans | An interactive terminal workspace for exploring live diagnostics without building shell pipelines |
Install
# CLI only: best for agents, scripts, and headless environments.
pip install peeka
# CLI + TUI: best when a human will inspect the process interactively.
pip install "peeka[tui]"
Peeka supports Python 3.8.1+. The TUI requires Python 3.9+.
For Python 3.8.1-3.13, attaching needs debugger support: GDB on Linux or LLDB on macOS. On Linux, ptrace permissions must allow attaching to the target process.
Python Support
| Python version | CLI | TUI | Attach mechanism | Main dependency |
|---|---|---|---|---|
| 3.14+ | Yes | Yes | PEP 768 sys.remote_exec() |
Same UID or CAP_SYS_PTRACE |
| 3.9-3.13 | Yes | Yes | GDB on Linux, LLDB on macOS | Debugger support and attach permission |
| 3.8.1-3.8.x | Yes | No | GDB on Linux, LLDB on macOS | Debugger support and attach permission |
See the documentation for platform-specific setup and troubleshooting.
Quick Start
CLI for agents and automation
# Attach to a running Python process.
peeka-cli attach <pid>
# Observe function calls.
peeka-cli watch "module.Class.method" -n 5
# Trace a call tree.
peeka-cli trace "module.func"
The CLI emits structured JSONL, so agents and scripts can parse, filter, and persist observations reliably.
TUI for humans
# Launch the TUI.
peeka
The TUI provides an interactive dashboard for browsing watches, traces, stacks, memory, threads, logs, and other runtime views.
Patterns use fully qualified function names such as module.function or module.Class.method.
Core Commands
| Command | Purpose |
|---|---|
attach / detach |
Connect to or leave a target process |
watch |
Observe function arguments, return values, exceptions, and latency |
trace |
Trace nested calls and timing breakdowns |
stack |
Capture call stacks at function entry |
monitor / top |
Inspect periodic metrics and hot functions |
memory / thread / logger |
Inspect runtime memory, threads, and loggers |
inspect / sc / sm |
Inspect objects and search classes or methods |
reset |
Remove injected observations and restore wrapped functions |
run |
Start a script with Peeka injected from launch |
Gevent Compatibility
Peeka separates its gevent support into two layers:
- Control plane: attach, the in-process agent socket, RPL primitives, and
patch-status. This layer avoids target-process monkey-patched socket/threading primitives. - Data plane: observation commands such as
traceandtop. These commands report their gevent compatibility in JSONLmetafields when runtime behavior is degraded.
| Command | No gevent | gevent imported | gevent patched / active hub |
|---|---|---|---|
watch |
safe | safe | safe |
monitor |
safe | safe | safe |
stack |
safe | safe | safe |
trace |
full trace backend | full trace backend | degraded to wrapper_only |
top |
frame-walk sampling | frame-walk sampling | greenlet_aware_sampling with greenlet_blind meta |
When Peeka detects gevent monkey patching, affected JSONL records include metadata such as:
{
"meta": {
"gevent_state": "patched",
"backend": "wrapper_only",
"greenlet_blind": false,
"degraded_reason": "sys.settrace under gevent can violate frame stack invariants; using wrapper-only tracing without recursive call tree"
}
}
For gevent targets, prefer watch when wrapper-level entry/exit observations are enough. trace remains available, but under patched gevent it uses wrapper-only tracing instead of recursive sys.settrace call trees. top remains available through a chained greenlet.settrace backend that preserves any existing greenlet tracer, while still marking greenlet_blind because suspended greenlets cannot be fully enumerated.
Read More
- Documentation - command reference, TUI usage, installation details, and troubleshooting.
- Scenario guide - practical debugging walkthroughs.
- Demo guide - command-by-command examples against the demo app.
- Attach internals - how Peeka injects diagnostics into a running Python interpreter.
- Roadmap - planned work and product direction.
License
Apache License 2.0
Acknowledgments
- Inspired by Alibaba Arthas
- Safe expression evaluation powered by simpleeval
- Python 3.14+ attach path based on PEP 768
Metadata
Release files for peeka 0.1.20
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| peeka-0.1.20.tar.gz | 235.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| peeka-0.1.20-cp312-cp312-manylinux_2_34_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.34+ x86-64 | Details |
Total release size: 548.5 kB
Release files / peeka-0.1.20.tar.gz
| Download URL | peeka-0.1.20.tar.gz |
|---|---|
| Size | 235.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a4eff1eadaf7ec5930a88dc42d29ca28fa7ed008191f4b5cee34122bdf027189
|
|
BLAKE2b-256 checksum How to use checksums |
c59611c8c7e0b1c401ee80f5493b469d5613a6503c2ebd7bcee0abc9bf581746
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 5, 2026.
Transparency logRelease files / peeka-0.1.20-cp312-cp312-manylinux_2_34_x86_64.whl
| Download URL | peeka-0.1.20-cp312-cp312-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 312.7 kB |
| Tags | CPython 3.12 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
202b645404badb343e09769bc8ebde2dd59ed2ec0e9b8c2fd36423cfa3bd602f
|
|
BLAKE2b-256 checksum How to use checksums |
ddf237911e46a7527cd60c27599194f332f6b07d49985d7be0acf0182d632b2c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 5, 2026.
Transparency log