Skip to main content

aspirator

Python SDK for Aspirator, a minimal self-hosted error tracker. Zero dependencies, deliberately — an error tracker that drags in a dependency tree is one more thing that can break the app it is meant to be watching.

You need an Aspirator server to report to. This package on its own does nothing.

Install

pip install aspirator      # or: uv add aspirator

Use

import aspirator

aspirator.init()   # reads ASPIRATOR_DSN, ASPIRATOR_RELEASE, ASPIRATOR_ENVIRONMENT

try:
    charge(order)
except PaymentError as exc:
    aspirator.capture_exception(exc)

capture_exception also takes a plain string, for a problem you detected rather than caught. It is reported as an issue like any other, named and grouped by its text:

if not rows:
    aspirator.capture_exception("verifier returned no rows", level="warning")

init() also installs interpreter-level hooks, so a crash in a thread, an unretrieved asyncio task or a bare script is reported even where no framework wraps it.

Frameworks

from aspirator.integrations import django as aspirator_django

aspirator.init(integrations=[aspirator_django])

Django, FastAPI/Starlette and Celery are supported, plus a logging integration that forwards log lines and builds breadcrumbs. No middleware entry is needed for any of them — each patches the point that sits outside the whole chain, because middleware only ever sees what is raised below it.

Running under uvicorn? Flush on shutdown

@contextlib.asynccontextmanager
async def lifespan(app):
    yield
    aspirator.close()

app = FastAPI(lifespan=lifespan)

Events are sent by a background thread, and whatever it has not sent yet is flushed at exit. But docker stop sends SIGTERM, and SIGTERM kills a Python process without unwinding — so atexit never runs, and under uvicorn that loses the queue and the open metrics window on every deploy.

gunicorn does not need this (its worker exits normally) and neither does Celery (the integration is wired to the shutdown signals). It is uvicorn specifically, and all three were measured.

Also

Metrics (increment, gauge, timing), cron check-ins, breadcrumbs, request capture, and credential scrubbing by key.

Typed, all the way down

The package ships py.typed, and every public function names its keywords rather than taking **kwargs. That is the difference between an editor offering you one parameter and offering you all of them with their documentation — and between capture_exception(exc, transation="/orders") being a type error with a suggestion and being a line that silently does nothing.

aspirator.capture_exception(exc, level="warn")
#   Argument "level" has incompatible type "Literal['warn']";
#   expected Literal['debug', 'info', 'warning', 'error', 'fatal']

aspirator.init(is_error_skippable=lambda error: error.api_pth == "/health")
#   "CapturedError" has no attribute "api_pth"; maybe "api_path"?

aspirator.types is public and importable at runtime — Event, Level, User, Mechanism — so a filter or a processor of your own can be annotated against the payload it is handed.

Licence

MIT. Portions derived from sentry-python (MIT); see LICENSE.

Metadata

Release files for aspirator 0.1.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aspirator 0.1.3
File Size Uploaded
aspirator-0.1.3.tar.gz 108.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for aspirator 0.1.3
File Interpreter ABI Platform
aspirator-0.1.3-py3-none-any.whl Python 3 none any Details

Total release size: 235.3 kB

Release files / aspirator-0.1.3.tar.gz

Download URL aspirator-0.1.3.tar.gz
Size 108.3 kB
Tags Source
SHA-256 checksum
How to use checksums
f79b1645c9ac7e89dd1fe19c585d1282610cef54c3a3400dfa4c04366ef1d3a8
BLAKE2b-256 checksum
How to use checksums
9d026786185671b04d3f407630845ab9ed2c0c66aa26cdc1d5b1aa75b207b25a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / aspirator-0.1.3-py3-none-any.whl

Download URL aspirator-0.1.3-py3-none-any.whl
Size 126.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
77570cceb7e25cb115673063aa535b9bde77df622c00063f9564a1cb8318be37
BLAKE2b-256 checksum
How to use checksums
94f14e4cafecb71d653b736652bc3b0a11336c3be8507820d5a9c4f542413080
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

0.1.4

2 release files

This release

0.1.3 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page