diff --git a/composer.json b/composer.json index 77bafd4..e1121d0 100644 --- a/composer.json +++ b/composer.json @@ -39,7 +39,7 @@ }, "require-dev": { "symfony/var-dumper": "^6.0 || ^7.0", - "sentry/sentry-symfony": "^4.5", + "sentry/sentry-symfony": "^4.5 || ^5.0", "symfony/framework-bundle": "^6.0 || ^7.0", "nyholm/psr7": "^1.2", "doctrine/mongodb-odm": "^2.2", diff --git a/src/Integration/Sentry/SentryListener.php b/src/Integration/Sentry/SentryListener.php index 6f05b64..7185462 100644 --- a/src/Integration/Sentry/SentryListener.php +++ b/src/Integration/Sentry/SentryListener.php @@ -6,6 +6,7 @@ use Baldinof\RoadRunnerBundle\Event\WorkerExceptionEvent; use Baldinof\RoadRunnerBundle\Event\WorkerStopEvent; +use GuzzleHttp\Promise\PromiseInterface; use Sentry\State\HubInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -17,9 +18,10 @@ public function __construct(private HubInterface $hub) public function onWorkerStop(WorkerStopEvent $event): void { - $client = $this->hub->getClient(); - - $client?->flush()->wait(false); + $result = $this->hub->getClient()?->flush(); + if (class_exists(PromiseInterface::class) && $result instanceof PromiseInterface) { + $result->wait(false); + } } public function onWorkerException(WorkerExceptionEvent $event): void diff --git a/src/Integration/Sentry/SentryMiddleware.php b/src/Integration/Sentry/SentryMiddleware.php index 144110f..88a4d47 100644 --- a/src/Integration/Sentry/SentryMiddleware.php +++ b/src/Integration/Sentry/SentryMiddleware.php @@ -5,6 +5,7 @@ namespace Baldinof\RoadRunnerBundle\Integration\Sentry; use Baldinof\RoadRunnerBundle\Http\MiddlewareInterface; +use GuzzleHttp\Promise\PromiseInterface; use Sentry\State\HubInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\HttpKernelInterface; @@ -25,8 +26,10 @@ public function process(Request $request, HttpKernelInterface $next): \Iterator try { yield $next->handle($request); } finally { - $client = $this->hub->getClient(); - $client?->flush()->wait(false); + $result = $this->hub->getClient()?->flush(); + if (class_exists(PromiseInterface::class) && $result instanceof PromiseInterface) { + $result->wait(false); + } $this->hub->popScope(); } diff --git a/tests/Integration/Sentry/SentryMiddlewareTest.php b/tests/Integration/Sentry/SentryMiddlewareTest.php index 5a5b81f..533a336 100644 --- a/tests/Integration/Sentry/SentryMiddlewareTest.php +++ b/tests/Integration/Sentry/SentryMiddlewareTest.php @@ -9,11 +9,14 @@ use GuzzleHttp\Promise\PromiseInterface; use PHPUnit\Framework\TestCase; use Sentry\Breadcrumb; +use Sentry\Client; use Sentry\ClientBuilder; use Sentry\Event; use Sentry\Options; use Sentry\SentrySdk; use Sentry\State\Hub; +use Sentry\Transport\Result; +use Sentry\Transport\ResultStatus; use Sentry\Transport\TransportFactoryInterface; use Sentry\Transport\TransportInterface; use Symfony\Component\HttpFoundation\Request; @@ -49,9 +52,13 @@ public function initHub(array $options): void $opts = new Options(array_merge($options, ['default_integrations' => true])); - $client = (new ClientBuilder($opts)) - ->setTransportFactory($this->getTransportFactoryMock()) - ->getClient(); + $builder = new ClientBuilder($opts); + if (version_compare(Client::SDK_VERSION, '4.0.0', '<')) { + $builder->setTransportFactory($this->getTransportFactoryMock()); + } else { + $builder->setTransport($this->getV4TransportMock()); + } + $client = $builder->getClient(); $hub = new Hub($client); @@ -115,4 +122,21 @@ public function close(?int $timeout = null): PromiseInterface } }; } + + private function getV4TransportMock(): TransportInterface + { + return new class() implements TransportInterface { + public function send(Event $event): Result + { + SentryMiddlewareTest::$collectedEvents->push($event); + + return new Result(ResultStatus::success(), $event); + } + + public function close(?int $timeout = null): Result + { + return new Result(ResultStatus::success()); + } + }; + } }