zenstruck / messenger-monitor-bundle
内置UI,用于监控您的Messenger工作者、传输、调度和消息。
Requires
- php: >=8.1
- symfony/framework-bundle: ^6.4|^7.0
- symfony/messenger: ^6.4|^7.0
- zenstruck/bytes: ^1.0
- zenstruck/collection: ^0.4
Requires (Dev)
- doctrine/doctrine-bundle: ^2.10
- doctrine/orm: ^2.15|^3.1
- knplabs/knp-time-bundle: ^1.20|^2.0
- lorisleiva/cron-translator: ^0.4.3
- matthiasnoback/symfony-dependency-injection-test: ^4.3|^5.0
- phpstan/phpstan: ^1.4
- phpunit/phpunit: ^9.6.0
- symfony/asset-mapper: ^6.4|^7.0
- symfony/console: ^6.4|^7.0
- symfony/http-client-contracts: ^3.3
- symfony/mailer: ^6.4|^7.0
- symfony/phpunit-bridge: ^6.1|^7.0
- symfony/process: ^6.4|^7.0
- symfony/scheduler: ^6.4|^7.0
- symfony/security-bundle: ^6.4|^7.0
- symfony/ux-live-component: ^2.10
- symfony/var-dumper: ^6.4|^7.0
- zenstruck/console-test: ^1.5
Suggests
- knplabs/knp-time-bundle: For human readable timestamps and durations on your dashboard.
- lorisleiva/cron-translator: For human readable cron expressions on your dashboard.
- symfony/ux-live-component: For Live Components
README
内置UI,用于监控您的Messenger工作者、传输、调度和消息。
如果包中的UI不符合您的喜好,您可以使用提供的工具轻松构建自己的UI。
安装
composer require zenstruck/messenger-monitor-bundle
messenger:monitor 命令
无需配置,您可以运行 messenger:monitor 命令来查看正在运行的工作者和传输的信息。如果已配置存储,它将显示一个历史快照,其周期可以使用 --period 选项自定义。
存储
注意
注意
当前仅 Doctrine ORM 可用作为存储引擎。
配置
-
在您的应用程序中创建一个扩展
Zenstruck\Messenger\Monitor\History\Model\ProcessedMessage的ProcessedMessage实体// 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; } }
-
将实体类添加到包配置中
# config/packages/zenstruck_messenger_monitor.yaml zenstruck_messenger_monitor: storage: orm: entity_class: App\Entity\ProcessedMessage
-
清除缓存
bin/console cache:clear
-
创建并执行迁移
bin/console doctrine:migrations:diff bin/console doctrine:migrations:migrate
使用方法
一旦配置,消费的消息将被跟踪并保存。这些 处理过的消息 包含大量有用信息,可以在 用户界面 或提供的工具中查看。
禁用监控
您可能想禁用某些消息的监控。有两种方法可以做到这一点
- 在派发消息时,添加
DisableMonitoringStampuse Zenstruck\Messenger\Monitor\Stamp\DisableMonitoringStamp; /** @var \Symfony\Component\Messenger\MessageBusInterface $bus */ $bus->dispatch(new MyMessage(), [new DisableMonitoringStamp()])
- 将
DisableMonitoringStamp作为类属性添加到您的消息中use Zenstruck\Messenger\Monitor\Stamp\DisableMonitoringStamp; #[DisableMonitoringStamp] class MyMessage { }
- 您可能想禁用未处理的消息的监控。您可以使用带有可选构造参数
true的DisableMonitoringStamp来实现这一点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),但您也可以通过两种方式添加自己的标签
- 在派发消息时,添加一个或多个
TagStampuse Zenstruck\Messenger\Monitor\Stamp\TagStamp; /** @var \Symfony\Component\Messenger\MessageBusInterface $bus */ $bus->dispatch(new MyMessage(), [new TagStamp('tag-1'), new TagStamp('tag-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/scheduler 和 RunCommandMessage 将此命令计划为每日运行。
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-bundle(composer require knplabs/knp-time-bundle)以在 UI 中显示更友好的时间和持续时间。
注意
安装 lorisleiva/cron-translator(composer 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
