stepanenko3/laravel-system-resources
Laravel System Resources gives your app a simple way to monitor server health, exposing CPU, memory, disk, and load metrics through a clean API and dashboard so you can spot bottlenecks early and keep your application running smoothly in production.
Release under review: v1.1.1 (patch). The published notes contain only a full-changelog diff link (v1.1.0...v1.1.1) with no described features, fixes, or deprecations. Under semver, a patch bump signals no public API break, so the release itself is low-risk; the absence of structured notes is a process signal rather than a technical one.
Architecture fit. laravel-system-resources sits in the observability/ops layer of a Laravel application, not the domain layer: it exposes host-level resource data (CPU, memory, disk, load — inferred from the package name; verify against the repo README) via a service provider, publishable config, and typically a route or facade. That makes it a fit for internal admin dashboards, health-check endpoints, and pre-deploy smoke checks. It is a poor fit as a customer-facing SLA or billing source, because host-level readings are not tenant-scoped and are unreliable inside containers.
Integration feasibility. Expected to be a standard Composer install plus config publish: composer require stepanenko3/laravel-system-resources, publish config, register/enable the route or facade, add auth. Low code footprint, no database migration expected. The real effort is not wiring — it is validating that the numbers are correct on our runtime, which is a different and larger task.
Technical risk.
/proc/meminfo, free, or sysctl directly, values inside Docker/Kubernetes reflect the node, not the cgroup limit. Any alerting built on top of it would be wrong in exactly the environment where it matters most.exec/shell_exec), it introduces disable-function and PATH dependencies, plus latency per request.Key questions for the maintainer/eng review.
/proc?Stack fit. Target Laravel 10/11 on PHP 8.1+. Verify the composer.json constraints explicitly rather than assuming — patch releases do occasionally move constraints. If we run on a version outside the stated range, do not force-install with --ignore-platform-reqs; that converts a clean dependency into an untested one.
Migration path. Greenfield add-on; no data migration, no schema change, no backfill. Reversible by removing the provider and the route. This is the cheapest possible adoption shape, which argues for a time-boxed trial rather than a full design review.
Compatibility. Two gates before merge: (a) composer why-not clean against our lockfile, and (b) metric parity — capture CPU/memory/disk from the package and from the host's own tooling (cAdvisor, docker stats, or cloud monitoring) on the same host at the same moment, and record the delta. A tolerance of a few percent is fine; a factor-of-two gap means cgroup blindness and stops the rollout.
Sequencing.
auth + IP allowlist or internal-only network policy; disable it in non-internal environments.Steps 1–2 are the decision point. If parity fails inside containers, stop — do not proceed to hardening a data source we cannot trust.
Maintenance. Small surface area: one provider, one config file, one route. Pin to ~1.1.0 and treat minor bumps as reviewable, patches as auto-mergeable once we have confirmed notes exist. The maintenance burden is dominated by configuration drift across environments, not by code churn.
Support. Single-maintainer dependency with no commercial backing. Mitigations: keep the config minimal so a fork is trivial, and accept that a fork is the realistic exit path. Do not build a dependency graph on top of it — consume it at one integration point only, so replacement is a one-file change.
Scaling. The endpoint's cost scales with request rate, not data volume. If collection shells out, each call is milliseconds of process spawn overhead; at dashboard refresh rates that is tolerable, at health-check-every-second fan-out across many pods it is not. Cache readings for 10–30s and aggregate centrally rather than having every instance poll itself. Also note it scales per instance, so an N-pod fleet produces N divergent readings — normalize at the collector, not the client.
Failure modes.
| Mode | Symptom | Blast radius | Mitigation |
|---|---|---|---|
| cgroup blindness | Values match node, ignore limits | Wrong alerts, silent | Parity test; reject if it fails |
shell_exec disabled |
Empty/zero metrics, no error | False "healthy" | Explicit null handling; assert non-null in health logic |
Permission//proc absent |
Exception on request | 500 on the metrics route | Wrap in try/catch or feature-flag off |
| Route left public | Host load/topology exposed | Security | Allowlist + auth middleware, checked in CI |
| Maintainer abandonment | No security patches | Slow-burn | Pin, single integration point, fork plan |
Ramp-up. Low for a Laravel engineer: familiar provider/config/route idioms, roughly half a day to productive. The genuine ramp-up cost is on the ops side — someone must own "are these numbers true?", which requires container-runtime literacy and access to a comparable source of truth. Budget that person's time explicitly; it is the difference between a dashboard people trust and one they quietly ignore.
Recommendation. Adopt v1.1.1 for internal, low-stakes visibility only — pending (a) a readable diff or release note explaining what changed, and (b) a passing container-parity test. Do not route alerts, autoscaling, or customer-facing status through it. Confidence in this assessment is low on technical specifics (notes were empty, no repo data supplied) and moderate on operational shape; re-run the evaluation once v1.1.1's actual contents are confirmed.
How can I help you explore Laravel packages today?