by Danilo Polani
Track the memory usage of your workers and display them in your Filament admin dashboard.
Install the package via composer:
composer require danilopolani/filament-memory-tracker
Then publish the assets and the config of the package:
php artisan vendor:publish --tag=filament-memory-tracker-assetsphp artisan vendor:publish --tag=filament-memory-tracker-config
When upgrading be sure to republish the assets:
php artisan vendor:publish --tag=filament-memory-tracker-assets --force
There are a few notable configuration options for the package.
Key | Type | Description |
---|---|---|
cache_store |
String | Define the cache store used to track memory usage. By default it will be your CACHE_DRIVER env value. |
trackers |
Array | A list of trackers names to be displayed in the dashboard. They must be the same used in your MemoryTracker() instance. See Usage below to discover more. |
date_format |
String | The DateTime format to display dates. |
In your Worker create a new MemoryTracker
instance and then ping the track()
method every time you want. There's an example with ReactPHP Event Loop.
ℹ️ | The $realUsage flag is the same as memory_get_usage(). |
---|
<?php namespace App\Console\Commands; use DaniloPolani\FilamentMemoryTracker\MemoryTracker;use Illuminate\Console\Command;use React\EventLoop\Loop; class MyWorker extends Command{ /** * The name and signature of the console command. * * @var string */ protected $signature = 'worker:run'; /** * The memory tracker instance. * * @var MemoryTracker */ protected MemoryTracker $memoryTracker; /** * Class constructor. */ public function __construct() { parent::__construct(); $this->memoryTracker = new MemoryTracker('Worker'); } /** * Execute the console command. * * @return int */ public function handle() { // Ping every 5minutes Loop::addPeriodicTimer(60 * 5, function () { $this->memoryTracker->track(bool $realUsage = false); }); return 0; }}
Then don't forget to add your tracker name inside the configuration too:
<?php return [ // ... 'trackers' => [ 'Worker', ], ];
You can track the latest Worker restart date and memory usage as well! If you're working on a custom Worker, you should intercept the exit signals and then call the $memoryTracker->trackRestart()
method. Otherwise you can use the Trait provided by the package to achieve that:
DaniloPolani\FilamentMemoryTracker\Concerns\TracksRestart
inside your class;$this->trackRestartMemory(MemoryTracker $memoryTrackerInstance)
inside your constructor.⚠️ | The TracksRestart requires the extension pcntl to be enabled. |
---|
<?php namespace App\Console\Commands; use DaniloPolani\FilamentMemoryTracker\MemoryTracker;use DaniloPolani\FilamentMemoryTracker\Concerns\TracksRestart;use Illuminate\Console\Command;use React\EventLoop\Loop; class MyWorker extends Command{ use TracksRestart; // ... public function __construct() { parent::__construct(); $this->memoryTracker = new MemoryTracker('Worker'); $this->trackRestartMemory($this->memoryTracker); } // ...}
You can track Laravel Queue too by listening to some specific events in a provider, for example your AppServiceProvider
.
<?php namespace App\Providers; use DaniloPolani\FilamentMemoryTracker\MemoryTracker;use Filament\Filament;use Illuminate\Queue\Events\Looping;use Illuminate\Queue\Events\WorkerStopping;use Illuminate\Support\Facades\Event;use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider{ /** * Bootstrap any application services. * * @return void */ public function boot() { $memoryTracker = new MemoryTracker('Queue'); // Track memory usage Event::listen(Looping::class, function () use ($memoryTracker) { $memoryTracker->track(); }); // Track restarts Event::listen(WorkerStopping::class, function () use ($memoryTracker) { $memoryTracker->trackRestart(); }); }}
These are the available methods of the MemoryTracker
class:
Key | Description |
---|---|
track(): void |
Track the current memory usage for the worker. |
trackRestart(bool $resetPeak = true): void |
Track a restart. If $resetPeak is true, the memory peak will be purged as well. |
getHistory(): array |
Get the worker's history of memory usage. |
getPeak(): array|null |
Get the worker's memory peak. Returns null if no peak found. |
getLatestRestart(): array|null |
Get the worker's latest restart data. Returns null if no restart found. |
purge(): void |
Purge all the data of the current worker. |
purgeHistory(): void |
Purge the track history only of the current worker. |
purgePeak(): void |
Purge the memory peak of the current worker. |
purgeRestart(): void |
Purge the latest restart data of the current worker. |