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
使用方法
一旦配置,消费的消息将被跟踪并保存。这些 处理过的消息 包含大量有用信息,可以在 用户界面 或提供的工具中查看。
禁用监控
您可能想禁用某些消息的监控。有两种方法可以做到这一点
- 在派发消息时,添加
DisableMonitoringStamp
use 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
),但您也可以通过两种方式添加自己的标签
- 在派发消息时,添加一个或多个
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')])
- 将
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