diff --git a/.docs/README.md b/.docs/README.md index 7d8d960..d5af8a9 100644 --- a/.docs/README.md +++ b/.docs/README.md @@ -195,6 +195,10 @@ sentry: client: integrations: - Contributte\Sentry\Integration\IgnoreErrorIntegration([ + ignore_exception_instance: [ + FooException::class, + BarException::class, + ], ignore_exception_regex: [ '/Deprecated (.*)/' ], diff --git a/src/Integration/IgnoreErrorIntegration.php b/src/Integration/IgnoreErrorIntegration.php index fa92815..e2e48de 100644 --- a/src/Integration/IgnoreErrorIntegration.php +++ b/src/Integration/IgnoreErrorIntegration.php @@ -21,10 +21,12 @@ public function __construct(array $options = []) { $resolver = new OptionsResolver(); $resolver->setDefaults([ + 'ignore_exception_instance' => [], 'ignore_exception_regex' => [], 'ignore_message_regex' => [], ]); + $resolver->setAllowedTypes('ignore_exception_instance', ['array']); $resolver->setAllowedTypes('ignore_exception_regex', ['array']); $resolver->setAllowedTypes('ignore_message_regex', ['array']); @@ -33,6 +35,10 @@ public function __construct(array $options = []) public function setup(HubInterface $hub, Event $event, EventHint $hint): ?Event { + if ($this->isIgnoredByExceptionInstance($event)) { + return null; + } + if ($this->isIgnoredByExceptionRegex($event)) { return null; } @@ -44,6 +50,25 @@ public function setup(HubInterface $hub, Event $event, EventHint $hint): ?Event return $event; } + protected function isIgnoredByExceptionInstance(Event $event): bool + { + $exceptions = $event->getExceptions(); + + if ($exceptions === []) { + return false; + } + + /** @var string[] $instances */ + $instances = $this->options['ignore_exception_instance']; + foreach ($instances as $instance) { + if ($exceptions[0]->getType() === $instance) { + return true; + } + } + + return false; + } + protected function isIgnoredByExceptionRegex(Event $event): bool { $exceptions = $event->getExceptions(); diff --git a/tests/Cases/Integration/IgnoreErrorIntegration/IgnoreMessageWithInstance.phpt b/tests/Cases/Integration/IgnoreErrorIntegration/IgnoreMessageWithInstance.phpt new file mode 100644 index 0000000..ad5f6cd --- /dev/null +++ b/tests/Cases/Integration/IgnoreErrorIntegration/IgnoreMessageWithInstance.phpt @@ -0,0 +1,72 @@ + [ + GoodException::class, + ], + ]); + $integration->setupOnce(); + + $client = Mockery::mock(ClientInterface::class); + $client->shouldReceive('getIntegration') + ->once() + ->andReturn($integration); + + SentrySdk::getCurrentHub()->bindClient($client); + + $event = Event::createEvent(); + $event->setMessage('foo bar'); + $event->setExceptions([new ExceptionDataBag(new GoodException('bar foo'))]); + + withScope(function (Scope $scope) use ($event): void { + $event = $scope->applyToEvent($event); + Assert::null($event); + }); +}); + +Toolkit::test(function (): void { + $integration = new IgnoreErrorIntegration([ + 'ignore_exception_instance' => [ + GoodException::class, + ], + ]); + $integration->setupOnce(); + + $client = Mockery::mock(ClientInterface::class); + $client->shouldReceive('getIntegration') + ->once() + ->andReturn($integration); + + SentrySdk::getCurrentHub()->bindClient($client); + + $event = Event::createEvent(); + $event->setMessage('foo bar'); + $event->setExceptions([new ExceptionDataBag(new BadException('bar foo'))]); + + withScope(function (Scope $scope) use ($event): void { + $event = $scope->applyToEvent($event); + Assert::notNull($event); + }); +});