This package offers monitoring like Laravel Horizon for MongoDB database queue.
This package is a fork of romanzipp's laravel-queue-monitor
This package require Jenssegers laravel-mongodb
- Monitor jobs like Laravel Horizon for any queue
- Handle failing jobs with storing exception
- Monitor job progress
- Get an estimated time remaining for a job
- Store additional data for a job monitoring
composer require sbourdette/laravel-mongo-queue-monitor
Copy configuration & migration to your project:
php artisan vendor:publish --provider="sbourdette\MongoQueueMonitor\Providers\MongoQueueMonitorProvider"
Migrate the Queue Monitoring table. The table name can be configured in the config file or via the published migration.
php artisan migrate
To monitor a job, simply add the sbourdette\MongoQueueMonitor\Traits\IsMonitored
Trait.
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use sbourdette\MongoQueueMonitor\Traits\IsMonitored; // <---
class ExampleJob implements ShouldQueue
{
use Dispatchable;
use InteractsWithQueue;
use Queueable;
use SerializesModels;
use IsMonitored; // <---
}
Important! You need to implement the Illuminate\Contracts\Queue\ShouldQueue
interface to your job class. Otherwise, Laravel will not dispatch any events containing status information for monitoring the job.
You can enable the optional UI routes by calling Route::queueMonitor()
inside your route file, similar to the official ui scaffolding.
Route::prefix('jobs')->group(function () {
Route::queueMonitor();
});
Route | Action |
---|---|
/ |
Show the jobs table |
See the full configuration file for more information.
You can set a progress value (0-100) to get an estimation of a job progression.
use Illuminate\Contracts\Queue\ShouldQueue;
use sbourdette\MongoQueueMonitor\Traits\IsMonitored;
class ExampleJob implements ShouldQueue
{
use IsMonitored;
public function handle()
{
$this->queueProgress(0);
// Do something...
$this->queueProgress(50);
// Do something...
$this->queueProgress(100);
}
}
A common scenario for a job is iterating through large collections.
This example job loops through a large amount of users and updates it's progress value with each chunk iteration.
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Database\Eloquent\Collection;
use sbourdette\MongoQueueMonitor\Traits\IsMonitored;
class ChunkJob implements ShouldQueue
{
use IsMonitored;
public function handle()
{
$usersCount = User::count();
$perChunk = 50;
User::query()
->chunk($perChunk, function (Collection $users) use ($perChunk, $usersCount) {
$this->queueProgressChunk($usersCount‚ $perChunk);
foreach ($users as $user) {
// ...
}
});
}
}
To avoid flooding the database with rapidly repeating update queries, you can set override the progressCooldown
method and specify a length in seconds to wait before each progress update is written to the database. Notice that cooldown will always be ignore for the values 0, 25, 50, 75 and 100.
use Illuminate\Contracts\Queue\ShouldQueue;
use sbourdette\MongoQueueMonitor\Traits\IsMonitored;
class LazyJob implements ShouldQueue
{
use IsMonitored;
public function progressCooldown(): int
{
return 10; // Wait 10 seconds between each progress update
}
}
This package also allows setting custom data in array syntax on the monitoring model.
use Illuminate\Contracts\Queue\ShouldQueue;
use sbourdette\MongoQueueMonitor\Traits\IsMonitored;
class CustomDataJob implements ShouldQueue
{
use IsMonitored;
public function handle()
{
$this->queueData(['foo' => 'Bar']);
// WARNING! This is overriding the monitoring data
$this->queueData(['bar' => 'Foo']);
// To preserve previous data and merge the given payload, set the $merge parameter true
$this->queueData(['bar' => 'Foo'], true);
}
}
In order to show custom data on UI you need to add this line under config/queue-monitor.php
'ui' => [
...
'show_custom_data' => true,
...
]
You can override the keepMonitorOnSuccess()
method to only store failed monitor entries of an executed job. This can be used if you only want to keep failed monitors for jobs that are frequently executed but worth to monitor. Alternatively you can use Laravel's built in failed_jobs
table.
use Illuminate\Contracts\Queue\ShouldQueue;
use sbourdette\MongoQueueMonitor\Traits\IsMonitored;
class FrequentSucceedingJob implements ShouldQueue
{
use IsMonitored;
public static function keepMonitorOnSuccess(): bool
{
return false;
}
}
use sbourdette\MongoQueueMonitor\Models\Monitor;
$job = Monitor::query()->first();
// Check the current state of a job
$job->isFinished();
$job->hasFailed();
$job->hasSucceeded();
// Exact start & finish dates with milliseconds
$job->getStartedAtExact();
$job->getFinishedAtExact();
// If the job is still running, get the estimated seconds remaining
// Notice: This requires a progress to be set
$job->getRemainingSeconds();
$job->getRemainingInterval(); // Carbon\CarbonInterval
// Retrieve any data that has been set while execution
$job->getData();
// Get the base name of the executed job
$job->getBasename();
use sbourdette\MongoQueueMonitor\Models\Monitor;
// Filter by Status
Monitor::failed();
Monitor::succeeded();
// Filter by Date
Monitor::lastHour();
Monitor::today();
// Chain Scopes
Monitor::today()->failed();
This package is a fork of romanzipp's laravel-queue-monitor