stillpoint
Lightweight local observability: a FastAPI collector with a live dashboard for requests, logs, spans, and quick correlation by trace/request IDs.
Install (PyPI)
python -m pip install -U stillpoint
Quick start
1) Run the collector
stillpoint
Open http://127.0.0.1:7000/.
2) Instrument a FastAPI app
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
)
3) Tail access logs instead (no code changes)
set OBS_LOG_FILES=serviceA=/path/to/access.log
set OBS_TAIL_FROM_START=1
stillpoint
Usage scenarios
Single service + live UI
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
Multiple services
Point multiple services at the same collector URL with different service_name
values. The dashboard will tag and filter by service.
Access-log only mode
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.
Configuration
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
Data points collected
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
Local development
Run from source (no install):
python -m uvicorn stillpoint.collector_app:app --app-dir src --host 127.0.0.1 --port 7000 --reload
Tests:
python -m pytest
Code structure:
src/stillpoint/collector_app.py: FastAPI collector + metrics + APIsrc/stillpoint/agent.py: app-side middleware + log handlersrc/stillpoint/ui/: dashboard assets
Metadata
Release files for stillpoint 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| stillpoint-0.1.2.tar.gz | 25.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| stillpoint-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 47.4 kB
Release files / stillpoint-0.1.2.tar.gz
| Download URL | stillpoint-0.1.2.tar.gz |
|---|---|
| Size | 25.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
815c361f5f1a23020e6d22fa7da3dae87c5eb259933dd13cc32ccfe639f66af0
|
|
BLAKE2b-256 checksum How to use checksums |
3331769764f41762b42f8a4837da010607350574359edc0fe0c70d303eef2850
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.0
|
Release files / stillpoint-0.1.2-py3-none-any.whl
| Download URL | stillpoint-0.1.2-py3-none-any.whl |
|---|---|
| Size | 22.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d826ee27d9f47ce81f4fea7cd91df04a0fe7ee22601b41c747631f1b4c02cf72
|
|
BLAKE2b-256 checksum How to use checksums |
1394b491b234c51d6d4cc9f19e58544bd7485fb32c75542f74b4acaac40f970c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.0
|