django-health-check


Namedjango-health-check JSON
Version 3.18.2 PyPI version JSON
download
home_pagehttps://github.com/revsys/django-health-check
SummaryRun checks on services like databases, queue servers, celery processes, etc.
upload_time2024-05-03 21:55:49
maintainerNone
docs_urlNone
authorKristian Ollegaard
requires_python>=3.8
licenseMIT License
keywords django postgresql
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # django-health-check

[![version](https://img.shields.io/pypi/v/django-health-check.svg)](https://pypi.python.org/pypi/django-health-check/)
[![pyversion](https://img.shields.io/pypi/pyversions/django-health-check.svg)](https://pypi.python.org/pypi/django-health-check/)
[![djversion](https://img.shields.io/pypi/djversions/django-health-check.svg)](https://pypi.python.org/pypi/django-health-check/)
[![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://pypi.python.org/pypi/django-health-check/)


This project checks for various conditions and provides reports when anomalous
behavior is detected.

The following health checks are bundled with this project:

- cache
- database
- storage
- disk and memory utilization (via `psutil`)
- AWS S3 storage
- Celery task queue
- Celery ping
- RabbitMQ
- Migrations

Writing your own custom health checks is also very quick and easy.

We also like contributions, so don't be afraid to make a pull request.

## Use Cases

The primary intended use case is to monitor conditions via HTTP(S), with
responses available in HTML and JSON formats. When you get back a response that
includes one or more problems, you can then decide the appropriate course of
action, which could include generating notifications and/or automating the
replacement of a failing node with a new one. If you are monitoring health in a
high-availability environment with a load balancer that returns responses from
multiple nodes, please note that certain checks (e.g., disk and memory usage)
will return responses specific to the node selected by the load balancer.

## Supported Versions

We officially only support the latest version of Python as well as the
latest version of Django and the latest Django LTS version.

## Installation

First, install the `django-health-check` package:

```shell
$ pip install django-health-check
```

Add the health checker to a URL you want to use:

```python
    urlpatterns = [
        # ...
        path(r'ht/', include('health_check.urls')),
    ]
```

Add the `health_check` applications to your `INSTALLED_APPS`:

```python
    INSTALLED_APPS = [
        # ...
        'health_check',                             # required
        'health_check.db',                          # stock Django health checkers
        'health_check.cache',
        'health_check.storage',
        'health_check.contrib.migrations',
        'health_check.contrib.celery',              # requires celery
        'health_check.contrib.celery_ping',         # requires celery
        'health_check.contrib.psutil',              # disk and memory utilization; requires psutil
        'health_check.contrib.s3boto3_storage',     # requires boto3 and S3BotoStorage backend
        'health_check.contrib.rabbitmq',            # requires RabbitMQ broker
        'health_check.contrib.redis',               # requires Redis broker
    ]
```

**Note:** If using `boto 2.x.x` use `health_check.contrib.s3boto_storage`

(Optional) If using the `psutil` app, you can configure disk and memory
threshold settings; otherwise below defaults are assumed. If you want to disable
one of these checks, set its value to `None`.

```python
    HEALTH_CHECK = {
        'DISK_USAGE_MAX': 90,  # percent
        'MEMORY_MIN': 100,    # in MB
    }
```

To use Health Check Subsets, Specify a subset name and associate it with the relevant health check services to utilize Health Check Subsets.
```python
    HEALTH_CHECK = {
        # .....
        "SUBSETS": {
            "startup-probe": ["MigrationsHealthCheck", "DatabaseBackend"],
            "liveness-probe": ["DatabaseBackend"],
            "<SUBSET_NAME>": ["<Health_Check_Service_Name>"]
        },
        # .....
    }
```

To only execute specific subset of health check
```shell
curl -X GET -H "Accept: application/json" http://www.example.com/ht/startup-probe/
```

If using the DB check, run migrations:

```shell
$ django-admin migrate
```

To use the RabbitMQ healthcheck, please make sure that there is a variable named
`BROKER_URL` on django.conf.settings with the required format to connect to your
rabbit server. For example:

```python
    BROKER_URL = "amqp://myuser:mypassword@localhost:5672/myvhost"
```

To use the Redis healthcheck, please make sure that there is a variable named ``REDIS_URL``
on django.conf.settings with the required format to connect to your redis server. For example:

```python
    REDIS_URL = "redis://localhost:6370"
```

The cache healthcheck tries to write and read a specific key within the cache backend.
It can be customized by setting `HEALTHCHECK_CACHE_KEY` to another value:

```python
    HEALTHCHECK_CACHE_KEY = "custom_healthcheck_key"
```

## Setting up monitoring

You can use tools like Pingdom, StatusCake or other uptime robots to monitor service status.
The `/ht/` endpoint will respond with an HTTP 200 if all checks passed
and with an HTTP 500 if any of the tests failed.
Getting machine-readable JSON reports

If you want machine-readable status reports you can request the `/ht/`
endpoint with the `Accept` HTTP header set to `application/json`
or pass `format=json` as a query parameter.

The backend will return a JSON response:

```shell
    $ curl -v -X GET -H "Accept: application/json" http://www.example.com/ht/

    > GET /ht/ HTTP/1.1
    > Host: www.example.com
    > Accept: application/json
    >
    < HTTP/1.1 200 OK
    < Content-Type: application/json

    {
        "CacheBackend": "working",
        "DatabaseBackend": "working",
        "S3BotoStorageHealthCheck": "working"
    }

    $ curl -v -X GET http://www.example.com/ht/?format=json

    > GET /ht/?format=json HTTP/1.1
    > Host: www.example.com
    >
    < HTTP/1.1 200 OK
    < Content-Type: application/json

    {
        "CacheBackend": "working",
        "DatabaseBackend": "working",
        "S3BotoStorageHealthCheck": "working"
    }
```

## Writing a custom health check

Writing a health check is quick and easy:

```python
    from health_check.backends import BaseHealthCheckBackend

    class MyHealthCheckBackend(BaseHealthCheckBackend):
        #: The status endpoints will respond with a 200 status code
        #: even if the check errors.
        critical_service = False

        def check_status(self):
            # The test code goes here.
            # You can use `self.add_error` or
            # raise a `HealthCheckException`,
            # similar to Django's form validation.
            pass

        def identifier(self):
            return self.__class__.__name__  # Display name on the endpoint.
```

After writing a custom checker, register it in your app configuration:

```python
    from django.apps import AppConfig

    from health_check.plugins import plugin_dir

    class MyAppConfig(AppConfig):
        name = 'my_app'

        def ready(self):
            from .backends import MyHealthCheckBackend
            plugin_dir.register(MyHealthCheckBackend)
```

Make sure the application you write the checker into is registered in your
`INSTALLED_APPS`.

## Customizing output

You can customize HTML or JSON rendering by inheriting from `MainView` in
`health_check.views` and customizing the `template_name`, `get`, `render_to_response`
and `render_to_response_json` properties:

```python
    # views.py
    from health_check.views import MainView

    class HealthCheckCustomView(MainView):
        template_name = 'myapp/health_check_dashboard.html'  # customize the used templates

        def get(self, request, *args, **kwargs):
            plugins = []
            status = 200 # needs to be filled status you need
            # ...
            if 'application/json' in request.META.get('HTTP_ACCEPT', ''):
                return self.render_to_response_json(plugins, status)
            return self.render_to_response(plugins, status)

        def render_to_response(self, plugins, status):       # customize HTML output
            return HttpResponse('COOL' if status == 200 else 'SWEATY', status=status)

        def render_to_response_json(self, plugins, status):  # customize JSON output
            return JsonResponse(
                {str(p.identifier()): 'COOL' if status == 200 else 'SWEATY' for p in plugins},
                status=status
            )

    # urls.py
    import views

    urlpatterns = [
        # ...
        path(r'ht/', views.HealthCheckCustomView.as_view(), name='health_check_custom'),
    ]
```

## Django command

You can run the Django command `health_check` to perform your health checks via the command line,
or periodically with a cron, as follow:

```shell
    django-admin health_check
```

This should yield the following output:

```
    DatabaseHealthCheck      ... working
    CustomHealthCheck        ... unavailable: Something went wrong!
```

Similar to the http version, a critical error will cause the command to quit with the exit code `1`.


## Other resources

- [django-watchman](https://github.com/mwarkentin/django-watchman) is a package that does some of the same things in a slightly different way.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/revsys/django-health-check",
    "name": "django-health-check",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "django, postgresql",
    "author": "Kristian Ollegaard",
    "author_email": "kristian@oellegaard.com",
    "download_url": "https://files.pythonhosted.org/packages/4a/7d/081c0fb1e0fe2ee58b6a2a026779329e9dee1e637f1e98437e76f6c71189/django_health_check-3.18.2.tar.gz",
    "platform": null,
    "description": "# django-health-check\n\n[![version](https://img.shields.io/pypi/v/django-health-check.svg)](https://pypi.python.org/pypi/django-health-check/)\n[![pyversion](https://img.shields.io/pypi/pyversions/django-health-check.svg)](https://pypi.python.org/pypi/django-health-check/)\n[![djversion](https://img.shields.io/pypi/djversions/django-health-check.svg)](https://pypi.python.org/pypi/django-health-check/)\n[![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://pypi.python.org/pypi/django-health-check/)\n\n\nThis project checks for various conditions and provides reports when anomalous\nbehavior is detected.\n\nThe following health checks are bundled with this project:\n\n- cache\n- database\n- storage\n- disk and memory utilization (via `psutil`)\n- AWS S3 storage\n- Celery task queue\n- Celery ping\n- RabbitMQ\n- Migrations\n\nWriting your own custom health checks is also very quick and easy.\n\nWe also like contributions, so don't be afraid to make a pull request.\n\n## Use Cases\n\nThe primary intended use case is to monitor conditions via HTTP(S), with\nresponses available in HTML and JSON formats. When you get back a response that\nincludes one or more problems, you can then decide the appropriate course of\naction, which could include generating notifications and/or automating the\nreplacement of a failing node with a new one. If you are monitoring health in a\nhigh-availability environment with a load balancer that returns responses from\nmultiple nodes, please note that certain checks (e.g., disk and memory usage)\nwill return responses specific to the node selected by the load balancer.\n\n## Supported Versions\n\nWe officially only support the latest version of Python as well as the\nlatest version of Django and the latest Django LTS version.\n\n## Installation\n\nFirst, install the `django-health-check` package:\n\n```shell\n$ pip install django-health-check\n```\n\nAdd the health checker to a URL you want to use:\n\n```python\n    urlpatterns = [\n        # ...\n        path(r'ht/', include('health_check.urls')),\n    ]\n```\n\nAdd the `health_check` applications to your `INSTALLED_APPS`:\n\n```python\n    INSTALLED_APPS = [\n        # ...\n        'health_check',                             # required\n        'health_check.db',                          # stock Django health checkers\n        'health_check.cache',\n        'health_check.storage',\n        'health_check.contrib.migrations',\n        'health_check.contrib.celery',              # requires celery\n        'health_check.contrib.celery_ping',         # requires celery\n        'health_check.contrib.psutil',              # disk and memory utilization; requires psutil\n        'health_check.contrib.s3boto3_storage',     # requires boto3 and S3BotoStorage backend\n        'health_check.contrib.rabbitmq',            # requires RabbitMQ broker\n        'health_check.contrib.redis',               # requires Redis broker\n    ]\n```\n\n**Note:** If using `boto 2.x.x` use `health_check.contrib.s3boto_storage`\n\n(Optional) If using the `psutil` app, you can configure disk and memory\nthreshold settings; otherwise below defaults are assumed. If you want to disable\none of these checks, set its value to `None`.\n\n```python\n    HEALTH_CHECK = {\n        'DISK_USAGE_MAX': 90,  # percent\n        'MEMORY_MIN': 100,    # in MB\n    }\n```\n\nTo use Health Check Subsets, Specify a subset name and associate it with the relevant health check services to utilize Health Check Subsets.\n```python\n    HEALTH_CHECK = {\n        # .....\n        \"SUBSETS\": {\n            \"startup-probe\": [\"MigrationsHealthCheck\", \"DatabaseBackend\"],\n            \"liveness-probe\": [\"DatabaseBackend\"],\n            \"<SUBSET_NAME>\": [\"<Health_Check_Service_Name>\"]\n        },\n        # .....\n    }\n```\n\nTo only execute specific subset of health check\n```shell\ncurl -X GET -H \"Accept: application/json\" http://www.example.com/ht/startup-probe/\n```\n\nIf using the DB check, run migrations:\n\n```shell\n$ django-admin migrate\n```\n\nTo use the RabbitMQ healthcheck, please make sure that there is a variable named\n`BROKER_URL` on django.conf.settings with the required format to connect to your\nrabbit server. For example:\n\n```python\n    BROKER_URL = \"amqp://myuser:mypassword@localhost:5672/myvhost\"\n```\n\nTo use the Redis healthcheck, please make sure that there is a variable named ``REDIS_URL``\non django.conf.settings with the required format to connect to your redis server. For example:\n\n```python\n    REDIS_URL = \"redis://localhost:6370\"\n```\n\nThe cache healthcheck tries to write and read a specific key within the cache backend.\nIt can be customized by setting `HEALTHCHECK_CACHE_KEY` to another value:\n\n```python\n    HEALTHCHECK_CACHE_KEY = \"custom_healthcheck_key\"\n```\n\n## Setting up monitoring\n\nYou can use tools like Pingdom, StatusCake or other uptime robots to monitor service status.\nThe `/ht/` endpoint will respond with an HTTP 200 if all checks passed\nand with an HTTP 500 if any of the tests failed.\nGetting machine-readable JSON reports\n\nIf you want machine-readable status reports you can request the `/ht/`\nendpoint with the `Accept` HTTP header set to `application/json`\nor pass `format=json` as a query parameter.\n\nThe backend will return a JSON response:\n\n```shell\n    $ curl -v -X GET -H \"Accept: application/json\" http://www.example.com/ht/\n\n    > GET /ht/ HTTP/1.1\n    > Host: www.example.com\n    > Accept: application/json\n    >\n    < HTTP/1.1 200 OK\n    < Content-Type: application/json\n\n    {\n        \"CacheBackend\": \"working\",\n        \"DatabaseBackend\": \"working\",\n        \"S3BotoStorageHealthCheck\": \"working\"\n    }\n\n    $ curl -v -X GET http://www.example.com/ht/?format=json\n\n    > GET /ht/?format=json HTTP/1.1\n    > Host: www.example.com\n    >\n    < HTTP/1.1 200 OK\n    < Content-Type: application/json\n\n    {\n        \"CacheBackend\": \"working\",\n        \"DatabaseBackend\": \"working\",\n        \"S3BotoStorageHealthCheck\": \"working\"\n    }\n```\n\n## Writing a custom health check\n\nWriting a health check is quick and easy:\n\n```python\n    from health_check.backends import BaseHealthCheckBackend\n\n    class MyHealthCheckBackend(BaseHealthCheckBackend):\n        #: The status endpoints will respond with a 200 status code\n        #: even if the check errors.\n        critical_service = False\n\n        def check_status(self):\n            # The test code goes here.\n            # You can use `self.add_error` or\n            # raise a `HealthCheckException`,\n            # similar to Django's form validation.\n            pass\n\n        def identifier(self):\n            return self.__class__.__name__  # Display name on the endpoint.\n```\n\nAfter writing a custom checker, register it in your app configuration:\n\n```python\n    from django.apps import AppConfig\n\n    from health_check.plugins import plugin_dir\n\n    class MyAppConfig(AppConfig):\n        name = 'my_app'\n\n        def ready(self):\n            from .backends import MyHealthCheckBackend\n            plugin_dir.register(MyHealthCheckBackend)\n```\n\nMake sure the application you write the checker into is registered in your\n`INSTALLED_APPS`.\n\n## Customizing output\n\nYou can customize HTML or JSON rendering by inheriting from `MainView` in\n`health_check.views` and customizing the `template_name`, `get`, `render_to_response`\nand `render_to_response_json` properties:\n\n```python\n    # views.py\n    from health_check.views import MainView\n\n    class HealthCheckCustomView(MainView):\n        template_name = 'myapp/health_check_dashboard.html'  # customize the used templates\n\n        def get(self, request, *args, **kwargs):\n            plugins = []\n            status = 200 # needs to be filled status you need\n            # ...\n            if 'application/json' in request.META.get('HTTP_ACCEPT', ''):\n                return self.render_to_response_json(plugins, status)\n            return self.render_to_response(plugins, status)\n\n        def render_to_response(self, plugins, status):       # customize HTML output\n            return HttpResponse('COOL' if status == 200 else 'SWEATY', status=status)\n\n        def render_to_response_json(self, plugins, status):  # customize JSON output\n            return JsonResponse(\n                {str(p.identifier()): 'COOL' if status == 200 else 'SWEATY' for p in plugins},\n                status=status\n            )\n\n    # urls.py\n    import views\n\n    urlpatterns = [\n        # ...\n        path(r'ht/', views.HealthCheckCustomView.as_view(), name='health_check_custom'),\n    ]\n```\n\n## Django command\n\nYou can run the Django command `health_check` to perform your health checks via the command line,\nor periodically with a cron, as follow:\n\n```shell\n    django-admin health_check\n```\n\nThis should yield the following output:\n\n```\n    DatabaseHealthCheck      ... working\n    CustomHealthCheck        ... unavailable: Something went wrong!\n```\n\nSimilar to the http version, a critical error will cause the command to quit with the exit code `1`.\n\n\n## Other resources\n\n- [django-watchman](https://github.com/mwarkentin/django-watchman) is a package that does some of the same things in a slightly different way.\n",
    "bugtrack_url": null,
    "license": "MIT License",
    "summary": "Run checks on services like databases, queue servers, celery processes, etc.",
    "version": "3.18.2",
    "project_urls": {
        "Homepage": "https://github.com/revsys/django-health-check"
    },
    "split_keywords": [
        "django",
        " postgresql"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b2d541a450d82a33722dcf13e46d1fd1fc0b9d294a1ba040b49f125bcf5f672d",
                "md5": "e7926fd34df4233cb3acbaacbb31be39",
                "sha256": "16f9c9186236cbc2858fa0d0ecc3566ba2ad2b72683e5678d0d58eb9e8bbba1a"
            },
            "downloads": -1,
            "filename": "django_health_check-3.18.2-py2.py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "e7926fd34df4233cb3acbaacbb31be39",
            "packagetype": "bdist_wheel",
            "python_version": "py2.py3",
            "requires_python": ">=3.8",
            "size": 30354,
            "upload_time": "2024-05-03T21:55:47",
            "upload_time_iso_8601": "2024-05-03T21:55:47.751564Z",
            "url": "https://files.pythonhosted.org/packages/b2/d5/41a450d82a33722dcf13e46d1fd1fc0b9d294a1ba040b49f125bcf5f672d/django_health_check-3.18.2-py2.py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4a7d081c0fb1e0fe2ee58b6a2a026779329e9dee1e637f1e98437e76f6c71189",
                "md5": "e0c56b4c93af71e9eddcd6b4f167d9f0",
                "sha256": "21235120f8d756fa75ba430d0b0dbb04620fbd7bfac92ed6a0b911915ba38918"
            },
            "downloads": -1,
            "filename": "django_health_check-3.18.2.tar.gz",
            "has_sig": false,
            "md5_digest": "e0c56b4c93af71e9eddcd6b4f167d9f0",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 20939,
            "upload_time": "2024-05-03T21:55:49",
            "upload_time_iso_8601": "2024-05-03T21:55:49.798988Z",
            "url": "https://files.pythonhosted.org/packages/4a/7d/081c0fb1e0fe2ee58b6a2a026779329e9dee1e637f1e98437e76f6c71189/django_health_check-3.18.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-05-03 21:55:49",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "revsys",
    "github_project": "django-health-check",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "django-health-check"
}
        
Elapsed time: 0.23170s