8000 [Messenger][FrameworkBundle] Add option to exclude stack trace from `… · symfony/symfony@672d9be · GitHub
[go: up one dir, main page]

Skip to content

Commit 672d9be

Browse files
committed
[Messenger][FrameworkBundle] Add option to exclude stack trace from ErrorDetailsStamp
1 parent 8c941de commit 672d9be

18 files changed

+171
-3
lines changed

src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ CHANGELOG
99
* Add JsonEncoder services and configuration
1010
* Add new `framework.property_info.with_constructor_extractor` option to allow enabling or disabling the constructor extractor integration
1111
* Deprecate the `--show-arguments` option of the `container:debug` command, as arguments are now always shown
12+
* Add `include_stack_trace_in_error` option that's used in `AddErrorDetailsStampListener`
1213

1314
7.2
1415
---

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1671,6 +1671,9 @@ function ($a) {
16711671
->defaultNull()
16721672
->info('Transport name to send failed messages to (after all retries have failed).')
16731673
->end()
1674+
->booleanNode('include_stack_trace_in_error')
1675+
->info('Whether to include a stack trace in the error details stamp.')
1676+
->end()
16741677
->arrayNode('retry_strategy')
16751678
->addDefaultsIfNotSet()
16761679
->beforeNormalization()
@@ -1702,6 +1705,10 @@ function ($a) {
17021705
->defaultNull()
17031706
->info('Transport name to send failed messages to (after all retries have failed).')
17041707
->end()
1708+
->booleanNode('include_stack_trace_in_error')
1709+
->defaultTrue()
1710+
->info('Whether to include a stack trace in the error details stamp.')
1711+
->end()
17051712
->arrayNode('stop_worker_on_signals')
17061713
->defaultValue([])
17071714
->info('A list of signals that should stop the worker; defaults to SIGTERM and SIGINT.')

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2332,6 +2332,7 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
23322332
}
23332333

23342334
$senderAliases = [];
2335+
$includeStackTraceInError = [];
23352336
$transportRetryReferences = [];
23362337
$transportRateLimiterReferences = [];
23372338
foreach ($config['transports'] as $name => $transport) {
@@ -2347,6 +2348,8 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
23472348
$container->setDefinition($transportId = 'messenger.transport.'.$name, $transportDefinition);
23482349
$senderAliases[$name] = $transportId;
23492350

2351+
$includeStackTraceInError[$name] = $transport['include_stack_trace_in_error'] ?? $config['include_stack_trace_in_error'];
2352+
23502353
if (null !== $transport['retry_strategy']['service']) {
23512354
$transportRetryReferences[$name] = new Reference($transport['retry_strategy']['service']);
23522355
} else {
@@ -2419,6 +2422,10 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
24192422
->replaceArgument(1, $sendersServiceLocator)
24202423
;
24212424

2425+
$container->getDefinition('messenger.failure.add_error_details_stamp_listener')
2426+
->replaceArgument(0, $includeStackTraceInError)
2427+
;
2428+
24222429
$container->getDefinition('messenger.retry.send_failed_message_for_retry_listener')
24232430
->replaceArgument(0, $sendersServiceLocator)
24242431
;

src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,9 @@
183183
->tag('monolog.logger', ['channel' => 'messenger'])
184184

185185
->set('messenger.failure.add_error_details_stamp_listener', AddErrorDetailsStampListener::class)
186+
->args([
187+
abstract_arg('include_stack_trace_in_error'),
188+
])
186189
->tag('kernel.event_subscriber')
187190

188191
->set('messenger.failure.send_failed_message_to_failure_transport_listener', SendFailedMessageToFailureTransportListener::class)

src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,7 @@
606606
<xsd:attribute name="default-bus" type="xsd:string" />
607607
<xsd:attribute name="enabled" type="xsd:boolean" />
608608
<xsd:attribute name="failure-transport" type="xsd:string" />
609+
<xsd:attribute name="include-stack-trace-in-error" type="xsd:boolean" />
609610
</xsd:complexType>
610611

611612
<xsd:complexType name="messenger_serializer">
@@ -642,6 +643,7 @@
642643
<xsd:attribute name="serializer" type="xsd:string" />
643644
<xsd:attribute name="dsn" type="xsd:string" />
644645
<xsd:attribute name="failure-transport" type="xsd:string" />
646+
<xsd:attribute name="include-stack-trace-in-error" type="xsd:boolean" />
645647
<xsd:attribute name="rate-limiter" type="xsd:string" />
646648
</xsd:complexType>
647649

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -910,6 +910,7 @@ class_exists(SemaphoreStore::class) && SemaphoreStore::isSupported() ? 'semaphor
910910
'default_bus' => null,
911911
'buses' => ['messenger.bus.default' => ['default_middleware' => ['enabled' => true, 'allow_no_handlers' => false, 'allow_no_senders' => true], 'middleware' => []]],
912912
'stop_worker_on_signals' => [],
913+
'include_stack_trace_in_error' => true,
913914
],
914915
'disallow_search_engine_index' => true,
915916
'http_client' => [
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', [
4+
'annotations' => false,
5+
'http_method_override' => false,
6+
'handle_all_throwables' => true,
7+
'php_errors' => ['log' => true],
8+
'messenger' => [
9+
'include_stack_trace_in_error' => false,
10+
'transports' => [
11+
'sender.biz' => 'null://',
12+
'sender.bar' => [
13+
'dsn' => 'null://',
14+
'include_stack_trace_in_error' => true,
15+
],
16+
'sender.foo' => 'null://',
17+
],
18+
],
19+
]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', [
4+
'annotations' => false,
5+
'http_method_override' => false,
6+
'handle_all_throwables' => true,
7+
'php_errors' => ['log' => true],
8+
'messenger' => [
9+
'transports' => [
10+
'sender.biz' => 'null://',
11+
'sender.bar' => [
12+
'dsn' => 'null://',
13+
'include_stack_trace_in_error' => false,
14+
],
15+
'sender.foo' => 'null://',
16+
],
17+
],
18+
]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<container xmlns="http://symfony.com/schema/dic/services"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xmlns:framework="http://symfony.com/schema/dic/symfony"
5+
xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd
6+
http://symfony.com/schema/dic/symfony https://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
7+
8+
<framework:config http-method-override="false" handle-all-throwables="true">
9+
<framework:annotations enabled="false" />
10+
<framework:php-errors log="true" />
11+
<framework:messenger include-stack-trace-in-error="false">
12+
<framework:transport name="sender.biz" dsn="null://" />
13+
<framework:transport name="sender.bar" dsn="null://" include-stack-trace-in-error="true" />
14+
<framework:transport name="sender.foo" dsn="null://" />
15+
</framework:messenger>
16+
</framework:config>
17+
</container>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<container xmlns="http://symfony.com/schema/dic/services"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xmlns:framework="http://symfony.com/schema/dic/symfony"
5+
xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd
6+
http://symfony.com/schema/dic/symfony https://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
7+
8+
<framework:config http-method-override="false" handle-all-throwables="true">
9+
<framework:annotations enabled="false" />
10+
<framework:php-errors log="true" />
11+
<framework:messenger>
12+
<framework:transport name="sender.biz" dsn="null://" />
13+
<framework:transport name="sender.bar" dsn="null://" include-stack-trace-in-error="false" />
14+
<framework:transport name="sender.foo" dsn="null://" />
15+
</framework:messenger>
16+
</framework:config>
17+
</container>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
framework:
2+
annotations: false
3+
http_method_override: false
4+
handle_all_throwables: true
5+
php_errors:
6+
log: true
7+
messenger:
8+
include_stack_trace_in_error: false
9+
transports:
10+
sender.biz: 'null://'
11+
sender.bar:
12+
dsn: 'null://'
13+
include_stack_trace_in_error: true
14+
sender.foo: 'null://'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
framework:
2+
annotations: false
3+
http_method_override: false
4+
handle_all_throwables: true
5+
php_errors:
6+
log: true
7+
messenger:
8+
transports:
9+
sender.biz: 'null://'
10+
sender.bar:
11+
dsn: 'null://'
12+
include_stack_trace_in_error: false
13+
sender.foo: 'null://'

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,6 +1112,17 @@ public function testMessengerInvalidWildcardRouting()
11121112
$this->createContainerFromFile('messenger_routing_invalid_transport');
11131113
}
11141114

1115+
/**
1116+
* @testWith ["messenger_with_include_stack_trace_true", {"sender.biz": true, "sender.bar": false, "sender.foo": true}]
1117+
* ["messenger_with_include_stack_trace_false", {"sender.biz": false, "sender.bar": true, "sender.foo": false}]
1118+
*/
1119+
public function testMessengerWithIncludeStackTrace(string $file, array $expected)
1120+
{
1121+
$container = $this->createContainerFromFile($file);
1122+
1123+
$this->assertSame($expected, $container->getDefinition('messenger.failure.add_error_details_stamp_listener')->getArgument(0));
1124+
}
1125+
11151126
public function testTranslator()
11161127
{
11171128
$container = $this->createContainerFromFile('full');

src/Symfony/Component/Messenger/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
CHANGELOG
22
=========
33

4+
7.3
5+
---
6+
7+
* Add `$includeStackTrace` parameters to `AddErrorDetailsStampListener` and `ErrorDetailsStamp` to allow excluding the stack trace from the `ErrorDetailsStamp`
8+
49
7.2
510
---
611

src/Symfony/Component/Messenger/EventListener/AddErrorDetailsStampListener.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,17 @@
1717

1818
final class AddErrorDetailsStampListener implements EventSubscriberInterface
1919
{
20+
/**
21+
* @param array<string, bool> $includeStackTrace
22+
*/
23+
public function __construct(
24+
private readonly array $includeStackTrace = [],
25+
) {
26+
}
27+
2028
public function onMessageFailed(WorkerMessageFailedEvent $event): void
2129
{
22-
$stamp = ErrorDetailsStamp::create($event->getThrowable());
30+
$stamp = ErrorDetailsStamp::create($event->getThrowable(), $this->includeStackTrace[$event->getReceiverName()] ?? true);
2331
$previousStamp = $event->getEnvelope()->last(ErrorDetailsStamp::class);
2432

2533
// Do not append duplicate information

src/Symfony/Component/Messenger/Stamp/ErrorDetailsStamp.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ public function __construct(
2727
) {
2828
}
2929

30-
public static function create(\Throwable $throwable): self
30+
public static function create(\Throwable $throwable, bool $includeStackTrace = true): self
3131
{
3232
if ($throwable instanceof HandlerFailedException) {
3333
$throwable = $throwable->getPrevious();
3434
}
3535

3636
$flattenException = null;
37-
if (class_exists(FlattenException::class)) {
37+
if ($includeStackTrace && class_exists(FlattenException::class)) {
3838
$flattenException = FlattenException::createFromThrowable($throwable);
3939
}
4040

src/Symfony/Component/Messenger/Tests/EventListener/AddErrorDetailsStampListenerTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,20 @@ public function testExceptionDetailsAreAdded()
3333
$this->assertEquals($expectedStamp, $event->getEnvelope()->last(ErrorDetailsStamp::class));
3434
}
3535

36+
public function testExceptionDetailsWithoutStackTraceAreAdded()
37+
{
38+
$listener = new AddErrorDetailsStampListener(['my_receiver' => false]);
39+
40+
$envelope = new Envelope(new \stdClass());
41+
$exception = new \Exception('It failed!');
42+
$event = new WorkerMessageFailedEvent($envelope, 'my_receiver', $exception);
43+
$expectedStamp = ErrorDetailsStamp::create($exception, false);
44+
45+
$listener->onMessageFailed($event);
46+
47+
$this->assertEquals($expectedStamp, $event->getEnvelope()->last(ErrorDetailsStamp::class));
48+
}
49+
3650
public function testWorkerAddsNewErrorDetailsStampOnFailure()
3751
{
3852
$listener = new AddErrorDetailsStampListener();

src/Symfony/Component/Messenger/Tests/Stamp/ErrorDetailsStampTest.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,17 @@ public function testUnwrappingHandlerFailedException()
5252
$this->assertEquals($flattenException, $stamp->getFlattenException());
5353
}
5454

55+
public function testFlattenExceptionIsNotIncluded()
56+
{
57+
$exception = new \Exception('exception message');
58+
59+
$stamp = ErrorDetailsStamp::create($exception, false);
60+
61+
$this->assertSame(\Exception::class, $stamp->getExceptionClass());
62+
$this->assertSame('exception message', $stamp->getExceptionMessage());
63+
$this->assertNull($stamp->getFlattenException());
64+
}
65+
5566
public function testDeserialization()
5667
{
5768
$exception = new \Exception('exception message');

0 commit comments

Comments
 (0)
0