kiora/health-check-bundle
A health check bundle for Symfony/PHP applications that exposes a monitoring endpoint and runs configurable checks to report service status, helping integrate with load balancers, uptime monitors, and container probes.
kiora/health-check-bundle is still a Symfony bundle, not a Laravel package, and the release notes are pure Symfony-bundle business (compiler passes, Kubernetes probes, bundle config tree). It will not composer require cleanly into a Laravel app as a drop-in service provider. Your first step is still a decision: (a) adopt it in a Symfony service that sits next to your Laravel app, or (b) use it as a reference implementation and port the handful of classes into a Laravel health controller.composer require kiora/health-check-bundle, then add the bundle to config/bundles.php. Pin the version explicitly ("kiora/health-check-bundle": "1.1.*" or the exact tag) — 1.1.0 added config keys and two new routes in a minor release, which is exactly the kind of churn that argues against a floating constraint on a package with a single active contributor.AbstractHealthCheck base class and its new factory methods (that's the contract your custom checks extend), then the bundled controllers for /ping, /ready and the original endpoint, then the configuration tree (Configuration.php / DependencyInjection/) — the config surface grew meaningfully in 1.1.0 (groups, multiple database connections), so read it rather than assuming 1.0.0's shape. The source is still small enough to read end-to-end in ten minutes./ping to your liveness probe and /ready to your readiness probe. v1.1.0 ships both, which removes the single biggest piece of hand-rolled wiring from the 1.0.0 assessment. Point them at a load balancer target group, an uptime monitor, or a Kubernetes probe and you have 90% of the value with almost no custom code.AbstractHealthCheck (or implement the check interface), register it as a service, and let the bundle collect it via tag or autoconfigure. The new factory methods on AbstractHealthCheck cut the boilerplate for the common result shapes — healthy/unhealthy/skipped — so use them rather than constructing result objects by hand. Keep each check to one dependency — a PdoConnectionCheck, a RedisPingCheck, a DiskSpaceCheck — so a failure message tells you exactly what broke./ping and /ready serve the respective groups. This is the single most valuable change in the release — liveness checks that hit the database are the classic cause of cascading restarts, and now you don't have to hand-roll the separation.status, checks[] with name, status, message, duration_ms. Stable field names so dashboards and alerting rules don't churn when you add a check. Never rename the top-level status field.HealthController with /health/live and /health/ready actions mirroring /ping and /ready, a HealthCheck contract in app/Support/Health, checks registered via a tagged binding or a simple config array with group membership, and a HealthService that runs them and returns response()->json([...], $ok ? 200 : 503). Copy the group semantics and the response shape; skip the bundle wiring./ready after deploy and fail the release if it doesn't go green within N seconds. Still the highest-leverage use of a health endpoint and still about fifteen lines of pipeline YAML./ping and /ready are actually reachable (or deliberately disabled) behind your route/firewall setup. Read the changelog diff, not just the release title./ping or /ready. debug:container --tag=<check_tag> is the fastest way to confirm, then check the group mapping./ready at the network layer (internal-only listener, security firewall) or return generic messages publicly and log the detail.curl -i to see the HTTP code before the body — a 200 with a failed-looking body usually means the aggregator isn't mapping check status to the response code, which is a config or version issue, not a check issue. With two new endpoints in the mix, first confirm which one your probe is actually hitting; a liveness probe pointed at /ready reintroduces the cascading-restart problem the release was meant to solve.AbstractHealthCheck and its factory methods (the main one), group assignment config, the status-mapping/aggregation logic, and the route definitions for /ping and /ready if the bundle lets you override paths. If the routes aren't overridable, that's your signal to port rather than adopt.How can I help you explore Laravel packages today?