omnixys-observability
Omnixys shared observability package — OpenTelemetry tracing, structlog structured logging, Prometheus metrics, request-context propagation and error classification.
Installation
pip install omnixys-observability
Features
- Tracing: OTLP HTTP trace export with ratio/always-on sampling, FastAPI/httpx/logging auto-instrumentation, and a
@spandecorator for functions and methods - Logging: structlog JSON (or colored pretty) console output, OTLP log export, context enrichment (request/correlation id, user, tenant, trace ids), and recursive secret redaction
- Metrics: Prometheus counters/histograms/gauges for HTTP, GraphQL, DB, Kafka, cache, rate limiting, auth and outbox — plus
RateLimitMetricsandSloMetricshelpers - Request context: contextvars-based
RequestContextpropagation across async boundaries - Errors:
classify_error()/ErrorClassifierbuckets intoserver_error/client_error/internal_error - Runtime:
configure_observability()one-call setup of traces + logs with a shared service resource
Usage
One-call setup
from observability import configure_observability, shutdown_observability
configure_observability(
service_name="ticketing",
otlp_endpoint="http://collector:4318",
environment="production",
)
Structured logging
from observability import configure_logging, get_logger, RequestContext, set_request_context
configure_logging("INFO", service_name="ticketing")
set_request_context(RequestContext(request_id="r1", user_id="u1", tenant_id="t1"))
log = get_logger("ticketing")
log.info("event_created", event_id="e1")
log.error("payment_failed", status=503, token="sk_live_...") # token -> [REDACTED]
LOG_PRETTY=true forces colored console output; production defaults to JSON.
Console vs. Loki levels
The console threshold and the OTLP (Loki) threshold are independent:
configure_logging("INFO", ...)keeps the console atINFO.- The OTLP export defaults to
DEBUG, so debug logs still appear in Grafana/Loki in production while the console stays quiet.
Override the Loki threshold via the OTEL_LOG_LEVEL environment variable or
the otel_log_level parameter (values: TRACE, DEBUG, INFO, WARNING,
ERROR; invalid values fall back to DEBUG):
OTEL_LOG_LEVEL=WARNING # Loki receives WARNING and above only
configure_logging("INFO", service_name="ticketing", otel_log_level="DEBUG")
Spans
from observability import span
@span
async def process_event(event_id: str) -> None: ...
@span(name="billing.charge", attributes={"provider": "stripe"})
def charge(customer_id: str) -> None: ...
Metrics
from observability import SloMetrics, RateLimitMetrics, http_requests_total
http_requests_total.labels(method="POST", path="/events", status_code="201").inc()
slo = SloMetrics()
slo.record_success()
slo.record_error()
slo.error_rate() # 0.5
rl = RateLimitMetrics()
rl.hit("sms:user:42")
rl.get("sms:user:42") # 1
Error classification
from observability import classify_error
classify_error(HTTPException(status_code=503)) # "server_error"
classify_error(HTTPException(status_code=404)) # "client_error"
classify_error(RuntimeError("boom")) # "internal_error"
Testing
uv run pytest -q # 30 tests
uv run ruff check . # lint
uv run mypy src/ # strict typing
License
GPL-3.0-or-later
Metadata
Release files for omnixys-observability 4.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| omnixys_observability-4.1.3.tar.gz | 77.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| omnixys_observability-4.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 88.5 kB
Release files / omnixys_observability-4.1.3.tar.gz
| Download URL | omnixys_observability-4.1.3.tar.gz |
|---|---|
| Size | 77.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
912c07a5c00fe55af500c0f0c0ab161af265502c48742d003851b006ce8fdcb4
|
|
BLAKE2b-256 checksum How to use checksums |
0fffce9672c8d5c2dba31d7052d1159c134e65525a430f76569eaa34d041bcce
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / omnixys_observability-4.1.3-py3-none-any.whl
| Download URL | omnixys_observability-4.1.3-py3-none-any.whl |
|---|---|
| Size | 11.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
dfe91f49e727f1d3f63790bfc2f82f70b6b30e959d37d5f25d48fd938d295e18
|
|
BLAKE2b-256 checksum How to use checksums |
10776db73b9ee4da480c23a963579fa468710acd00345dce5e09b078c158c5dc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|