laravel / horizon

Dashboard and code-driven configuration for Laravel queues.
https://laravel.com/docs/horizon
MIT License
3.88k stars 659 forks source link

Add `horizon:reset-metrics` command #1318

Closed trevorgehman closed 1 year ago

trevorgehman commented 1 year ago

Problem

If a Job is renamed or moved, it will persist in Horizon under Metrics and never be removed. This ends up cluttering the Metrics with obsolete jobs. The problem is described in https://github.com/laravel/horizon/issues/1152

CleanShot 2023-09-15 at 00 40 06@2x

Solution

The simplest solution IMO is to just add a command to reset the metrics for Horizon entirely. I've given this command the signature horizon:reset-metrics.

It will remove all metric data in Horizon's Redis database, including:

I believe I have covered everything relating to metrics without touching anything else.

Additionally, because I have to search Redis by wildcard to find some of the metrics data, I used SCAN instead of KEYS which is what Redis recommends to prevent locking issues:

Warning: consider KEYS as a command that should only be used in production environments with extreme care. It may ruin performance when it is executed against large databases. This command is intended for debugging and special operations, such as changing your keyspace layout. Don't use KEYS in your regular application code. If you're looking for a way to find keys in a subset of your keyspace, consider using SCAN...

https://redis.io/commands/keys/

After Running Command

CleanShot 2023-09-15 at 01 01 09@2x

CleanShot 2023-09-15 at 01 02 39@2x CleanShot 2023-09-15 at 01 02 42@2x
wit3 commented 1 year ago

if i try to use the command ` i receive this error :Call to undefined method Laravel\Horizon\Repositories\RedisMetricsRepository::reset()`

Maybe the command must call ::clear() instead of ::reset()

EDIT: already fixed with this commit https://github.com/laravel/horizon/commit/ded3632dca7fd66618d5b712b4a0c6c1c77ecb3f