romanzipp/Laravel-Queue-Monitor: Monitoring Laravel Jobs with your Database
Laravel には非同期実行用のキューという仕組みがあります。これは主に同期的(大体 HTTP リクエストです)に実行すべきことを定義した Job クラスの呼び出しを Queue(Redis, データベースなど実装は色々)に保存し、 Worker(コマンドラインのプロセス)が適宜 Queue から Job を取り出して実行するという仕組みです。
キュー 8.x Laravel
要件によっては割と重要な位置を占める機能なのですが、デフォルトではどこでどのプロセスが今何をしているのか追うのが手間です。主な理由としては、Job, Queue, Worker がコードで直接つながっていない、それぞれが好き勝手なタイミングで動いているように見える、といったあたりがあげられます。これを簡単に解決するためにはキューをいい感じに可視化するソフトが欲しくなります。Laravel 公式のそういったソフトないしライブラリとしては Horizon と Telescope があります。しかしながら Horizon は Redis を Queue としたキューの可視化にしか使えず、Telescope はキューの可視化以外の機能が山盛りでキューについてのみ知りたい時はいささか冗長です。
Laravel Horizon 8.x Laravel
Laravel Telescope 8.x Laravel
Laravel-Queue-Monitor はいい感じにその隙間に入ります。Laravel-Queue-Monitor ではデータベースを Queue にしたキューにも対応しており、大がかりな準備は不要です。
romanzipp/Laravel-Queue-Monitor: Monitoring Laravel Jobs with your Database
準備は、次コマンドでインストールして
composer require romanzipp/laravel-queue-monitor
次コマンドで必要な設定ファイルとテーブル定義マイグレーションをダンプして
php artisan vendor:publish --provider="romanzipp\QueueMonitor\Providers\QueueMonitorProvider"
次コマンドでマイグレーションを実行して
php artisan migration
次の様にルーティング定義を記述するのみです。
/** Route::prefix('jobs')->group(function () { Route::queueMonitor(); }); */ // ↑でも動くらしいのですが、自分はダメでしたので↓の様に直定義しました // app/Providers/RouteServiceProvider.php // よくある web.php 以下では既定 namespace 定義と衝突して不便です use romanzipp\QueueMonitor\Controllers\DeleteMonitorController; use romanzipp\QueueMonitor\Controllers\PurgeMonitorsController; use romanzipp\QueueMonitor\Controllers\ShowQueueMonitorController; Route::prefix('jobs')->group(function () { Route::get('', ShowQueueMonitorController::class)->name('queue-monitor::index'); if (config('queue-monitor.ui.allow_deletion')) { Route::delete('monitors/{monitor}', DeleteMonitorController::class)->name('queue-monitor::destroy'); } if (config('queue-monitor.ui.allow_purge')) { Route::delete('purge', PurgeMonitorsController::class)->name('queue-monitor::purge'); } });
こうすれば、後は見たい Job クラスに次の様に監視することを定義した trait を use させるだけで、キューの監視が始まります。
use romanzipp\QueueMonitor\Traits\IsMonitored; class ExampleJob implements ShouldQueue { use IsMonitored; }
監視の結果は先に定義した URL のページから見ることができ、次画像の様に今どの Job がどれだけどの様に走っているか、過去どの様に動いていたか分かるようになります。