zenstruck/messenger-monitor-bundle

内置UI,用于监控您的Messenger工作者、传输、调度和消息。

支持包维护!
kbond

安装次数: 81,371

依赖关系: 0

建议者: 0

安全: 0

星标: 152

关注者: 7

分支: 16

开放问题: 43

类型:symfony-bundle

v0.4.0 2024-07-24 19:02 UTC

This package is auto-updated.

Last update: 2024-09-16 01:38:17 UTC


README

CI codecov

内置UI,用于监控您的Messenger工作者、传输、调度和消息。

Screenshot

如果包中的UI不符合您的喜好,您可以使用提供的工具轻松构建自己的UI。

安装

composer require zenstruck/messenger-monitor-bundle

messenger:monitor 命令

无需配置,您可以运行 messenger:monitor 命令来查看正在运行的工作者和传输的信息。如果已配置存储,它将显示一个历史快照,其周期可以使用 --period 选项自定义。

存储

注意

此步骤是使用 用户界面历史记录 的必要步骤。

注意

当前仅 Doctrine ORM 可用作为存储引擎。

配置

  1. 在您的应用程序中创建一个扩展 Zenstruck\Messenger\Monitor\History\Model\ProcessedMessageProcessedMessage 实体

    // src/Entity/ProcessedMessage.php
    
    namespace App\Entity;
    
    use Zenstruck\Messenger\Monitor\History\Model\ProcessedMessage as BaseProcessedMessage;
    use Doctrine\ORM\Mapping as ORM;
    
    #[ORM\Entity(readOnly: true)]
    #[ORM\Table('processed_messages')]
    class ProcessedMessage extends BaseProcessedMessage
    {
        #[ORM\Id]
        #[ORM\GeneratedValue]
        #[ORM\Column]
        private ?int $id = null;
    
        public function id(): ?int
        {
            return $this->id;
        }
    }
  2. 将实体类添加到包配置中

    # config/packages/zenstruck_messenger_monitor.yaml
    
    zenstruck_messenger_monitor:
        storage:
            orm:
                entity_class: App\Entity\ProcessedMessage
  3. 清除缓存

    bin/console cache:clear
  4. 创建并执行迁移

    bin/console doctrine:migrations:diff
    bin/console doctrine:migrations:migrate

使用方法

一旦配置,消费的消息将被跟踪并保存。这些 处理过的消息 包含大量有用信息,可以在 用户界面 或提供的工具中查看。

禁用监控

您可能想禁用某些消息的监控。有两种方法可以做到这一点

  1. 在派发消息时,添加 DisableMonitoringStamp
    use Zenstruck\Messenger\Monitor\Stamp\DisableMonitoringStamp;
    
    /** @var \Symfony\Component\Messenger\MessageBusInterface $bus */
    
    $bus->dispatch(new MyMessage(), [new DisableMonitoringStamp()])
  2. DisableMonitoringStamp 作为类属性添加到您的消息中
    use Zenstruck\Messenger\Monitor\Stamp\DisableMonitoringStamp;
    
    #[DisableMonitoringStamp]
    class MyMessage
    {
    }
  3. 您可能想禁用未处理的消息的监控。您可以使用带有可选构造参数 trueDisableMonitoringStamp 来实现这一点
    use Zenstruck\Messenger\Monitor\Stamp\DisableMonitoringStamp;
    
    #[DisableMonitoringStamp(onlyWhenNoHandler: true)]
    class MyMessage
    {
    }

描述

存储的 ProcessedMessage 有一个描述属性。这有助于在用户界面中区分消息。默认情况下,这是消息对象的 字符串化 版本(如果它实现了 \Stringable)。您可以添加 DescriptionStamp 来自定义

use Zenstruck\Messenger\Monitor\Stamp\DescriptionStamp;

/** @var \Symfony\Component\Messenger\MessageBusInterface $bus */

$bus->dispatch(new MyMessage(), [new DescriptionStamp('some custom description')])

标签

为了帮助过滤处理过的消息,它们可以有一个或多个 标签。一些标签是自动添加的(例如,如果它是计划的消息,则添加 schedule),但您也可以通过两种方式添加自己的标签

  1. 在派发消息时,添加一个或多个 TagStamp
    use Zenstruck\Messenger\Monitor\Stamp\TagStamp;
    
    /** @var \Symfony\Component\Messenger\MessageBusInterface $bus */
    
    $bus->dispatch(new MyMessage(), [new TagStamp('tag-1'), new TagStamp('tag-2')])
  2. TagStamp 作为类属性添加到您的消息中
    use Zenstruck\Messenger\Monitor\Stamp\TagStamp;
    
    #[TagStamp('tag-1')]
    #[TagStamp('tag-2')]
    class MyMessage
    {
    }

messenger:monitor:purge 命令

如果您的应用程序处理大量消息,处理过的消息数据库表会变得非常大。使用 messenger:monitor:purge 清除早于特定日期的消息:请参阅 Period 了解允许的值。

bin/console messenger:monitor:purge # by default, purges all messages older than 1 month

bin/console messenger:monitor:purge --older-than all
bin/console messenger:monitor:purge --older-than 1-day
bin/console messenger:monitor:purge --older-than 1-week

bin/console messenger:monitor:purge --exclude-schedules # ignore messages tagged with "schedule"

注意

使用 symfony/schedulerRunCommandMessage 将此命令计划为每日运行。

messenger:monitor:schedule:purge 命令

如果使用 symfony/scheduler,您可能希望保留一定数量的这些消息,因为它们可能运行非常频繁。当运行 messenger:monitor:purge 时,添加 --exclude-schedules 选项以避免删除调度历史。然后运行 messenger:monitor:schedule:purge 以保留特定数量(默认为10)的 任务运行历史

bin/console messenger:monitor:schedule:purge # by default, keeps 10 runs for each task

bin/console messenger:monitor:schedule:purge --keep 5 # keep only 5

使用 --remove-orphans 选项来删除不再与调度关联的调度任务运行。

bin/console messenger:monitor:schedule:purge --remove-orphans

注意

使用 symfony/schedule 将此命令调度为每天运行,并使用 RunCommandMessage

用户界面

注意

存储 必须为此功能进行配置。

在您的应用中创建一个继承自 Zenstruck\Messenger\Monitor\Controller\MessengerMonitorController 的控制器

// src/Controller/MessengerMonitorController.php

namespace App\Controller;

use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Attribute\IsGranted;
use Zenstruck\Messenger\Monitor\Controller\MessengerMonitorController as BaseMessengerMonitorController;

#[Route('/admin/messenger')] // path prefix for the controllers
#[IsGranted('ROLE_ADMIN')] // alternatively, use a firewall
final class MessengerMonitorController extends BaseMessengerMonitorController
{
}

现在您可以通过 /admin/messenger 或路由 zenstruck_messenger_monitor_dashboard 访问仪表板。

警告

重要的是,您的 MessengerMonitorController 只能由网站管理员访问,因为它包含敏感的应用程序信息。使用上面显示的 IsGranted 属性,并/或确保控制器位于一个 受控防火墙 后面,该防火墙只允许网站管理员访问。

注意

安装 knplabs/knp-time-bundlecomposer require knplabs/knp-time-bundle)以在 UI 中显示更友好的时间和持续时间。

注意

安装 lorisleiva/cron-translatorcomposer require lorisleiva/cron-translator)以在 UI 中显示更友好的 CRON 值。

高级使用

Workers 服务

WorkerInfo

Transports 服务

TransportInfo

QueuedMessage

Schedules 服务

ScheduleInfo

TaskInfo

MessageInfo

TriggerInfo

History

注意

存储 必须为此功能进行配置。

Storage 服务

规范

快照

其他

隐藏日志条目

当您运行 php bin/console messenger:consume async [-vv] 时,您会看到很多这样的消息。

[cache] Lock acquired, now computing item "zenstruck_messenger_monitor.worker.xxx" ["key" => "zenstruck_messenger_monitor.worker.xxx"]

如果您不想显示它们,可以在 config/packages/monolog.yaml 中的 console-channels 添加 "!cache" 来禁用它们。

when@dev:
  monolog:
    handlers:
      #...
      console:
        #...
          channels: ["!event", "!doctrine", "!console", "!cache"]

完整默认包配置

zenstruck_messenger_monitor:
    live_components:
        enabled:              false

        # Role required to view live components.
        role:                 ROLE_MESSENGER_MONITOR
    storage:
        orm:

            # Your Doctrine entity class that extends "Zenstruck\Messenger\Monitor\History\Model\ProcessedMessage"
            entity_class:         ~
    cache:
      pool: app.cache # If using workers in docker. You can use shared cache pool for all workers
      expired_worker_ttl:  3600