Skip to content

Commit 070486e

Browse files
katchmkste93cry
andauthored
Log the bus name, receiver name and message class name when using Symfony Messenger (#492)
Co-authored-by: Stefano Arlandini <[email protected]>
1 parent 471b9e2 commit 070486e

File tree

3 files changed

+63
-14
lines changed

3 files changed

+63
-14
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## Unreleased
44

5+
- Log the bus name, receiver name and message class name as event tags when using Symfony Messenger (#492)
56
- Make the transport factory configurable in the bundle's config (#504)
67
- Add the `sentry_trace_meta()` Twig function to print the `sentry-trace` HTML meta tag (#510)
78
- Make the list of commands for which distributed tracing is active configurable (#515)

src/EventListener/MessengerListener.php

+23-7
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44

55
namespace Sentry\SentryBundle\EventListener;
66

7+
use Sentry\Event;
78
use Sentry\State\HubInterface;
9+
use Sentry\State\Scope;
810
use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
911
use Symfony\Component\Messenger\Event\WorkerMessageHandledEvent;
1012
use Symfony\Component\Messenger\Exception\HandlerFailedException;
13+
use Symfony\Component\Messenger\Stamp\BusNameStamp;
1114

1215
final class MessengerListener
1316
{
@@ -45,15 +48,28 @@ public function handleWorkerMessageFailedEvent(WorkerMessageFailedEvent $event):
4548
return;
4649
}
4750

48-
$error = $event->getThrowable();
51+
$this->hub->withScope(function (Scope $scope) use ($event): void {
52+
$envelope = $event->getEnvelope();
53+
$exception = $event->getThrowable();
4954

50-
if ($error instanceof HandlerFailedException) {
51-
foreach ($error->getNestedExceptions() as $nestedException) {
52-
$this->hub->captureException($nestedException);
55+
$scope->setTag('messenger.receiver_name', $event->getReceiverName());
56+
$scope->setTag('messenger.message_class', \get_class($envelope->getMessage()));
57+
58+
/** @var BusNameStamp|null $messageBusStamp */
59+
$messageBusStamp = $envelope->last(BusNameStamp::class);
60+
61+
if (null !== $messageBusStamp) {
62+
$scope->setTag('messenger.message_bus', $messageBusStamp->getBusName());
5363
}
54-
} else {
55-
$this->hub->captureException($error);
56-
}
64+
65+
if ($exception instanceof HandlerFailedException) {
66+
foreach ($exception->getNestedExceptions() as $nestedException) {
67+
$this->hub->captureException($nestedException);
68+
}
69+
} else {
70+
$this->hub->captureException($exception);
71+
}
72+
});
5773

5874
$this->flushClient();
5975
}

tests/EventListener/MessengerListenerTest.php

+39-7
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,17 @@
77
use PHPUnit\Framework\MockObject\MockObject;
88
use PHPUnit\Framework\TestCase;
99
use Sentry\ClientInterface;
10+
use Sentry\Event;
1011
use Sentry\SentryBundle\EventListener\MessengerListener;
1112
use Sentry\SentryBundle\Tests\End2End\App\Kernel;
1213
use Sentry\State\HubInterface;
14+
use Sentry\State\Scope;
1315
use Symfony\Component\Messenger\Envelope;
1416
use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
1517
use Symfony\Component\Messenger\Event\WorkerMessageHandledEvent;
1618
use Symfony\Component\Messenger\Exception\HandlerFailedException;
1719
use Symfony\Component\Messenger\MessageBusInterface;
20+
use Symfony\Component\Messenger\Stamp\BusNameStamp;
1821

1922
final class MessengerListenerTest extends TestCase
2023
{
@@ -37,14 +40,23 @@ protected function setUp(): void
3740
/**
3841
* @dataProvider handleWorkerMessageFailedEventDataProvider
3942
*
40-
* @param \Throwable[] $exceptions
43+
* @param \Throwable[] $exceptions
44+
* @param array<string, string> $expectedTags
4145
*/
42-
public function testHandleWorkerMessageFailedEvent(array $exceptions, WorkerMessageFailedEvent $event): void
46+
public function testHandleWorkerMessageFailedEvent(array $exceptions, WorkerMessageFailedEvent $event, array $expectedTags): void
4347
{
4448
if (!$this->supportsMessenger()) {
4549
$this->markTestSkipped('Messenger not supported in this environment.');
4650
}
4751

52+
$scope = new Scope();
53+
54+
$this->hub->expects($this->once())
55+
->method('withScope')
56+
->willReturnCallback(function (callable $callback) use ($scope): void {
57+
$callback($scope);
58+
});
59+
4860
$this->hub->expects($this->exactly(\count($exceptions)))
4961
->method('captureException')
5062
->withConsecutive(...array_map(static function (\Throwable $exception): array {
@@ -57,6 +69,10 @@ public function testHandleWorkerMessageFailedEvent(array $exceptions, WorkerMess
5769

5870
$listener = new MessengerListener($this->hub);
5971
$listener->handleWorkerMessageFailedEvent($event);
72+
73+
$sentryEvent = $scope->applyToEvent(Event::createEvent());
74+
75+
$this->assertSame($expectedTags, $sentryEvent->getTags());
6076
}
6177

6278
/**
@@ -74,18 +90,34 @@ public function handleWorkerMessageFailedEventDataProvider(): \Generator
7490
new \Exception(),
7591
];
7692

77-
yield [
93+
yield 'envelope.throwable INSTANCEOF HandlerFailedException' => [
7894
$exceptions,
7995
$this->getMessageFailedEvent($envelope, 'receiver', new HandlerFailedException($envelope, $exceptions), false),
96+
[
97+
'messenger.receiver_name' => 'receiver',
98+
'messenger.message_class' => \get_class($envelope->getMessage()),
99+
],
80100
];
81101

82-
$exceptions = [
83-
new \Exception(),
102+
yield 'envelope.throwable INSTANCEOF Exception' => [
103+
[$exceptions[0]],
104+
$this->getMessageFailedEvent($envelope, 'receiver', $exceptions[0], false),
105+
[
106+
'messenger.receiver_name' => 'receiver',
107+
'messenger.message_class' => \get_class($envelope->getMessage()),
108+
],
84109
];
85110

86-
yield [
87-
$exceptions,
111+
$envelope = new Envelope((object) [], [new BusNameStamp('bus.foo')]);
112+
113+
yield 'envelope.stamps CONTAINS BusNameStamp' => [
114+
[$exceptions[0]],
88115
$this->getMessageFailedEvent($envelope, 'receiver', $exceptions[0], false),
116+
[
117+
'messenger.receiver_name' => 'receiver',
118+
'messenger.message_class' => \get_class($envelope->getMessage()),
119+
'messenger.message_bus' => 'bus.foo',
120+
],
89121
];
90122
}
91123

0 commit comments

Comments
 (0)