domprob


Namedomprob JSON
Version 0.1.1 PyPI version JSON
download
home_pageNone
SummaryPython package to implement observability domain probes
upload_time2025-02-08 19:34:19
maintainerNone
docs_urlNone
authorNone
requires_python<3.14,>=3.10
licenseMIT
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.

![PyPI - Package Version](https://img.shields.io/pypi/v/domprob.svg)
![PyPI - Python Version](https://img.shields.io/pypi/pyversions/domprob)
[![codecov](https://codecov.io/gh/tenyo-app/pydomprob/graph/badge.svg?token=C0BO1ZP0DK)](https://codecov.io/gh/tenyo-app/pydomprob)
[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit)
[![Checked with mypy](http://www.mypy-lang.org/static/mypy_badge.svg)](http://mypy-lang.org/)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](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![PyPI - Package Version](https://img.shields.io/pypi/v/domprob.svg)\n![PyPI - Python Version](https://img.shields.io/pypi/pyversions/domprob)\n[![codecov](https://codecov.io/gh/tenyo-app/pydomprob/graph/badge.svg?token=C0BO1ZP0DK)](https://codecov.io/gh/tenyo-app/pydomprob)\n[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit)\n[![Checked with mypy](http://www.mypy-lang.org/static/mypy_badge.svg)](http://mypy-lang.org/)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](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"
}
        
Elapsed time: 1.17101s