Skip to main content

Drop-in Flask health blueprint: /healthz + /readyz, ready for Huginn / UptimeRobot-style monitoring.

Project description

🩺 flask-vitals

A drop-in Flask health blueprint — /healthz (liveness) + /readyz (readiness) in two lines.

PyPI CI License: MIT Python 3.14+ Flask Ruff Checked with mypy PRs welcome


Every service needs the same two endpoints — "are you alive?" and "can you serve?" — yet everyone re-writes them, slightly differently, in every app. flask-vitals is the boring, correct version you register once:

from flask_vitals import vitals

app.register_blueprint(vitals())

…and now GET /healthz and GET /readyz answer exactly the way orchestrators (Kubernetes), load balancers, and external monitors (Huginn, UptimeRobot, Uptime Kuma) expect.

✨ Features

  • Liveness vs. readiness, done right/healthz says the process is up; /readyz says it can actually serve (its dependencies are reachable).
  • Injected checks — readiness probes your DB / cache / queue via callables you provide; the library never reaches into your stack.
  • Honest status codes/readyz returns 503 with a per-check breakdown when something is down, so "up but broken" is caught.
  • Zero config to start, fully tunable — custom paths, an optional version string, any number of named checks.
  • Tiny & typed — one module, no dependency beyond Flask, mypy --strict, 100 % tested. MIT-licensed.

📦 Install

pip install flask-vitals
# or
uv add flask-vitals

🚀 Quickstart

from flask import Flask
from sqlalchemy import text
from flask_vitals import vitals

app = Flask(__name__)

def db_ok() -> None:
    db.session.execute(text("SELECT 1"))   # raises → not ready

app.register_blueprint(vitals(checks={"db": db_ok}, version="1.4.2"))
Request Response Code
GET /healthz {"status": "ok", "version": "1.4.2"} 200
GET /readyz {"ready": true, "checks": {"db": true}} 200
GET /readyz {"ready": false, "checks": {"db": false}} (db unreachable) 503

A check passes unless it returns False or raises — so a one-liner like lambda: cache.ping() is a valid check.

Options

Argument Default Purpose
checks {} {name: callable} readiness probes
version None echoed by /healthz when set
liveness_path /healthz liveness route
readiness_path /readyz readiness route
name "vitals" blueprint name (change if registered twice)

📡 Monitoring it (e.g. with Huginn)

Point an uptime monitor at each app:

  • an HTTP monitor on …/healthz — expected status 200is it alive?
  • a keyword monitor on …/readyz containing "ready": trueis it serving?

That's the UptimeRobot/Uptime-Kuma experience for any Flask app, with no bespoke health code per service.

🛠️ Develop

uv sync
uv run ruff format --check .
uv run ruff check .
uv run mypy
uv run pytest

🧱 Architecture

One module, flask_vitals.blueprint, exposing vitals(...) -> flask.Blueprint. No global state, no dependency beyond Flask; readiness checks are injected by the host app, so the library stays decoupled from your stack and trivially testable.

🤝 Contributing

Issues and PRs are welcome! Keep it small and tested:

  1. uv sync
  2. Make your change with a test.
  3. uv run ruff format . && uv run ruff check . && uv run mypy && uv run pytest
  4. Open a PR.

📄 License

MIT © Clara Vanacker

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

flask_vitals-0.1.1.tar.gz (5.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

flask_vitals-0.1.1-py3-none-any.whl (6.1 kB view details)

Uploaded Python 3

File details

Details for the file flask_vitals-0.1.1.tar.gz.

File metadata

  • Download URL: flask_vitals-0.1.1.tar.gz
  • Upload date:
  • Size: 5.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for flask_vitals-0.1.1.tar.gz
Algorithm Hash digest
SHA256 4d7bbd118d338e9aa7d91d2f7b542c2af05e0e5b4178e11fadd83f6b52244ecd
MD5 60ba63d2a9f281ded4e4ed5ef65c8462
BLAKE2b-256 8be9e97603c7ce3d8aa86d5cc84340e0b22a6e4ab08154d21e58131343dcca19

See more details on using hashes here.

Provenance

The following attestation bundles were made for flask_vitals-0.1.1.tar.gz:

Publisher: workflow.yml on ClaraVnk/flask-vitals

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file flask_vitals-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: flask_vitals-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 6.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for flask_vitals-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 edba25a108032237c2f62a54f2c45bbb2503f77169be648115809c652849fcba
MD5 f5046bfbb8e4c1995e33fde61881b44f
BLAKE2b-256 7cfb1922698043a8e395a4afe4f325afa05ef0e57051cf24bf7c0e789a34c2d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for flask_vitals-0.1.1-py3-none-any.whl:

Publisher: workflow.yml on ClaraVnk/flask-vitals

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page