ongr/monitoring-bundle
A Symfony bundle that adds health-check endpoints to your application, letting external monitoring tools query the status of services and dependencies. Useful for wiring up availability checks and exposing readiness information to uptime systems and dashboards.
Architecture fit — the framing is wrong by one framework. Despite being catalogued here as a Laravel/PHP package, ongr/monitoring-bundle is a Symfony bundle. Its distribution model is a Bundle subclass registered into the Symfony kernel, a DI Extension to load services.yml/XML, tag-based discovery of check services, and a shipped routing.yml imported with a prefix (/_monitor). Laravel has no equivalent pipeline: no kernel bundle registration, no container extension loading, no YAML service tags, no bundle-provided routes. So the packaging — which is most of the package — is non-transferable. What does transfer is the small core: a check/monitor interface, an aggregator service that runs the registered checks, and a controller that collapses their results into a single HTTP status code. Those are a few hundred lines of plain PHP.
Integration feasibility — vendorable in days, installable in zero cases. composer require should be treated as off the table. The package is Symfony 2/3-era, so expect a composer.json pinned to PHP 7.x and old symfony/* constraints that will collide with a Laravel 10/11 (PHP 8.2+) graph; making it install means --ignore-platform-reqs or constraint relaxation, both of which are how dependency debt starts. As a read-and-reimplement exercise it is genuinely cheap — a two-day spike to read vendor/ongr/monitoring-bundle/ (the interface, the aggregator, the controller) plus three to five days to rebuild it Laravel-native with tests. That is a real but bounded cost, and it competes directly against spatie/laravel-health or Laravel's built-in health route, which cost approximately nothing.
Technical risk — provenance, not craftsmanship. The code is small and boring, which is good. The risk is that 1 star / 0 dependents / 1.75 score is the signature of an open-sourced internal tool nobody maintained. Consequences: no security response, no framework-version compatibility work, no issue triage — all of that becomes ours the moment it enters the dependency tree. Secondary risk is transitives: ONGR is an Elasticsearch-centric shop, so the bundle may drag in ES client bundles for a health check that should be a SELECT 1.
Key questions to answer in the spike.
spatie/laravel-health + Pulse does not already do in ~50 lines we control?Stack fit. Poor as a dependency; adequate as a pattern to copy. The transferable design is narrow and correct: define a HealthCheck contract returning {status, message}, register implementations, aggregate, expose one route, return 200/503. That contract is the only artifact worth carrying across the framework boundary.
Migration path, in recommended order:
/up health route plus spatie/laravel-health covers checks and status codes; Pulse covers application metrics; Telescope covers local event inspection; Horizon covers queue liveness; Sentry or OpenTelemetry covers the rest. Zero ownership, maintained, already in the graph.Bundle/Extension with a ServiceProvider, replace YAML parameters with config/health.php + env(), replace route imports with Route::get(). Never reference upstream again.Compatibility. Do not add this to the main application's composer.json under any option. Spike in a scratch branch or throwaway project, and if a port proceeds, target the current PHP and Laravel versions explicitly — no legacy constraint shims. If an ONGR-based system already in the estate is the reason for interest, pin that system's version separately and keep the two graphs isolated.
Sequencing.
Maintenance. Full ownership, permanently. Upstream is effectively dead, so every PHP upgrade, every Laravel upgrade, and every CVE in the health-check path is ours to notice and fix. Budget it as a standing internal-package line item, or choose the native option and budget nothing.
Support. No docs, no community, no vendor. The internal README must state what each check means, what threshold flips it unhealthy, and who is paged — otherwise the endpoint's semantics live in one engineer's head. Bus factor is one until a second engineer has reviewed the implementation.
Scaling — this is where a health endpoint quietly becomes a load problem. Poll frequency multiplies fast: an LB polling every 5s across 20 replicas is 4 requests/second, each fanning out to database, cache, queue, and Elasticsearch checks. Mitigations: cache check results with a short TTL (10–30s), enforce a hard total budget (e.g. 2s) with per-check timeouts, run expensive checks from a single instance rather than every pod, and never let a health check do writes or unbounded queries. Also watch poll amplification during incidents — the moment a dependency degrades, every probe in the fleet hammers it simultaneously.
Failure modes.
Ramp-up. One engineer-sprint to spike, reimplement, test, and harden; a second sprint of observation before trusting it in production. Low technical ramp-up, non-trivial organisational ramp-up: you are accepting a permanent internal fork for a capability the platform now ships natively. Absent a specific requirement to match an existing ONGR system's health semantics, the correct TPM call is to close this evaluation at the discovery spike, adopt the native health/observability stack, and treat the bundle as a reference design only.
How can I help you explore Laravel packages today?