diff --git a/src/EventListener/TracingRequestListener.php b/src/EventListener/TracingRequestListener.php index e5797a79..f94f9dda 100644 --- a/src/EventListener/TracingRequestListener.php +++ b/src/EventListener/TracingRequestListener.php @@ -4,6 +4,9 @@ namespace Sentry\SentryBundle\EventListener; +use Sentry\Integration\RequestFetcherInterface; +use Sentry\SentryBundle\Integration\RequestFetcher; +use Sentry\State\HubInterface; use Sentry\Tracing\TransactionSource; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Event\RequestEvent; @@ -20,6 +23,18 @@ */ final class TracingRequestListener extends AbstractTracingRequestListener { + /** + * @var RequestFetcherInterface|null + */ + private $requestFetcher; + + public function __construct(HubInterface $hub, ?RequestFetcherInterface $requestFetcher = null) + { + parent::__construct($hub); + + $this->requestFetcher = $requestFetcher; + } + /** * This method is called for each subrequest handled by the framework and * starts a new {@see Transaction}. @@ -35,6 +50,10 @@ public function handleKernelRequestEvent(RequestEvent $event): void /** @var Request $request */ $request = $event->getRequest(); + if ($this->requestFetcher instanceof RequestFetcher) { + $this->requestFetcher->setRequest($request); + } + /** @var float $requestStartTime */ $requestStartTime = $request->server->get('REQUEST_TIME_FLOAT', microtime(true)); @@ -77,6 +96,10 @@ public function handleKernelTerminateEvent(TerminateEvent $event): void $transaction->finish(); metrics()->flush(); + + if ($this->requestFetcher instanceof RequestFetcher) { + $this->requestFetcher->setRequest(null); + } } /** diff --git a/src/Integration/RequestFetcher.php b/src/Integration/RequestFetcher.php index af371783..2f2d2cd2 100644 --- a/src/Integration/RequestFetcher.php +++ b/src/Integration/RequestFetcher.php @@ -9,6 +9,7 @@ use Sentry\Integration\RequestFetcherInterface; use Symfony\Bridge\PsrHttpMessage\Factory\PsrHttpFactory; use Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; /** @@ -23,6 +24,11 @@ final class RequestFetcher implements RequestFetcherInterface */ private $requestStack; + /** + * @var Request|null The current request + */ + private $currentRequest; + /** * @var HttpMessageFactoryInterface The factory to convert Symfony requests to PSR-7 requests */ @@ -50,7 +56,7 @@ public function __construct(RequestStack $requestStack, ?HttpMessageFactoryInter */ public function fetchRequest(): ?ServerRequestInterface { - $request = $this->requestStack->getCurrentRequest(); + $request = $this->currentRequest ?? $this->requestStack->getCurrentRequest(); if (null === $request) { return null; @@ -62,4 +68,9 @@ public function fetchRequest(): ?ServerRequestInterface return null; } } + + public function setRequest(?Request $request): void + { + $this->currentRequest = $request; + } } diff --git a/src/Resources/config/services.xml b/src/Resources/config/services.xml index ef3ce7d8..02ad8994 100644 --- a/src/Resources/config/services.xml +++ b/src/Resources/config/services.xml @@ -48,6 +48,7 @@ +