Skip to content

Commit 8472a06

Browse files
Fix boundaries for Symfony HttpKernel auto instrumentation
1 parent 1d5099d commit 8472a06

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

src/Instrumentation/Symfony/src/SymfonyInstrumentation.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,30 @@ public static function register(): void
8686
array $params,
8787
?Response $response,
8888
?\Throwable $exception
89+
): void {
90+
$scope = Context::storage()->scope();
91+
if (null === $scope || null === $exception) {
92+
return;
93+
}
94+
95+
$span = Span::fromContext($scope->context());
96+
$scope->detach();
97+
$span->recordException($exception, [
98+
TraceAttributes::EXCEPTION_ESCAPED => true,
99+
]);
100+
if (null !== $response && $response->getStatusCode() >= Response::HTTP_INTERNAL_SERVER_ERROR) {
101+
$span->setStatus(StatusCode::STATUS_ERROR, $exception->getMessage());
102+
}
103+
}
104+
);
105+
106+
hook(
107+
HttpKernel::class,
108+
'terminate',
109+
post: static function (
110+
HttpKernel $kernel,
111+
array $params,
112+
?\Throwable $exception
89113
): void {
90114
$scope = Context::storage()->scope();
91115
if (null === $scope) {
@@ -95,6 +119,7 @@ public static function register(): void
95119
$span = Span::fromContext($scope->context());
96120

97121
$request = ($params[0] instanceof Request) ? $params[0] : null;
122+
$response = ($params[1] instanceof Response) ? $params[1] : null;
98123
if (null !== $request) {
99124
$routeName = $request->attributes->get('_route', '');
100125

src/Instrumentation/Symfony/tests/Integration/SymfonyInstrumentationTest.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public function test_http_kernel_handle_exception(): void
3333
$this->assertCount(0, $this->storage);
3434

3535
$response = $kernel->handle(new Request());
36+
$kernel->terminate(new Request(), $response);
3637

3738
$this->assertArrayHasKey(
3839
TraceResponsePropagator::TRACERESPONSE,
@@ -50,6 +51,7 @@ public function test_http_kernel_marks_root_as_erroneous(): void
5051
$this->assertCount(0, $this->storage);
5152

5253
$response = $kernel->handle(new Request(), HttpKernelInterface::MAIN_REQUEST, true);
54+
$kernel->terminate(new Request(), $response);
5355

5456
$this->assertCount(1, $this->storage);
5557
$this->assertSame(500, $this->storage[0]->getAttributes()->get(TraceAttributes::HTTP_RESPONSE_STATUS_CODE));
@@ -71,6 +73,7 @@ public function test_http_kernel_handle_attributes(): void
7173
$request->attributes->set('_route', 'test_route');
7274

7375
$response = $kernel->handle($request);
76+
$kernel->terminate($request, $response);
7477

7578
$attributes = $this->storage[0]->getAttributes();
7679
$this->assertCount(1, $this->storage);
@@ -105,6 +108,8 @@ public function test_http_kernel_handle_stream_response(): void
105108
$this->assertCount(0, $this->storage);
106109

107110
$response = $kernel->handle(new Request());
111+
$kernel->terminate(new Request(), $response);
112+
108113
$this->assertCount(1, $this->storage);
109114
$this->assertNull($this->storage[0]->getAttributes()->get(TraceAttributes::HTTP_RESPONSE_BODY_SIZE));
110115

@@ -127,6 +132,8 @@ public function test_http_kernel_handle_binary_file_response(): void
127132
$this->assertCount(0, $this->storage);
128133

129134
$response = $kernel->handle(new Request());
135+
$kernel->terminate(new Request(), $response);
136+
130137
$this->assertCount(1, $this->storage);
131138
$this->assertNull($this->storage[0]->getAttributes()->get(TraceAttributes::HTTP_RESPONSE_BODY_SIZE));
132139

@@ -151,6 +158,8 @@ public function test_http_kernel_handle_with_empty_route(): void
151158
$request->attributes->set('_route', '');
152159

153160
$response = $kernel->handle($request, HttpKernelInterface::MAIN_REQUEST, true);
161+
$kernel->terminate(new Request(), $response);
162+
154163
$this->assertCount(1, $this->storage);
155164
$this->assertFalse($this->storage[0]->getAttributes()->has(TraceAttributes::HTTP_ROUTE));
156165

@@ -173,6 +182,8 @@ public function test_http_kernel_handle_without_route(): void
173182
$this->assertCount(0, $this->storage);
174183

175184
$response = $kernel->handle(new Request(), HttpKernelInterface::MAIN_REQUEST, true);
185+
$kernel->terminate(new Request(), $response);
186+
176187
$this->assertCount(1, $this->storage);
177188
$this->assertFalse($this->storage[0]->getAttributes()->has(TraceAttributes::HTTP_ROUTE));
178189

@@ -196,7 +207,9 @@ public function test_http_kernel_handle_subrequest(): void
196207
$request = new Request();
197208
$request->attributes->set('_controller', 'ErrorController');
198209

199-
$kernel->handle($request, HttpKernelInterface::SUB_REQUEST);
210+
$response = $kernel->handle($request, HttpKernelInterface::SUB_REQUEST);
211+
$kernel->terminate($request, $response);
212+
200213
$this->assertCount(1, $this->storage);
201214

202215
$span = $this->storage[0];

0 commit comments

Comments
 (0)