Python package to implement observability domain probes
Project description
domprob 🛰️
Implement the domain probe pattern with observability events easily with domprob.
Motivation
Observability often focuses on low-level signals, missing domain-specific insights that explain why a system behaves a certain way. Inspired by this blog post titled "Domain-Oriented Observability", domprob helps expose meaningful domain events and causal relationships, enabling teams to reason about their system in business terms.
Key Features
Tidy Domain Logic: Keeps domain logic clean by separating observability concerns, ensuring insights don’t clutter core business code.
Turn this (20 lines):
class OrderService: def checkout(self): self.logger.log(f"Attempting to checkout order {self.order}") try: self.checkout_service.checkout_order(self.order) except CheckoutError as e: self.logger.error(f"Checkout for order {self.order} failed: {e}") self.metrics.increment("checkout-failed", { "failed_orders": 1, "customer": 6234654 }) return self.metrics.increment("checkout-successful", { "successful_orders": 1, }) self.logger.log(f"Order checkout completed successfully", { "successful_orders": 1, "customer": 6234654, "order_number": 2374, "sku": "JH-374-VJHV" })→ Into ✨this✨ (9 lines):
class Order: def checkout(self): probe.observe(AttemptingCheckoutObservation()) try: self.checkout_service.checkout_order(self.order) except CheckoutError as e: probe.observe(CheckoutFailedObservation()) return probe.observe(CheckoutSuccessfulObservation())
Installation
uv
uv add domprob
poetry
poetry add domprob
pip
pip install domprob
Usage
Define an observation:
import logging
from typing import Any
from domprob import sensor, BaseObservation
class CheckoutSuccessful(BaseObservation):
def __init__(self, **order_details: Any) -> None:
self.order_details = order_details
@sensor(instrum=logging.Logger)
def log_observation(self, log: logging.Logger) -> None:
log.info("Checkout successful!", **self.order_details)
Calling the observation:
import logging
from domprob import get_probe
probe = get_probe(logging.getLogger(__name__))
class OrderService:
def checkout(self):
try:
self.checkout_service.checkout_order(self.order)
except CheckoutError as e:
raise
probe.observe(CheckoutSuccessful(**self.order_entity))
Check out the docs for more detailed examples!
Contributing
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file domprob-1.0.0.tar.gz.
File metadata
- Download URL: domprob-1.0.0.tar.gz
- Upload date:
- Size: 47.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af7a29acf89c97cb4a7b083c18e789b219a613e6fc765980979ae61d6d91c8ed
|
|
| MD5 |
58abc9fda7e2c40cecc69a195cef35bf
|
|
| BLAKE2b-256 |
97fb645e624ced56de134d507f3e7398fc038cea48ac9d4ec906efad62ffa5c3
|
File details
Details for the file domprob-1.0.0-py3-none-any.whl.
File metadata
- Download URL: domprob-1.0.0-py3-none-any.whl
- Upload date:
- Size: 59.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9712dddd4c911a68e81b1d8f5739d6d76188977dff51254a91541f0c0794cb63
|
|
| MD5 |
93ef2267837547ab9f6affef132168dc
|
|
| BLAKE2b-256 |
5dbf54d16c04dcda681f4dadb8cc9abdb2611e0f00cc04e1b84d95ec0adbdc63
|