Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Health Check Bundle Laravel Package

smartassert/health-check-bundle

Symfony bundle that adds a configurable health-check endpoint to your app. Define checks for databases, cache, and custom services, then expose a JSON status report for load balancers and monitoring systems.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. This is a Symfony bundle, not a Laravel package, and that distinction still drives the entire assessment. It integrates through Symfony's Kernel, bundles.php registration, a DI extension/compiler pass, tagged health_check services, and a routing loader. Laravel has no bundle concept, no Kernel::registerBundles(), and no equivalent routing/config loaders — a Laravel application cannot install and boot this package as designed. What is portable is the core domain model: a health-check interface, a collection/aggregator, and individual checks (database connectivity, Redis, etc.) that return a result object mapped to an HTTP status. That model maps cleanly onto Laravel's container, but only via extraction or a fork, not via composer require. Release 8.2 does not change this. It is a constraint-widening release (symfony ^7 || ^8), not an architectural one; nothing in the integration surface described above moves.

Integration feasibility.

  • Symfony host: straightforward, and now more durable than at the time of the prior assessment. Composer install, bundle registration, tag your check services, expose routes behind your firewall. Half a day to a day for a working endpoint; the surface area is small enough to read end-to-end.
  • Laravel host: not feasible as-is. Viable path is (a) extract the interfaces + collection + a controller into a small in-house package under a service provider, or (b) adopt spatie/laravel-health and skip this dependency. Extraction is roughly 1–3 engineer-days including adapters for your own checks and tests, because the reusable code is thin — you are buying a shape, not a system.
  • The bundle's own framework dependencies (symfony/framework-bundle, symfony/http-kernel, symfony/routing) will drag a parallel framework stack into a Laravel app if you try to install it directly. Do not.

Technical risk.

  • What 8.2 changes — positively. The single most actionable unknown in the prior assessment was the supported Symfony range; a package pinned narrowly becomes a blocker at the next framework upgrade. 8.2 explicitly declares ^7 || ^8, which is forward-looking rather than merely current, and it demonstrates that the maintainer ships compatibility bumps rather than letting the package rot. That is the strongest signal emitted by this repository to date, and it materially de-risks the Symfony host path.
  • What 8.2 changes — negatively / ambiguously. Shipping a Symfony constraint change as a patch-level bump (8.1 → 8.2) is a semver smell. If the previous constraint was ^6 || ^7, then 8.2 drops Symfony 6 — a breaking change for anyone on 6, released under a non-major version. We cannot confirm the before/after constraints from the release note alone. This matters operationally: an unpinned caret range in a lockfile-driven upgrade could silently move a Symfony 6 app off support. Treat constraint changes here as potentially breaking until verified.
  • Single-maintainer / low-signal package. Still 1 star, 0 dependents, one publishing organization (SmartAssert) that is also its primary consumer. The API is shaped by their internal needs and their CI, not by a community. There remains no third-party production evidence to borrow confidence from — activity is not the same as adoption, and one committed maintainer is still a bus factor of 1.
  • Version constraints partially resolved. Symfony range is now known; PHP range is not, and Symfony 8 implies a higher PHP floor than Symfony 6 did. The support matrix (which PHP × Symfony combinations are exercised in CI) is still not visible to us.
  • Health endpoints are security-relevant surface. Their value is highest exactly when they are reachable by infrastructure, which is where information disclosure and unauthenticated dependency probing live. Unchanged by this release.
  • Score alignment. A small upward revision is defensible on maintenance-velocity grounds alone; the adoption evidence is unchanged, so the ceiling is low. This release narrows the maintenance risk and leaves the adoption risk exactly where it was.

Key questions.

  1. What was the Symfony constraint in 8.1, and is the 8.1 → 8.2 bump additive (widening) or a replacement (dropping Symfony 6)? Is that documented as a BC policy?
  2. What is the PHP floor now that Symfony 8 is in range, and is the full PHP × Symfony matrix exercised in CI?
  3. Is there a documented deprecation policy, or will future constraint changes also ship as minor/patch releases?
  4. What is the response contract — JSON body, plain text, per-check status codes, or a single aggregate 200/500? Can it distinguish liveness from readiness?
  5. Are per-check timeouts and failure isolation built in, or does one hanging dependency block the response?
  6. Is there any authorization, IP allowlisting, or token support on the routes, or is access control entirely delegated to the host app's firewall?
  7. What is emitted on failure — exception messages, DSNs, stack traces? Is there a sanitized error mode?
  8. Are checks taggable/groupable (critical vs. degraded), and can a check report warning vs. failure?
  9. What is the stability commitment on the HealthCheckInterface and the result model if we build adapters against them?

Integration Approach

Stack fit. Treat this as a reference design, not a dependency, if you are on Laravel. The portable pieces — a check interface, an aggregator that short-circuits, a result-to-HTTP mapping, and a routing surface under /health and /health/{check} — are each under a few hundred lines. If you are on Symfony 7 or 8, it fits natively, and 8.2 means it fits your upgrade roadmap too, which is the more useful property.

Migration path. Do not rip out existing probes. Stand up the new endpoint in parallel and shadow it:

  1. Add the endpoint at a non-production-critical path.
  2. Point your existing monitoring at it in addition to the current check, compare results for one to two weeks.
  3. Only then repoint load balancer / orchestrator probes, one consumer at a time (readiness first, then any external uptime monitor).

Compatibility.

  • Symfony 7/8 hosts: this release makes adoption credible. Pin the constraint deliberately rather than floating — given the patch-level constraint change in 8.2, an unconstrained requirement is a liability.
  • Symfony 6 hosts: verify before upgrading. If 8.2 dropped Symfony 6, you are pinned to 8.1 with no forward path, which is the exact scenario that makes extraction cheaper than waiting. Confirm from composer.json at both tags, not from the release note.
  • Laravel hosts: the pragmatic call remains spatie/laravel-health (active, Laravel-native, tagged, scheduling-aware) plus your own custom checks. The MIT license means extraction is legally trivial if you prefer to own it, but ownership has a cost the license does not show. 8.2 does nothing to change the Laravel calculus.
  • Whichever route, keep the response contract versioned and documented in your own repo so the underlying implementation can be swapped later without touching alerting config.

Sequencing.

  1. Constraint verification (hours): read composer.json at 8.1 and 8.2, diff the Symfony and PHP ranges, check CI matrix. This is now the cheapest and highest-value step.
  2. POC (½–1 day): install into a throwaway Symfony skeleton or read the source to confirm the contract and the timeout/error behaviour.
  3. Decision gate: Laravel → extract or adopt a native alternative; Symfony 7/8 → adopt; Symfony 6 → decision forced toward extraction or pinning.
  4. Adapters (1–2 days): implement checks for your actual dependencies — primary DB read, cache/Redis, queue depth via queue:monitor, critical third-party API. Keep the list to what genuinely predicts user impact; a health check that fails for a non-critical dependency trains people to ignore it.
  5. Hardening (1 day): network-level restriction, response sanitization, explicit per-check timeouts, separate liveness (process-up only) from readiness (dependencies).
  6. Observability + rollout (1 day): metrics per check, alert on readiness failure not on liveness, then shadow → flip.

Operational Impact

Maintenance. Low code volume and — as of 8.2 — demonstrated willingness to track framework majors, which is the maintenance signal that actually matters for a small package. That said, the burden you carry is still ownership: with zero dependents and one maintainer, the release cadence is one person's calendar. Budget for becoming the maintainer, formally or de facto, if this becomes load-bearing. The countervailing new risk is that constraint changes arrive as patch releases, so your upgrade hygiene must be stricter than the version numbers imply: pin explicitly, read composer.json diffs on every bump, and treat Symfony/PHP range changes as breaking until proven otherwise.

Support. GitHub issues with no SLA, no commercial backing, no published deprecation policy. Release velocity is now a genuine positive data point rather than a single encouraging sample, and Symfony 8 support specifically signals the maintainer is working ahead of the ecosystem rather than behind it — but this is one contributor responding to one framework release, and it is still an organization whose primary customer is itself.

Scaling. Health checks are cheap individually and expensive in aggregate because they are polled constantly and often redundantly: Kubernetes liveness × replicas × 10s intervals, plus a load balancer, plus an uptime monitor, plus a dashboard. Every poll that reaches a database or Redis is real load, and it arrives exactly when the dependency is already struggling. Mitigations: cache readiness results for a short TTL, cap per-check timeouts well below the probe timeout, keep dependency-aware checks out of liveness entirely, and prefer a shallow liveness probe that touches nothing.

Failure modes.

  • Cascading restarts. If dependency checks feed liveness, a database blip restarts every pod simultaneously, converting a degraded read path into a full outage. Highest-severity risk, and a configuration decision, not a package defect.
  • Constraint drift on upgrade. A patch-level Symfony range change means composer update can move you across a support boundary with no major-version signal. Lockfile review is the control.
  • Thundering herd. All replicas probe on restart and on deploy; without jitter or caching, recovery traffic concentrates.
  • Worker exhaustion. A hanging dependency check holds a PHP-FPM worker for the duration of the timeout; a slow check under load consumes capacity you need for the recovery.
  • Information disclosure. Unauthenticated, internet-reachable health endpoints commonly leak versions, DSNs, table names, or stack traces in the failure body. Restrict at the network layer; sanitize the payload to status codes.
  • False green. An aggregator that returns 200 if any check passes, or that swallows exceptions, is worse than no check — it actively suppresses alerting.

Ramp-up. An engineer familiar with Symfony reads this in well under an hour and can extend it the same day. A Laravel-only team pays an extra half-day of context switching to reason about bundles and compiler passes — which is itself an argument that the extraction path costs less than it appears, since you would rewrite the wiring anyway.

Recommendation. Conditional adoption, with the Symfony path upgraded from "verify first" to "adopt if constraints match." Release 8.2 resolves the sharpest unknown in the prior assessment and demonstrates forward compatibility with Symfony 7 and 8; for a Symfony 7/8 host, that is sufficient to proceed, subject to confirming the exact range and CI matrix. For a Symfony 6 host, confirm whether 8.2 dropped support before planning an upgrade — this is the one way this release can hurt you. For a Laravel host, nothing has changed: do not install this package; treat it as a design reference and either extract the ~300 lines you need under a service provider or use a maintained Laravel-native health package. In every case the integration effort is dominated by operational hardening — liveness/readiness split, timeouts, access control, payload sanitization — not by the library choice, and that work is identical whichever path you take.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
socialdept/atp-orm
cboxdk/laravel-assistant-client
socialdept/atp-resolver
socialdept/tenant-domains
tautvydasr/blade-class-names
socialdept/color-scales
maherelgamil/controller
coleus/widgets
coleus/table
coleus/users
coleus/music
coleus/health
coleus/calendar
coleus/notes
coleus/support
coleus/settings
coleus/apps
seampact/laravel
emmyconceptng/laravel-ng-postcode
jjsquady/round-robin