Skip to content

Commit 1bc2033

Browse files
authored
Keep reference to the request until after the transaction is finished (#879)
1 parent 9b82b0a commit 1bc2033

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

src/EventListener/TracingRequestListener.php

+23
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
namespace Sentry\SentryBundle\EventListener;
66

7+
use Sentry\Integration\RequestFetcherInterface;
8+
use Sentry\SentryBundle\Integration\RequestFetcher;
9+
use Sentry\State\HubInterface;
710
use Sentry\Tracing\TransactionSource;
811
use Symfony\Component\HttpFoundation\Request;
912
use Symfony\Component\HttpKernel\Event\RequestEvent;
@@ -20,6 +23,18 @@
2023
*/
2124
final class TracingRequestListener extends AbstractTracingRequestListener
2225
{
26+
/**
27+
* @var RequestFetcherInterface|null
28+
*/
29+
private $requestFetcher;
30+
31+
public function __construct(HubInterface $hub, ?RequestFetcherInterface $requestFetcher = null)
32+
{
33+
parent::__construct($hub);
34+
35+
$this->requestFetcher = $requestFetcher;
36+
}
37+
2338
/**
2439
* This method is called for each subrequest handled by the framework and
2540
* starts a new {@see Transaction}.
@@ -35,6 +50,10 @@ public function handleKernelRequestEvent(RequestEvent $event): void
3550
/** @var Request $request */
3651
$request = $event->getRequest();
3752

53+
if ($this->requestFetcher instanceof RequestFetcher) {
54+
$this->requestFetcher->setRequest($request);
55+
}
56+
3857
/** @var float $requestStartTime */
3958
$requestStartTime = $request->server->get('REQUEST_TIME_FLOAT', microtime(true));
4059

@@ -77,6 +96,10 @@ public function handleKernelTerminateEvent(TerminateEvent $event): void
7796

7897
$transaction->finish();
7998
metrics()->flush();
99+
100+
if ($this->requestFetcher instanceof RequestFetcher) {
101+
$this->requestFetcher->setRequest(null);
102+
}
80103
}
81104

82105
/**

src/Integration/RequestFetcher.php

+12-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Sentry\Integration\RequestFetcherInterface;
1010
use Symfony\Bridge\PsrHttpMessage\Factory\PsrHttpFactory;
1111
use Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface;
12+
use Symfony\Component\HttpFoundation\Request;
1213
use Symfony\Component\HttpFoundation\RequestStack;
1314

1415
/**
@@ -23,6 +24,11 @@ final class RequestFetcher implements RequestFetcherInterface
2324
*/
2425
private $requestStack;
2526

27+
/**
28+
* @var Request|null The current request
29+
*/
30+
private $currentRequest;
31+
2632
/**
2733
* @var HttpMessageFactoryInterface The factory to convert Symfony requests to PSR-7 requests
2834
*/
@@ -50,7 +56,7 @@ public function __construct(RequestStack $requestStack, ?HttpMessageFactoryInter
5056
*/
5157
public function fetchRequest(): ?ServerRequestInterface
5258
{
53-
$request = $this->requestStack->getCurrentRequest();
59+
$request = $this->currentRequest ?? $this->requestStack->getCurrentRequest();
5460

5561
if (null === $request) {
5662
return null;
@@ -62,4 +68,9 @@ public function fetchRequest(): ?ServerRequestInterface
6268
return null;
6369
}
6470
}
71+
72+
public function setRequest(?Request $request): void
73+
{
74+
$this->currentRequest = $request;
75+
}
6576
}

src/Resources/config/services.xml

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848

4949
<service id="Sentry\SentryBundle\EventListener\TracingRequestListener" class="Sentry\SentryBundle\EventListener\TracingRequestListener">
5050
<argument type="service" id="Sentry\State\HubInterface" />
51+
<argument type="service" id="Sentry\Integration\RequestFetcherInterface" />
5152

5253
<tag name="kernel.event_listener" event="kernel.request" method="handleKernelRequestEvent" priority="4" />
5354
<tag name="kernel.event_listener" event="kernel.response" method="handleKernelResponseEvent" priority="15" />

0 commit comments

Comments
 (0)