Skip to content

Commit 24e30e1

Browse files
Fix boundaries for Symfony HttpKernel auto instrumentation
1 parent 3d6f839 commit 24e30e1

File tree

2 files changed

+53
-8
lines changed

2 files changed

+53
-8
lines changed

src/Instrumentation/Symfony/src/SymfonyInstrumentation.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,30 @@ public static function register(): void
9292
array $params,
9393
?Response $response,
9494
?\Throwable $exception
95+
): void {
96+
$scope = Context::storage()->scope();
97+
if (null === $scope || null === $exception) {
98+
return;
99+
}
100+
101+
$span = Span::fromContext($scope->context());
102+
$scope->detach();
103+
$span->recordException($exception, [
104+
TraceAttributes::EXCEPTION_ESCAPED => true,
105+
]);
106+
if (null !== $response && $response->getStatusCode() >= Response::HTTP_INTERNAL_SERVER_ERROR) {
107+
$span->setStatus(StatusCode::STATUS_ERROR, $exception->getMessage());
108+
}
109+
}
110+
);
111+
112+
hook(
113+
HttpKernel::class,
114+
'terminate',
115+
post: static function (
116+
HttpKernel $kernel,
117+
array $params,
118+
?\Throwable $exception
95119
): void {
96120
$scope = Context::storage()->scope();
97121
if (null === $scope) {
@@ -101,6 +125,7 @@ public static function register(): void
101125
$span = Span::fromContext($scope->context());
102126

103127
$request = ($params[0] instanceof Request) ? $params[0] : null;
128+
$response = ($params[1] instanceof Response) ? $params[1] : null;
104129
if (null !== $request) {
105130
$routeName = $request->attributes->get('_route', '');
106131

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

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,15 @@ public function test_http_kernel_handle_exception(): void
2929
throw new \RuntimeException();
3030
});
3131
$this->assertCount(0, $this->storage);
32-
$kernel->handle(new Request());
32+
33+
$response = $kernel->handle(new Request());
34+
$kernel->terminate(new Request(), $response);
35+
36+
$this->assertArrayHasKey(
37+
TraceResponsePropagator::TRACERESPONSE,
38+
$response->headers->all(),
39+
'traceresponse header is present if TraceResponsePropagator is present'
40+
);
3341
}
3442

3543
public function test_http_kernel_marks_root_as_erroneous(): void
@@ -40,7 +48,8 @@ public function test_http_kernel_marks_root_as_erroneous(): void
4048
});
4149
$this->assertCount(0, $this->storage);
4250

43-
$kernel->handle(new Request(), HttpKernelInterface::MAIN_REQUEST, true);
51+
$response = $kernel->handle(new Request(), HttpKernelInterface::MAIN_REQUEST, true);
52+
$kernel->terminate(new Request(), $response);
4453

4554
$this->assertCount(1, $this->storage);
4655
$this->assertSame(500, $this->storage[0]->getAttributes()->get(TraceAttributes::HTTP_RESPONSE_STATUS_CODE));
@@ -55,7 +64,8 @@ public function test_http_kernel_handle_attributes(): void
5564
$request = new Request();
5665
$request->attributes->set('_route', 'test_route');
5766

58-
$kernel->handle($request);
67+
$response = $kernel->handle($request);
68+
$kernel->terminate($request, $response);
5969

6070
$attributes = $this->storage[0]->getAttributes();
6171
$this->assertCount(1, $this->storage);
@@ -78,7 +88,9 @@ public function test_http_kernel_handle_stream_response(): void
7888
}));
7989
$this->assertCount(0, $this->storage);
8090

81-
$kernel->handle(new Request());
91+
$response = $kernel->handle(new Request());
92+
$kernel->terminate(new Request(), $response);
93+
8294
$this->assertCount(1, $this->storage);
8395
$this->assertNull($this->storage[0]->getAttributes()->get(TraceAttributes::HTTP_RESPONSE_BODY_SIZE));
8496
}
@@ -88,7 +100,9 @@ public function test_http_kernel_handle_binary_file_response(): void
88100
$kernel = $this->getHttpKernel(new EventDispatcher(), fn () => new BinaryFileResponse(__FILE__));
89101
$this->assertCount(0, $this->storage);
90102

91-
$kernel->handle(new Request());
103+
$response = $kernel->handle(new Request());
104+
$kernel->terminate(new Request(), $response);
105+
92106
$this->assertCount(1, $this->storage);
93107
$this->assertNull($this->storage[0]->getAttributes()->get(TraceAttributes::HTTP_RESPONSE_BODY_SIZE));
94108

@@ -101,7 +115,9 @@ public function test_http_kernel_handle_with_empty_route(): void
101115
$request = new Request();
102116
$request->attributes->set('_route', '');
103117

104-
$kernel->handle($request, HttpKernelInterface::MAIN_REQUEST, true);
118+
$response = $kernel->handle($request, HttpKernelInterface::MAIN_REQUEST, true);
119+
$kernel->terminate(new Request(), $response);
120+
105121
$this->assertCount(1, $this->storage);
106122
$this->assertFalse($this->storage[0]->getAttributes()->has(TraceAttributes::HTTP_ROUTE));
107123

@@ -112,7 +128,9 @@ public function test_http_kernel_handle_without_route(): void
112128
$kernel = $this->getHttpKernel(new EventDispatcher());
113129
$this->assertCount(0, $this->storage);
114130

115-
$kernel->handle(new Request(), HttpKernelInterface::MAIN_REQUEST, true);
131+
$response = $kernel->handle(new Request(), HttpKernelInterface::MAIN_REQUEST, true);
132+
$kernel->terminate(new Request(), $response);
133+
116134
$this->assertCount(1, $this->storage);
117135
$this->assertFalse($this->storage[0]->getAttributes()->has(TraceAttributes::HTTP_ROUTE));
118136

@@ -125,7 +143,9 @@ public function test_http_kernel_handle_subrequest(): void
125143
$request = new Request();
126144
$request->attributes->set('_controller', 'ErrorController');
127145

128-
$kernel->handle($request, HttpKernelInterface::SUB_REQUEST);
146+
$response = $kernel->handle($request, HttpKernelInterface::SUB_REQUEST);
147+
$kernel->terminate($request, $response);
148+
129149
$this->assertCount(1, $this->storage);
130150

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

0 commit comments

Comments
 (0)