Distributed tracing from scratch. Zero dependencies. 193 tests. Python only.
Set up a tracer. Three lines, no config files.
from tracelite.tracer import TracerProvider from tracelite.span import Resource, SpanKind from tracelite.processor import SimpleSpanProcessor from tracelite.exporter import ConsoleExporter provider = TracerProvider( resource=Resource(attributes={"service.name": "my-api"}) ) provider.add_processor(SimpleSpanProcessor(ConsoleExporter())) tracer = provider.get_tracer() with tracer.start_span("GET /users", kind=SpanKind.SERVER) as span: span.set_attribute("http.method", "GET") with tracer.start_span("fetch_from_db") as db: db.set_attribute("db.system", "postgresql") # ...your query runs here... span.set_attribute("http.status_code", 200)
See the trace. Waterfall view renders in the terminal or the built-in dashboard.
Propagate context across services. W3C Trace Context headers link spans into a single trace.
from tracelite.propagator import W3CTraceContextPropagator from tracelite.context import SpanContext propagator = W3CTraceContextPropagator() # Service A: inject into outgoing request with tracer.start_span("call-service-b", kind=SpanKind.CLIENT) as span: headers = {} ctx = SpanContext(span.trace_id, span.span_id, trace_flags=1) propagator.inject(ctx, headers) # → {"traceparent": "00-4bf92f...-00f067...-01"} # Service B: extract from incoming request parent = propagator.extract(incoming_headers) with tracer.start_span("handle-request", parent=parent) as span: # Same trace_id, linked as child span pass
Map your services. Auto-generated dependency graph with edge metrics.
What's inside.