a low level monitoring tool
See the codeLive causal graph for async services.
OriginTracer instruments your full production stack - nginx --> gunicorn --> asynico --> uvicorn --> django/fastapi --> celery - to reveal why execution flowed the way it did, not just that it was slow. It builds a real-time causal graph, automatically detects anti-patterns, and lets you query the live system with REPL commands like BLAME, DIFF SINCE deployment, or CAUSAL.
It combines:
The result: actionable insight into async behavior, cross-process flows, and hidden latency sources that traditional tracing often misses.
Vist the website for more details and traced chapters - origintracer.app
Most observability tools show you what happened (spans, metrics, logs). OriginTracer shows why - the causal relationships across layers, including kernel-level events.
OriginTracer’s core engine is completely language-agnostic. It only understands a clean, normalized event protocol (NormalizedEvent). The graph, deduplication, causal rules, REPL, and UI have no idea whether events came from Python, Node.js, or another language.
This design makes OriginTracer uniquely positioned as a unified causal observability backend.
You can already start building probes for Node.js services (Express, Fastify, NestJS, etc.). A Node.js probe can:
Official Node.js probes (covering Express/Fastify middleware, async context tracking, event loop delays, etc.) are in the roadmap.
If you want to help accelerate this, the open engine and clear event protocol make experimentation straightforward.
git clone https://github.com/Humbulani1234/origintracer.git
cd origintracer
pip install -e .
Navigate to the applications/django directory for this specific application.
This is a fully OriginTracer already configured Django example application. The following steps detail how it was configured and the steps to follow for your application.
1. Add middleware (must be first in settings.py):
MIDDLEWARE = [
"origintracer.probes.django_probe.TracerMiddleware", # required for trace_id propagation
"django.middleware.security.SecurityMiddleware",
# ...
]
2. Create origintracer.yaml in your project root:
probes:
- django
- asyncio
- gunicorn # available on origintracer.app
- uvicorn # available on origintracer.app
- nginx # available on origintracer.app
3. Initialize in apps.py:
from django.apps import AppConfig
class MyAppConfig(AppConfig):
name = "myapp"
def ready(self):
import origintracer
origintracer.init(debug=True, config=BASE_DIR / "origintracer.yaml")
4. Run your app:
gunicorn -c gunicorn.conf.py config.asgi:application \
--worker-class uvicorn.workers.UvicornWorker
Send requests to your views using the provided load_test and burst_test scripts and explore the results with the REPL.
Open the REPL:
python -m origintracer.repl.repl
Try:
SHOW nodesSHOW edgesCAUSAL\stitch <trace_id> (merges across processes)Similar to the Django application above. Navigate to the applications/celery directory for this specific application, and follow the steps.
NormalizedEvent objects. The engine never touches probes, and probes never block application code.mark_deployment()), and rules that compare against historical behavior.yourapp/origintracer/probes/*.py and rules/*.py. Write once, register via a simple register(registry) function.Built-in:
_run_once, selector events - makes event loop starvation visibleAdvanced - available on origintracer.app:
Custom probes follow the same BaseProbe pattern and are auto-discovered.
Place files in yourapp/origintracer/probes/myprobe.py:
from origintracer.sdk.base_probe import BaseProbe
from origintracer.sdk.emitter import emit
from origintracer.core.event_schema import NormalizedEvent, ProbeTypes
ProbeTypes.register("celery.task.start", "Celery task started")
class CeleryProbe(BaseProbe):
name = "celery"
def start(self):
from celery.signals import task_prerun, task_postrun
task_prerun.connect(self._on_start, weak=False)
# ...
def _on_start(self, task_id, task, **kwargs):
emit(NormalizedEvent.now(
probe="celery.task.start",
trace_id=...,
service="celery",
name=task.name,
# ...
))
Place in yourapp/origintracer/rules/myrules.py:
from origintracer.core.causal import CausalRule, PatternRegistry
def register(registry: PatternRegistry):
registry.register(CausalRule(
name="sync_db_in_celery",
description="Celery task making blocking DB calls",
tags=["celery", "blocking"],
predicate=_detect_blocking_db,
confidence=0.85,
))
Rules receive the live graph and can emit evidence with confidence scores.
OriginTracer is engineered for early production workloads, not just local debugging.
ok=4000 err=0 dropped=0)buf_depth=0 and in_flight=0 after every wave - no backpressure observed.These results demonstrate that OriginTracer delivers deep cross-layer visibility (kernel timings, nginx internals, asyncio behavior, causal relationships) while staying production-viable. The only notable deployment consideration is elevated privileges for full eBPF mode.
This level of stability gives strong confidence for running OriginTracer alongside real traffic.
pip install -e ".[dev]"
pytest origintracer/tests/ -q
pre-commit install
See docs/ for full architecture, probe internals, and contribution guidelines.
Made for engineers who want to move beyond "it's slow" to "here's exactly why - and how to fix it."
Questions or ideas? reach out via the site
Python
94.5%
JavaScript
5.0%
a low level monitoring tool
See the codeLive causal graph for async services.
OriginTracer instruments your full production stack - nginx --> gunicorn --> asynico --> uvicorn --> django/fastapi --> celery - to reveal why execution flowed the way it did, not just that it was slow. It builds a real-time causal graph, automatically detects anti-patterns, and lets you query the live system with REPL commands like BLAME, DIFF SINCE deployment, or CAUSAL.
It combines:
The result: actionable insight into async behavior, cross-process flows, and hidden latency sources that traditional tracing often misses.
Vist the website for more details and traced chapters - origintracer.app
Most observability tools show you what happened (spans, metrics, logs). OriginTracer shows why - the causal relationships across layers, including kernel-level events.
OriginTracer’s core engine is completely language-agnostic. It only understands a clean, normalized event protocol (NormalizedEvent). The graph, deduplication, causal rules, REPL, and UI have no idea whether events came from Python, Node.js, or another language.
This design makes OriginTracer uniquely positioned as a unified causal observability backend.
You can already start building probes for Node.js services (Express, Fastify, NestJS, etc.). A Node.js probe can:
Official Node.js probes (covering Express/Fastify middleware, async context tracking, event loop delays, etc.) are in the roadmap.
If you want to help accelerate this, the open engine and clear event protocol make experimentation straightforward.
git clone https://github.com/Humbulani1234/origintracer.git
cd origintracer
pip install -e .
Navigate to the applications/django directory for this specific application.
This is a fully OriginTracer already configured Django example application. The following steps detail how it was configured and the steps to follow for your application.
1. Add middleware (must be first in settings.py):
MIDDLEWARE = [
"origintracer.probes.django_probe.TracerMiddleware", # required for trace_id propagation
"django.middleware.security.SecurityMiddleware",
# ...
]
2. Create origintracer.yaml in your project root:
probes:
- django
- asyncio
- gunicorn # available on origintracer.app
- uvicorn # available on origintracer.app
- nginx # available on origintracer.app
3. Initialize in apps.py:
from django.apps import AppConfig
class MyAppConfig(AppConfig):
name = "myapp"
def ready(self):
import origintracer
origintracer.init(debug=True, config=BASE_DIR / "origintracer.yaml")
4. Run your app:
gunicorn -c gunicorn.conf.py config.asgi:application \
--worker-class uvicorn.workers.UvicornWorker
Send requests to your views using the provided load_test and burst_test scripts and explore the results with the REPL.
Open the REPL:
python -m origintracer.repl.repl
Try:
SHOW nodesSHOW edgesCAUSAL\stitch <trace_id> (merges across processes)Similar to the Django application above. Navigate to the applications/celery directory for this specific application, and follow the steps.
NormalizedEvent objects. The engine never touches probes, and probes never block application code.mark_deployment()), and rules that compare against historical behavior.yourapp/origintracer/probes/*.py and rules/*.py. Write once, register via a simple register(registry) function.Built-in:
_run_once, selector events - makes event loop starvation visibleAdvanced - available on origintracer.app:
Custom probes follow the same BaseProbe pattern and are auto-discovered.
Place files in yourapp/origintracer/probes/myprobe.py:
from origintracer.sdk.base_probe import BaseProbe
from origintracer.sdk.emitter import emit
from origintracer.core.event_schema import NormalizedEvent, ProbeTypes
ProbeTypes.register("celery.task.start", "Celery task started")
class CeleryProbe(BaseProbe):
name = "celery"
def start(self):
from celery.signals import task_prerun, task_postrun
task_prerun.connect(self._on_start, weak=False)
# ...
def _on_start(self, task_id, task, **kwargs):
emit(NormalizedEvent.now(
probe="celery.task.start",
trace_id=...,
service="celery",
name=task.name,
# ...
))
Place in yourapp/origintracer/rules/myrules.py:
from origintracer.core.causal import CausalRule, PatternRegistry
def register(registry: PatternRegistry):
registry.register(CausalRule(
name="sync_db_in_celery",
description="Celery task making blocking DB calls",
tags=["celery", "blocking"],
predicate=_detect_blocking_db,
confidence=0.85,
))
Rules receive the live graph and can emit evidence with confidence scores.
OriginTracer is engineered for early production workloads, not just local debugging.
ok=4000 err=0 dropped=0)buf_depth=0 and in_flight=0 after every wave - no backpressure observed.These results demonstrate that OriginTracer delivers deep cross-layer visibility (kernel timings, nginx internals, asyncio behavior, causal relationships) while staying production-viable. The only notable deployment consideration is elevated privileges for full eBPF mode.
This level of stability gives strong confidence for running OriginTracer alongside real traffic.
pip install -e ".[dev]"
pytest origintracer/tests/ -q
pre-commit install
See docs/ for full architecture, probe internals, and contribution guidelines.
Made for engineers who want to move beyond "it's slow" to "here's exactly why - and how to fix it."
Questions or ideas? reach out via the site
Python
94.5%
JavaScript
5.0%