Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 070486e

Browse files
katchmkste93cry
andauthored
Log the bus name, receiver name and message class name when using Symfony Messenger (getsentry#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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 23 additions & 7 deletions
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

Lines changed: 39 additions & 7 deletions
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)