Name | domprob JSON |
Version |
0.1.1
JSON |
| download |
home_page | None |
Summary | Python package to implement observability domain probes |
upload_time | 2025-02-08 19:34:19 |
maintainer | None |
docs_url | None |
author | None |
requires_python | <3.14,>=3.10 |
license | MIT |
keywords |
logging
observability
domain-probe
|
VCS |
 |
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# domprob π°οΈ
Inspired by [this blog post](https://martinfowler.com/articles/domain-oriented-observability.html), domprob is a Python package to implement observability domain probes in your projects.


[](https://codecov.io/gh/tenyo-app/pydomprob)
[](https://github.com/pre-commit/pre-commit)
[](http://mypy-lang.org/)
[](https://github.com/psf/black)
[π Documentation](https://domprob.readthedocs.io/en/latest/) | [π PyPI](https://pypi.org/project/domprob/)
## Overview
Keep your business logic comprehensible by abstracting the observability code away.
**Turn this (20 lines):**
```python
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):**
```python
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
Install using uv:
```shell
uv add domprob
```
Using pip:
```shell
pip install domprob
```
Using poetry:
```shell
poetry add domprob
```
## Usage
### Define an observation
```python
import logging
from typing import Any
from domprob import announcement, BaseObservation
class CheckoutSuccessful(BaseObservation):
def __init__(self, **order_details: Any) -> None:
self.order_details = order_details
@announcement(logging.Logger)
def log_observation(self, log: logging.Logger) -> None:
log.info("Checkout successful!", **self.order_details)
```
### Calling the observation
```python
from domprob import probe
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](https://domprob.readthedocs.io/en/latest/) for more detail!
Raw data
{
"_id": null,
"home_page": null,
"name": "domprob",
"maintainer": null,
"docs_url": null,
"requires_python": "<3.14,>=3.10",
"maintainer_email": null,
"keywords": "logging, observability, domain-probe",
"author": null,
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/74/e9/8b78e8934d00352eb1fea0af15a5dd6555421f2e9fb0b639230629ab4294/domprob-0.1.1.tar.gz",
"platform": null,
"description": "# domprob \ud83d\udef0\ufe0f\nInspired by [this blog post](https://martinfowler.com/articles/domain-oriented-observability.html), domprob is a Python package to implement observability domain probes in your projects.\n\n\n\n[](https://codecov.io/gh/tenyo-app/pydomprob)\n[](https://github.com/pre-commit/pre-commit)\n[](http://mypy-lang.org/)\n[](https://github.com/psf/black)\n\n[\ud83d\udcc4 Documentation](https://domprob.readthedocs.io/en/latest/) | [\ud83d\udc0d PyPI](https://pypi.org/project/domprob/)\n\n## Overview\n\nKeep your business logic comprehensible by abstracting the observability code away.\n\n**Turn this (20 lines):**\n\n```python\nclass OrderService:\n def checkout(self):\n self.logger.log(f\"Attempting to checkout order {self.order}\")\n try:\n self.checkout_service.checkout_order(self.order)\n except CheckoutError as e:\n self.logger.error(f\"Checkout for order {self.order} failed: {e}\")\n self.metrics.increment(\"checkout-failed\", {\n \"failed_orders\": 1, \"customer\": 6234654\n })\n return\n self.metrics.increment(\"checkout-successful\", {\n \"successful_orders\": 1, \n })\n self.logger.log(f\"Order checkout completed successfully\", {\n \"successful_orders\": 1, \n \"customer\": 6234654, \n \"order_number\": 2374, \n \"sku\": \"JH-374-VJHV\"\n })\n```\n\n**\u2192 Into \u2728this\u2728 (9 lines):**\n\n```python\nclass Order:\n def checkout(self):\n probe.observe(AttemptingCheckoutObservation())\n try:\n self.checkout_service.checkout_order(self.order)\n except CheckoutError as e:\n probe.observe(CheckoutFailedObservation())\n return\n probe.observe(CheckoutSuccessfulObservation())\n```\n\n## Installation\n\nInstall using uv:\n\n```shell\nuv add domprob\n```\n\nUsing pip:\n\n```shell\npip install domprob\n```\n\nUsing poetry:\n\n```shell\npoetry add domprob\n```\n\n## Usage\n\n### Define an observation\n\n```python\nimport logging\nfrom typing import Any\n\nfrom domprob import announcement, BaseObservation\n\n\nclass CheckoutSuccessful(BaseObservation):\n \n def __init__(self, **order_details: Any) -> None:\n self.order_details = order_details\n\n @announcement(logging.Logger)\n def log_observation(self, log: logging.Logger) -> None:\n log.info(\"Checkout successful!\", **self.order_details)\n\n```\n\n### Calling the observation\n\n```python\n from domprob import probe\n\n class OrderService:\n \n def checkout(self):\n try:\n self.checkout_service.checkout_order(self.order)\n except CheckoutError as e:\n raise\n probe.observe(CheckoutSuccessful(**self.order_entity))\n\n```\n\nCheck out [the docs](https://domprob.readthedocs.io/en/latest/) for more detail!\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Python package to implement observability domain probes",
"version": "0.1.1",
"project_urls": {
"Documentation": "https://domprob.readthedocs.io/en/latest/",
"Issues": "https://github.com/tenyo-app/pydomprob/issues",
"Repository": "https://github.com/tenyo-app/pydomprob"
},
"split_keywords": [
"logging",
" observability",
" domain-probe"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "bad73294ddf8a9524a503b48ab4e3339f08041447651ac7c308d1a1295af5a07",
"md5": "72294a4fa8b7be68c1960dad4b3b822a",
"sha256": "d752d2ac8476b9115e4dfc4d7f177714a61643685c13b13dc0da4cb7e00edb44"
},
"downloads": -1,
"filename": "domprob-0.1.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "72294a4fa8b7be68c1960dad4b3b822a",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<3.14,>=3.10",
"size": 39113,
"upload_time": "2025-02-08T19:34:18",
"upload_time_iso_8601": "2025-02-08T19:34:18.070599Z",
"url": "https://files.pythonhosted.org/packages/ba/d7/3294ddf8a9524a503b48ab4e3339f08041447651ac7c308d1a1295af5a07/domprob-0.1.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "74e98b78e8934d00352eb1fea0af15a5dd6555421f2e9fb0b639230629ab4294",
"md5": "41b7c59633950a39e5436b2e0f7edb4a",
"sha256": "d57fdf7db803aab20da984850ad1e261aac001e710b41385761484a3d3796c6f"
},
"downloads": -1,
"filename": "domprob-0.1.1.tar.gz",
"has_sig": false,
"md5_digest": "41b7c59633950a39e5436b2e0f7edb4a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<3.14,>=3.10",
"size": 31184,
"upload_time": "2025-02-08T19:34:19",
"upload_time_iso_8601": "2025-02-08T19:34:19.784398Z",
"url": "https://files.pythonhosted.org/packages/74/e9/8b78e8934d00352eb1fea0af15a5dd6555421f2e9fb0b639230629ab4294/domprob-0.1.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-02-08 19:34:19",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "tenyo-app",
"github_project": "pydomprob",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "domprob"
}