karo-io/messenger-monitor-bundle
A Symfony bundle for monitoring Symfony Messenger: inspect queued, processing, and failed messages, track throughput, and review errors from a built-in dashboard so you can spot bottlenecks and retry failures without digging through logs or database tables.
This is a Symfony bundle, not a Laravel package — that is the single most important thing to internalize before you spend time on it. It hooks into Symfony's DI container, Kernel, web profiler, and the Symfony Messenger component. There is no service provider, no facade, no publishable config. composer require karo-io/messenger-monitor-bundle in a Laravel app will install files you cannot meaningfully wire up without porting them.
If you still want to evaluate it:
composer create-project symfony/skeleton), add symfony/messenger and the web profiler, then enable the bundle in config/bundles.php.dev and look at the profiler toolbar — that is the intended first use case: glance at queue depth and failed messages without leaving the app.For a Laravel developer, the practical "first use case" is usually stealing ideas, not adopting the code: understand what a Messenger monitoring panel surfaces (per-transport pending count, failed transport contents) and map that to Horizon, Pulse, or a small Artisan command of your own.
The bundle is designed around the Symfony profiler lifecycle: a DataCollector snapshots transport state on each request in dev, and the profiler UI renders it. Everything else is configuration.
Patterns that make sense if you are actually on Symfony:
dev/test. Confirm consumers are running and the queue is draining while you iterate on a handler.messenger:failed:show / :retry in the console. The panel tells you that there are failures; the console is where you act.For a Laravel codebase, the honest mapping is:
php artisan queue:monitor.failed_jobs table, queue:failed, queue:retry, and the Horizon failed-jobs UI.If your team runs Symfony Messenger inside Laravel (rare, via a bridge or a legacy service), the sane integration is to wrap the bundle's conceptual checks in a small Artisan command that shells out to the transport's native introspection, rather than attempting to boot a Symfony bundle inside a Laravel container.
Bundle, Extension, Configuration, and profiler tags. Porting to Laravel means rewriting the collector and config layer — at which point you have written your own package.COUNT(*) against a Doctrine table, queue_declare (passive) against AMQP, LLEN against Redis. Doing this on every request in dev is fine; doing it per-request in production is not.bin/console debug:container --tag=data_collector to confirm the collector is registered, then check profiler storage — if the toolbar shows nothing, the collector usually was not tagged or the bundle was not enabled.DataCollector following the bundle's shape, or skip the bundle entirely and write a bin/console command that loops over messenger.transport.* services and prints counts. The command is ~30 lines and has no archive risk.How can I help you explore Laravel packages today?