muhammadhuzaifa/laravel-pulse-guzzle-recorder
Laravel Pulse Guzzle Recorder adds a Pulse card and recorder that captures outgoing Guzzle HTTP requests—URL, method, status code, duration, and errors—so you can monitor third-party API traffic and slow dependencies right inside your Laravel Pulse dashboard. Easy to install and configure.
Architecture fit — This is a thin adapter, not a platform: a Guzzle middleware, a Pulse recorder class, and a service provider that writes into Pulse's existing slow-outgoing-request store and reuses the Slow Outgoing Requests dashboard card. That is the correct shape. Pulse already owns ingestion, retention, card rendering, and alert hooks; this package contributes only instrumentation for a traffic class Pulse cannot see — Guzzle clients constructed directly rather than through Laravel's Http facade (Stripe/AWS/OpenAI SDKs, Elasticsearch clients, legacy service wrappers). The gap is real: Pulse's built-in SlowOutgoingRequests recorder is event-based and blind to raw Guzzle usage. The package is additive, reversible, and confined to the observability layer with no coupling into domain code.
Integration feasibility — Install is a composer require, a config publish, and a recorder entry in config/pulse.php. The friction is not the package, it is Guzzle: the middleware observes only clients whose HandlerStack includes it. Apps that centralize client construction (factory, base SDK wrapper, container binding) get full coverage from one change; apps where vendors instantiate their own clients get partial coverage — and partial coverage is worse than none, because the dashboard then looks authoritative. There is also an overlap question: Http:: calls are already recorded by Pulse, so double-wrapped clients double-count. That needs an explicit exclusion rule, not a hope.
Technical risk — Concentrated in the dependency's maturity rather than its design. 17 stars, zero dependents, single maintainer, and a release date (2026-06-15) that should be confirmed as real cadence rather than metadata artifact. The coupling point is Pulse's table schema and recorder contract, which a Pulse major version can change. The code surface is small — on the order of a few hundred lines — so the dominant risk is abandonment, not complexity, and the mitigation is a cheap fork. Secondary risks: URI columns capturing tokens or query-string secrets, unbounded pulse_* table growth, middleware ordering changing what duration is actually measured, and async/pooled requests being timed incorrectly.
Key questions
SlowOutgoingRequests for Http:: traffic, or is exclusion manual?sendAsync, Pool) timed — full resolution time or time-to-first-byte?PULSE_ENABLED and non-production environments?Stack fit — Best fit is a Laravel 10/11/12 monolith or service already running Pulse as its primary APM-lite surface with meaningful third-party SDK traffic. Poor fit: teams standardized on Datadog/New Relic/OpenTelemetry (this creates a second, inconsistent telemetry path) and any non-Laravel PHP service. Treat it as filling one card, not as an observability strategy.
Migration path — Nothing to migrate; this is net-new instrumentation. The actual decision is whether Guzzle-direct traffic should be visible in the same pane as everything else (yes for most Laravel shops) versus instrumented at the SDK layer via OpenTelemetry (better if traces are already exported). Pick one; running both produces contradictory numbers.
Compatibility — Pin exact Laravel, Pulse, and Guzzle versions in composer. Confirm the app's Pulse storage driver (database vs. Redis ingestion) and that the Slow Outgoing Requests card is enabled before installing. Verify every target client exposes a handler config, and explicitly flag any SDK that builds its own handler stack internally.
Sequencing
Http::-based traffic, and prove instrumentation is exception-safe by forcing a timeout, a 5xx, and a DNS failure.Maintenance — Low ongoing effort, low bus factor. Assign an owner and a quarterly review against Pulse releases, and keep a fork ready. Because the package is small, forking is a days-not-weeks proposition and should be planned for rather than treated as a crisis. Add a contract test asserting the Pulse table schema the recorder writes to, so a Pulse upgrade fails loudly in CI instead of silently in production.
Support — Community-only, no SLA, escalation path is "we own it." Record the recorder configuration and threshold rationale in the repo so the reasoning is not in one engineer's head.
Scaling — Middleware overhead is negligible next to network I/O. The scaling concern is write volume: on high-outbound-throughput services, every slow call becomes an entry, and Pulse ingestion plus retention becomes the cost center. Mitigate with a higher threshold, sampling, and shorter retention on pulse_* tables. Above roughly thousands of outbound calls per second, this belongs in a sampled tracing pipeline instead.
Failure modes
Http:: traffic recorded twice inflates counts and corrupts threshold tuning.sendAsync may record durations that don't reflect user experience, or attribute the time to the wrong request.PULSE_ENABLED isn't respected.Ramp-up — A Laravel developer instruments the first client in under an hour. The real ramp is organizational: agreeing what "slow" means, setting thresholds per dependency, and deciding who acts on the card. Budget half a day of engineering plus a short runbook. The TPM's work here is defining the SLO and the ownership, not the integration.
How can I help you explore Laravel packages today?