Lightweight local observability: a FastAPI collector with a live dashboard for requests, logs, spans, and quick correlation by trace/request IDs.
python -m pip install -U stillpointstillpointOpen http://127.0.0.1:7000/.
from stillpoint.agent import install_observability
client = install_observability(
app_instance,
collector_url="http://127.0.0.1:7000/ingest",
token="dev-secret",
service_name="my-api:8000",
emit_request_span=True, # optional single span per request
)set OBS_LOG_FILES=serviceA=/path/to/access.log
set OBS_TAIL_FROM_START=1
stillpoint
Run the collector, instrument your API, then browse the dashboard to:
- see live request volume, error rates, and p95 latency
- view recent requests and open trace details
- export a trace bundle as JSON
Point multiple services at the same collector URL with different service_name
values. The dashboard will tag and filter by service.
When code changes are not possible, tail access logs via OBS_LOG_FILES.
Note: spans and per-request logs are not available unless emitted by the app.
Collector environment variables:
OBS_TOKEN: bearer token for/ingest(defaultdev-secret)OBS_HOST,OBS_PORT: bind host/port (defaults127.0.0.1:7000)OBS_RELOAD: set to1for reload (dev only)OBS_LOG_LEVEL: uvicorn log level (defaultinfo)OBS_WINDOW_S: metrics window seconds (default120)OBS_MAX_EVENTS: SSE buffer size (default30000)OBS_LOG_FILES: tail access logs (comma-separatedsvc=/path.log)OBS_TAIL_FROM_START: set1to read logs from startOBS_SLOW_MS: slow request threshold (default750)OBS_SAMPLE_RATE: sample rate for normal traffic (default0.05)OBS_TRACE_STORE: max traces stored (default2000)OBS_TRACE_LOGS: max logs per trace (default200)OBS_TRACE_SPANS: max spans per trace (default200)OBS_RECENT_REQS: max recent requests kept (default2000)
Agent config (per app):
collector_url,token,service_nameininstall_observabilityemit_request_span=Trueto get a default request span
Events emitted and stored:
req_start/req_end: method, path/route, status, duration, client info,trace_id,span_id,request_id, plus headers subsetlog: level, logger, message, optional tracespan: name, duration, optional metadata (type,db,http,cache)gauge: used for inflight counts when emitted by the app
Derived metrics:
- RPS, error rates, status buckets (2xx/3xx/4xx/5xx)
- per-endpoint p50/p95/p99 and tail latency thresholds
- recent requests list and slowest individual traces
Run from source (no install):
python -m uvicorn stillpoint.collector_app:app --app-dir src --host 127.0.0.1 --port 7000 --reloadTests:
python -m pytestCode structure:
src/stillpoint/collector_app.py: FastAPI collector + metrics + APIsrc/stillpoint/agent.py: app-side middleware + log handlersrc/stillpoint/ui/: dashboard assets