I'm trying to log every message that goes through Symfony Messenger, along with every information I can gather:
- message dispatched at
<timestamp> - message handled / failed / retried at
<timestamp>
I created a subscriber for all Messenger events I'm interested in:
final readonly class MessengerAuditSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
SendMessageToTransportsEvent::class => 'onSendMessageToTransportsEvent',
WorkerMessageFailedEvent::class => 'onWorkerMessageFailedEvent',
WorkerMessageHandledEvent::class => 'onWorkerMessageHandledEvent',
WorkerMessageReceivedEvent::class => 'onWorkerMessageReceivedEvent',
WorkerMessageRetriedEvent::class => 'onWorkerMessageRetriedEvent',
];
}
// ...
}
I attach a custom stamp to the Envelope when the message is dispatched:
public function onSendMessageToTransportsEvent(SendMessageToTransportsEvent $event): void
{
$envelope = $event->getEnvelope();
$envelope = $envelope->with(new MessageIdStamp(uniqid()));
$event->setEnvelope($envelope);
// ...log the event
}
And retrieve it in subsequent events:
public function onWorkerMessageHandledEvent(WorkerMessageHandledEvent $event): void
{
$envelope = $event->getEnvelope();
$messageIdStamp = $envelope->last(MessageIdStamp::class);
// ...log the event
}
So far, so good.
Now, when a message handler itself dispatches a new message, I'd like to log the parent message ID as well, so that I can later retrieve the whole hierarchy of messages that occurred starting from a root message ID:
- ✉️ Message
1(parentnull)- Handler
- ✉️ Message
2(parent1)- Handler
- ✉️ Message
3(parent1)- Handler
- ✉️ Message
- Handler
- ✉️ Message
4(parent1)- Handler
- ✉️ Message
5(parent4)- Handler
- ✉️ Message
- Handler
- ✉️ Message
- Handler
How can I tell, from within my listener's onSendMessageToTransportsEvent() method, whether I'm already called from within another message handler?
Is there some mechanism in Messenger like the RequestStack, but for messages?
The solution involves keeping a stack of message ids in the subscriber.
The stack is: