Library for health checks
Project description
HealthChecks
Welcome to the healthiest library of all times! It provides a simple interface to check the health of your application.
We have base classes for HTTP and FILE based health checks.
Installation
TODO
If you want to check health of your FastAPI application, run:
poetry run health-checks -E fastapi
If you want to check health of your Litestar application, run:
poetry run health-checks -E litestar
If you want to check health of your consumer, run:
poetry run health-checks -E file
HTTP based quickstart
Let's begin with http based healthchecks for Litestar application:
from health_checks.http_based import DefaultHTTPHealthCheck
from health_checks.litestar_healthcheck import build_litestar_health_check_router
import litestar
litestar_application = litestar.Litestar(
route_handlers=[
build_litestar_health_check_router(
healthcheck_endpoint="/health/",
health_check=DefaultHTTPHealthCheck(),
),
],
)
This is it! Now if your go to /health/
you will notice a 200 HTTP status code if everything is alright. Otherwise you will face a 500 HTTP status code.
Similar to litestar, here is the FastAPI example
import fastapi
from health_checks.fastapi_healthcheck import build_fastapi_health_check_router
from health_checks.http_based import DefaultHTTPHealthCheck
fastapi_app = fastapi.FastAPI()
fastapi_app.include_router(
build_fastapi_health_check_router(
health_check_endpoint="/health/",
health_check=DefaultHTTPHealthCheck(),
),
)
This is also it! How wonderful, isn't it? You can navigate to /health/
and meet your 200 HTTP status code.
FILE based quickstart
Here things are starting to get complicated. Let's imagine a simple consumer
import dataclasses
from health_checks.base import HealthCheck
@dataclasses.dataclass
class SimpleConsumer:
health_check: HealthCheck
async def startup(self):
await self.health_check.startup()
async def shutdown(self):
await self.health_check.shutdown()
async def listen(self):
while True:
# Here we receive our messages from some queue
try:
# Non-blocking message processing
await self.process_message()
# Be attentive! We call update_health method, not update_health_status.
await health_check.update_health()
except Exception:
continue
This is very important to place your health check inside infinite loop or something like that in your consumer. You cannot use it inside your message processing function or method because if there will be no messages - your consumer will die eventually. And this is not the case we are looking for. So, your update_health method call should be independent from message processing, also it should not be locked by it.
So, here how your code could look like
# directory/some_file.py
import asyncio
from health_checks import file_based
health_check_object = file_based.DefaultFileHealthCheck()
consumer = SimpleConsumer(health_check_object)
if __name__ == '__main__':
asyncio.run(consumer.run_consumer())
Cool! Now during your consumer process health will be updated. But how to check it and where?
In this package we have a cli, that allows you to check health of certain HealthCheck object. Here, how you can use it
python -m health_checks directory.some_file:health_check_object
Here some_file
is the name of file and health_check_object
is the name of file_based.DefaultFileHealthCheck object.
If everything is alright, then there will be no exception, but if it is not - there will be
And you use it inside your k8s manifest like this:
livenessProbe:
exec:
command:
- python
- "-m"
- health_checks
- directory.some_file:health_check_object
Now let's look at FILE health check accepted arguments.
@dataclasses.dataclass
class BaseFileHealthCheck(base.HealthCheck):
failure_threshold: int = 60
health_check_period: int = 30
healthcheck_file_name: str | None = None
base_folder: str = "./tmp/health-checks"
...
base_folder
- folder, where health check file will be created.failure_threshold
- time after which health check won't passhealth_check_period
- delay time before updating health check filehealthcheck_file_name
- you can pass an explicit file name to your health check.
IMPORTANT: You actually have to pass
healthcheck_file_name
it if your are not running in k8s environment. In that case your health check file will be named randomly and you cannot check health with provided script. If you are running in k8s, then file name will be made ofHOSTNAME
env variable a.k.a. pod id.
IMPORTANT: Consider putting your health check into separate file to prevent useless imports during health check script execution.
FAQ
- Why do i even need
health_check_period
in FILE based health check? This parameter helps to throttle calls toupdate_health
method. By defaultupdate_health
will be called every 30 seconds. - Custom health checks
There are two options. You can inherit from
BaseFileHealthCheck
orBaseHTTPHealthCheck
. Another way is to implement class according to HealthCheck protocol. More information about protocols here.
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
File details
Details for the file health_checks-1.1.0.tar.gz
.
File metadata
- Download URL: health_checks-1.1.0.tar.gz
- Upload date:
- Size: 5.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.4 CPython/3.12.7 Linux/6.5.0-1025-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c0f9457a7cdb2b43f7d67c85a935a3a5d2766b1b6b9b58807421b3caa11368eb |
|
MD5 | ec026cc1affe46c298c18da3918aa7f2 |
|
BLAKE2b-256 | c1688ce64d176c2da6e0baf249e67132ee013dc32fee0392bfdc0a364bfffaf5 |
File details
Details for the file health_checks-1.1.0-py3-none-any.whl
.
File metadata
- Download URL: health_checks-1.1.0-py3-none-any.whl
- Upload date:
- Size: 7.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.4 CPython/3.12.7 Linux/6.5.0-1025-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c5e9a91b3da3a75290cf57da2465ebd40b06d08654febc69d1d3f5341fecff2f |
|
MD5 | 030bad799ecddae39c5de106fe8402a0 |
|
BLAKE2b-256 | 45d2829fed4c5e2e9c337ddad3df462b7f0878349f1d41062d7f2af4460e65df |