Skip to main content

A lightweight Celery task flow visualizer

Project description

stemtrace ๐ŸŒฟ

Zero-infrastructure Celery task flow visualizer

PyPI version Python CI codecov License: MIT Code style: ruff Type checked: mypy


Flower shows you what exists. Stemtrace shows you what happened.

Ever stared at a failed Celery task wondering "what called this?" or "why did it retry 5 times?"

Stemtrace captures your task executions as a graph โ€” visualize parentโ†’child flows, see retry chains, track groups and chords, all without adding any new infrastructure. Just your existing Redis broker.

โœจ Features

See What Happened

  • Task Flow Graphs โ€” Visualize chains, groups, and chords as interactive DAGs
  • Execution Timeline โ€” Track queued โ†’ started โ†’ retried โ†’ finished states
  • Arguments & Results โ€” Inspect inputs, outputs, and exceptions
  • Retry Chains โ€” Understand exactly when and why retries happened

Canvas Support

  • Groups & Chords โ€” Automatic visualization of group() and chord() patterns
  • Parent-Child Tracking โ€” See which task spawned which

Production Ready

  • Zero Infrastructure โ€” Uses your existing Redis broker, no database needed
  • Sensitive Data Scrubbing โ€” Passwords and API keys filtered automatically
  • Read-Only โ€” Safe for production; never modifies your task queue
  • FastAPI Integration โ€” Mount into your existing app with one line

๐Ÿš€ Quick Start

1. Install

pip install stemtrace

2. Instrument your Celery app

from celery import Celery
import stemtrace

app = Celery("myapp", broker="redis://localhost:6379/0")

# One line to enable flow tracking
stemtrace.init(app)

3. View the dashboard

Option A: Standalone server (new container/process)

stemtrace server

Open http://localhost:8000.

Option B: Embed in your FastAPI app (no extra container)

from fastapi import FastAPI
from stemtrace.server import StemtraceExtension

flow = StemtraceExtension(broker_url="redis://localhost:6379/0")
app = FastAPI(lifespan=flow.lifespan)
app.include_router(flow.router, prefix="/stemtrace")

Access at /stemtrace/ in your existing app โ€” no new services to deploy.

See Deployment Options for auth, scaling, and more.

๐Ÿ“ฆ Architecture

stemtrace is designed as two decoupled components:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                        Your Application                          โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”‚
โ”‚  โ”‚ Celery Workerโ”‚    โ”‚ Celery Workerโ”‚    โ”‚ Celery Workerโ”‚        โ”‚
โ”‚  โ”‚ + stemtrace  โ”‚    โ”‚ + stemtrace  โ”‚    โ”‚ + stemtrace  โ”‚        โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ”‚
โ”‚         โ”‚                   โ”‚                   โ”‚                โ”‚
โ”‚         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                โ”‚
โ”‚                             โ”‚ events                             โ”‚
โ”‚                             โ–ผ                                    โ”‚
โ”‚                     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                            โ”‚
โ”‚                     โ”‚    Broker     โ”‚                            โ”‚
โ”‚                     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                            โ”‚
โ”‚                             โ”‚                                    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                              โ”‚
                              โ–ผ
                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                    โ”‚    stemtrace      โ”‚
                    โ”‚  server (viewer)  โ”‚
                    โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
                    โ”‚  โ”‚   Web UI    โ”‚  โ”‚
                    โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Library (stemtrace)

  • Hooks into Celery signals
  • Captures task lifecycle events
  • Sends normalized events to the broker
  • Zero overhead in critical path โ€” fire-and-forget writes

Server (stemtrace server)

  • Reads events from the broker
  • Builds task graphs
  • Serves the web UI
  • Completely read-only โ€” safe for production

๐Ÿ”ง Configuration

Library Options

import stemtrace

stemtrace.init(
    app,
    # Optional: override broker URL (defaults to Celery's broker_url)
    transport_url="redis://localhost:6379/0",
    prefix="stemtrace",                        # Key/queue prefix
    ttl=86400,                                 # Event TTL in seconds (default: 24h)

    # Data capture (all enabled by default)
    capture_args=True,                         # Capture task args/kwargs
    capture_result=True,                       # Capture return values

    # Sensitive data scrubbing (Sentry-style)
    scrub_sensitive_data=True,                 # Scrub passwords, API keys, etc.
    additional_sensitive_keys=frozenset({"my_secret"}),  # Add custom keys
    safe_keys=frozenset({"public_key"}),       # Never scrub these keys
)

# Configuration also available via StemtraceConfig model:
# - max_data_size: Maximum serialized data size (default: 10KB)

# Introspection (after init)
stemtrace.is_initialized()   # -> True
stemtrace.get_config()       # -> StemtraceConfig
stemtrace.get_transport()    # -> EventTransport (for testing)

Sensitive Data Scrubbing

By default, stemtrace scrubs common sensitive keys from task arguments:

  • Passwords: password, passwd, pwd, secret
  • API keys: api_key, apikey, token, bearer, authorization
  • Financial: credit_card, cvv, ssn
  • Session: cookie, session, csrf

Scrubbed values appear as [Filtered] in the UI.

Canvas Graph Visualization

stemtrace automatically detects and visualizes Celery canvas constructs:

# Parent-spawned group: GROUP is child of parent
batch_processor
โ””โ”€โ”€ โ”Œโ”€ GROUP โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚  โ”œโ”€โ”€ add(1, 2)   โ”‚
    โ”‚  โ”œโ”€โ”€ add(3, 4)   โ”‚
    โ”‚  โ””โ”€โ”€ add(5, 6)   โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

# Standalone group: GROUP is a root node
โ”Œโ”€ GROUP โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  โ”œโ”€โ”€ add(1, 1)   โ”‚
โ”‚  โ”œโ”€โ”€ add(2, 2)   โ”‚
โ”‚  โ””โ”€โ”€ add(3, 3)   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

# Chord: header tasks inside, callback outside with edges
โ”Œโ”€ CHORD โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  โ”œโ”€โ”€ add(10, 10) โ”‚โ”€โ”€โ”
โ”‚  โ”œโ”€โ”€ add(20, 20) โ”‚โ”€โ”€โ”ผโ”€โ”€โ–บ aggregate_results
โ”‚  โ””โ”€โ”€ add(30, 30) โ”‚โ”€โ”€โ”˜
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  • Synthetic containers โ€” GROUP/CHORD nodes are always created when 2+ tasks share a group_id
  • Parent linking โ€” When spawned from a parent task, the container becomes a child of that parent
  • Chord callbacks โ€” Rendered outside the container with edges from each header task
  • Timing โ€” Each node displays start time and duration directly in the graph
  • Aggregate state โ€” Container shows running/success/failure based on member states

Environment Variables

Variable Description Default
STEMTRACE_BROKER_URL Broker connection URL Auto-detect from Celery
STEMTRACE_TTL Event TTL in seconds 86400
STEMTRACE_PREFIX Key/queue prefix stemtrace

Supported Brokers

Broker URL Scheme Status
Redis redis://, rediss:// โœ… Supported
RabbitMQ amqp://, amqps:// ๐Ÿšง Planned
Amazon SQS sqs:// ๐Ÿšง Planned

๐Ÿณ Docker

docker run -p 8000:8000 \
    -e STEMTRACE_BROKER_URL=redis://host.docker.internal:6379/0 \
    ghcr.io/iansokolskyi/stemtrace

Or with Docker Compose:

services:
  stemtrace:
    image: ghcr.io/iansokolskyi/stemtrace
    ports:
      - "8000:8000"
    environment:
      - STEMTRACE_BROKER_URL=redis://redis:6379/0

๐Ÿ–ฅ๏ธ Deployment Options

stemtrace offers two deployment modes depending on your needs:

Mode Best For Command
Standalone Server Dedicated monitoring, simple setup stemtrace server
FastAPI Embedded Single-app deployment, existing FastAPI apps StemtraceExtension

Option 1: Standalone Server (Recommended)

The simplest way to run stemtrace โ€” a dedicated monitoring service:

pip install stemtrace

stemtrace server

Open http://localhost:8000 to view the dashboard.

Server Options

stemtrace server \
    --broker-url redis://myredis:6379/0 \
    --host 0.0.0.0 \
    --port 8000 \
    --reload  # For development

High-Scale Production Setup

For high-throughput environments, run the consumer separately from the web server:

# Terminal 1: Run consumer (processes events)
stemtrace consume

# Terminal 2: Run API server (separate process, shares state via broker)
stemtrace server

Option 2: FastAPI Embedded

Mount stemtrace directly into your existing FastAPI application:

from fastapi import FastAPI
from stemtrace.server import StemtraceExtension

flow = StemtraceExtension(
    broker_url="redis://localhost:6379/0",
    # Optional configuration:
    # embedded_consumer=True,  # Run consumer in FastAPI process (default)
    # serve_ui=True,           # Serve React UI (default)
    # prefix="stemtrace",      # Redis key prefix
    # ttl=86400,               # Event TTL in seconds
    # max_nodes=10000,         # Max nodes to keep in memory
)
app = FastAPI(lifespan=flow.lifespan)
app.include_router(flow.router, prefix="/stemtrace")

Access the dashboard at /stemtrace/ within your app.

With Custom Authentication

Use your existing auth middleware:

from fastapi import Depends
from stemtrace.server import StemtraceExtension
from your_app.auth import require_admin

flow = StemtraceExtension(
    broker_url="redis://localhost:6379/0",
    auth_dependency=Depends(require_admin),
)
app = FastAPI(lifespan=flow.lifespan)
app.include_router(flow.router, prefix="/stemtrace")

Or use built-in auth helpers:

from stemtrace.server import StemtraceExtension, require_basic_auth

flow = StemtraceExtension(
    broker_url="redis://localhost:6379/0",
    auth_dependency=require_basic_auth("admin", "secret"),
)
app = FastAPI(lifespan=flow.lifespan)
app.include_router(flow.router, prefix="/stemtrace")

Embedded Consumer Modes

Mode Use Case Setup
Embedded Development, simple apps Default โ€” consumer runs in FastAPI process
External Production, high scale Run stemtrace consume separately

๐Ÿ—บ๏ธ Roadmap

What's Working Now

  • โœ… Task flow graphs โ€” Visualize chains, groups, and chords as DAGs
  • โœ… Full lifecycle tracking โ€” PENDING โ†’ RECEIVED โ†’ STARTED โ†’ SUCCESS/FAILURE
  • โœ… Canvas awareness โ€” Automatic GROUP/CHORD node visualization
  • โœ… Arguments & results โ€” View inputs, outputs, and exceptions
  • โœ… Sensitive data scrubbing โ€” Passwords and API keys filtered automatically
  • โœ… Real-time updates โ€” WebSocket-powered live dashboard
  • โœ… FastAPI integration โ€” Mount into your existing app
  • โœ… Task registry โ€” Browse all discovered task definitions

Coming Soon

  • ๐Ÿ”œ RabbitMQ support โ€” Use your existing RabbitMQ broker
  • ๐Ÿ”œ Worker monitoring โ€” See which worker processed each task
  • ๐Ÿ”œ Anomaly detection โ€” Spot stuck, orphaned, or failed tasks
  • ๐Ÿ”œ Dashboard with stats โ€” Success rates, durations, failure trends
  • ๐Ÿ”œ OpenTelemetry export โ€” Send traces to Jaeger, Tempo, Datadog
  • ๐Ÿ”œ Webhook notifications โ€” Push events to your systems
  • ๐Ÿ”œ Data export โ€” Download execution history as JSON

๐Ÿค Contributing

Contributions, bug reports, and feature requests are welcome! This is a community project โ€” if stemtrace helps you debug Celery, consider helping make it better.

See our Contributing Guide to get started.

git clone https://github.com/iansokolskyi/stemtrace.git
cd stemtrace
uv sync --all-extras  # Install dependencies
make check            # Run tests

๐Ÿ“„ License

MIT โ€” use it however you like.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stemtrace-0.1.1.tar.gz (257.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

stemtrace-0.1.1-py3-none-any.whl (322.3 kB view details)

Uploaded Python 3

File details

Details for the file stemtrace-0.1.1.tar.gz.

File metadata

  • Download URL: stemtrace-0.1.1.tar.gz
  • Upload date:
  • Size: 257.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for stemtrace-0.1.1.tar.gz
Algorithm Hash digest
SHA256 60b487bcf26b641c0fd1ac03118cfc66a6ae47c8d0eebb078901d963a0fd0e40
MD5 0c2801ac043ab7ab92a46bbd98b2b578
BLAKE2b-256 8730b489697bf534b31baf4ea94c530289a7b0a7f04f7be693d1da6fd4fb528d

See more details on using hashes here.

Provenance

The following attestation bundles were made for stemtrace-0.1.1.tar.gz:

Publisher: release.yml on iansokolskyi/stemtrace

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file stemtrace-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: stemtrace-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 322.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for stemtrace-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a6ba2344afa33a89d91bc29c0596d4d39c00d03276c81f69d3605270c9fec6c0
MD5 a5e75ceac150e116cc47e8fe73f6f61a
BLAKE2b-256 b3de5d9219ea47b0af732a35bba67b7ab8695925c779412319a7354cea883dc0

See more details on using hashes here.

Provenance

The following attestation bundles were made for stemtrace-0.1.1-py3-none-any.whl:

Publisher: release.yml on iansokolskyi/stemtrace

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page