japseyz/laravel-schedule-monitor

监控Laravel应用中的定时任务

1.0.0 2024-03-31 22:07 UTC

This package is auto-updated.

Last update: 2024-08-31 00:32:33 UTC


README

在Laravel应用中监控定时任务,并在失败时通知您。

从japseyz/laravel-schedule-monitor分支

安装

您可以通过composer安装此包

composer require japseyz/laravel-schedule-monitor

准备数据库

您必须发布并运行迁移

php artisan vendor:publish --provider="JapSeyz\ScheduleMonitor\ScheduleMonitorServiceProvider" --tag="schedule-monitor-migrations"
php artisan migrate

发布配置文件

您可以使用以下命令发布配置文件

php artisan vendor:publish --provider="JapSeyz\ScheduleMonitor\ScheduleMonitorServiceProvider" --tag="schedule-monitor-config"

这是已发布配置文件的内容

return [
    /*
     * The schedule monitor will log each start, finish and failure of all scheduled jobs.
     * After a while the `monitored_scheduled_task_log_items` might become big.
     * Here you can specify the amount of days log items should be kept.
     *
     * Use Laravel's pruning command to delete old `MonitoredScheduledTaskLogItem` models.
     * More info: https://laravel.net.cn/docs/9.x/eloquent#mass-assignment
     */
    'delete_log_items_older_than_days' => 30,

    /*
     * The date format used for all dates displayed on the output of commands
     * provided by this package.
     */
    'date_format' => 'Y-m-d H:i:s',
    
    'notify' => [
        'email' => null,
        'queue' => null,

        'failed' => true,
        'overdue' => true,
    ],

    'models' => [
        /*
         * The model you want to use as a MonitoredScheduledTask model needs to extend the
         * `JapSeyz\ScheduleMonitor\Models\MonitoredScheduledTask` Model.
         */
        'monitored_scheduled_task' => JapSeyz\ScheduleMonitor\Models\MonitoredScheduledTask::class,

        /*
         * The model you want to use as a MonitoredScheduledTaskLogItem model needs to extend the
         * `JapSeyz\ScheduleMonitor\Models\MonitoredScheduledTaskLogItem` Model.
         */
        'monitored_scheduled_log_item' => JapSeyz\ScheduleMonitor\Models\MonitoredScheduledTaskLogItem::class,
    ],
];

清理数据库

调度监控器将记录所有计划任务的每个开始、完成和失败。经过一段时间后,`monitored_scheduled_task_log_items`可能会变得很大。

使用Laravel的模型修剪功能,您可以删除旧的`MonitoredScheduledTaskLogItem`模型。在`schedule-monitor`配置文件中的`delete_log_items_older_than_days`配置的日期之前创建的模型将被删除。

// app/Console/Kernel.php

use JapSeyz\ScheduleMonitor\Models\MonitoredScheduledTaskLogItem;

class Kernel extends ConsoleKernel
{
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('model:prune', ['--model' => MonitoredScheduledTaskLogItem::class])->daily();
    }
}

同步调度

每次部署您的应用程序时,您都应该执行`schedule-monitor:sync`命令

php artisan schedule-monitor:sync

在非生产环境中,您应手动运行`schedule-monitor:sync`。您可以使用`schedule-monitor:list`命令验证是否同步正确。

注意:运行同步命令将删除除了应用程序调度以外的所有其他cron监控器。

用法

要监控您的调度,您应该首先运行`schedule-monitor:sync`。此命令将查看您的调度并在`monitored_scheduled_tasks`表中为每个任务创建一个条目。

要查看所有监控的定时任务,您可以运行`schedule-monitor:list`。此命令将列出所有监控的定时任务。它将显示定时任务最后启动、完成或失败的时间。

每当调度任务开始、结束或失败时,该包都会在数据库中的`monitored_scheduled_task_log_items`表中写入一个条目。如果您想了解定时任务何时以及如何执行,可以查看该表的内容。日志项还包含其他有趣的度量,如内存使用、执行时间和更多。

逾期任务

如果您想了解逾期任务,您应将以下内容添加到`app/Console/Kernel.php`文件中。

// app/Console/Kernel.php

class Kernel extends ConsoleKernel
{
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('schedule-monitor:notify-overdue')->everyFiveMinutes();
    }
}

任务命名

调度监控器将尝试自动确定一个计划任务的名称。对于命令,这是命令名称;对于匿名作业,将使用第一个参数的类名。对于某些任务,例如计划闭包,无法自动确定名称。

要手动设置计划任务的名称,您可以在任务上附加`monitorName()`。

以下是一个示例。

// in app/Console/Kernel.php

protected function schedule(Schedule $schedule)
{
   $schedule->command('your-command')->daily()->monitorName('a-custom-name');
   $schedule->call(fn () => 1 + 1)->hourly()->monitorName('addition-closure');
}

当您更改任务的名称时,调度监控器将删除具有旧名称的监控器的所有日志项,并使用任务的新的名称创建一个新的监控器。

设置宽限期

当包检测到计划任务的最后执行未按时进行时,`schedule-monitor`列表将以红色背景显示该任务。在此截图图中,名为`your-command`的任务执行得太晚。

如果任务在预定运行时间加上宽限时间后仍未完成,则包将确定该任务运行过晚。你可以将宽限时间视为在正常情况下任务需要完成所需的时间。默认情况下,包为每个任务授予5分钟的宽限时间。

您可以通过在任务上使用graceTimeInMinutes方法来自定义宽限时间。在以下示例中,为your-command任务使用了10分钟的宽限时间。

// in app/Console/Kernel.php

protected function schedule(Schedule $schedule)
{
   $schedule->command('your-command')->daily()->graceTimeInMinutes(10);
}

忽略计划任务

您可以通过在安排任务时添加doNotMonitor来避免计划任务被监控。

// in app/Console/Kernel.php

protected function schedule(Schedule $schedule)
{
   $schedule->command('your-command')->daily()->doNotMonitor();
}

将输出存储在数据库中

您可以通过在安排任务时添加storeOutputInDb来存储输出。

// in app/Console/Kernel.php

protected function schedule(Schedule $schedule)
{
   $schedule->command('your-command')->daily()->storeOutputInDb();
}

输出将存储在monitored_scheduled_task_log_items表中,在meta列的output键中。

当计划任务未能及时完成时接收通知

当计划任务未能及时完成时,此包将自动向您发送电子邮件。要启用此功能,您应在配置文件中设置notify_email键。

以下是一个示例,如果任务在00:10之前未完成,则会发送通知。

// in app/Console/Kernel.php

protected function schedule(Schedule $schedule)
{
   $schedule->command('your-command')->daily()->graceTimeInMinutes(10);
}

不受支持的方法

目前,此包不适用于使用以下方法的任务

  • between
  • unlessBetween
  • when
  • skip

测试

composer test

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件