Skip to content

Commit 19f787e

Browse files
Fix boundaries for Symfony HttpKernel auto instrumentation
1 parent f6a567b commit 19f787e

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
@@ -80,6 +80,30 @@ public static function register(): void
8080
array $params,
8181
?Response $response,
8282
?\Throwable $exception
83+
): void {
84+
$scope = Context::storage()->scope();
85+
if (null === $scope || null === $exception) {
86+
return;
87+
}
88+
89+
$span = Span::fromContext($scope->context());
90+
$scope->detach();
91+
$span->recordException($exception, [
92+
TraceAttributes::EXCEPTION_ESCAPED => true,
93+
]);
94+
if (null !== $response && $response->getStatusCode() >= Response::HTTP_INTERNAL_SERVER_ERROR) {
95+
$span->setStatus(StatusCode::STATUS_ERROR, $exception->getMessage());
96+
}
97+
}
98+
);
99+
100+
hook(
101+
HttpKernel::class,
102+
'terminate',
103+
post: static function (
104+
HttpKernel $kernel,
105+
array $params,
106+
?\Throwable $exception
83107
): void {
84108
$scope = Context::storage()->scope();
85109
if (null === $scope) {
@@ -89,6 +113,7 @@ public static function register(): void
89113
$span = Span::fromContext($scope->context());
90114

91115
$request = ($params[0] instanceof Request) ? $params[0] : null;
116+
$response = ($params[1] instanceof Response) ? $params[1] : null;
92117
if (null !== $request) {
93118
$routeName = $request->attributes->get('_route', '');
94119

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

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

3636
$response = $kernel->handle(new Request());
37+
$kernel->terminate(new Request(), $response);
3738

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

5354
$response = $kernel->handle(new Request(), HttpKernelInterface::MAIN_REQUEST, true);
55+
$kernel->terminate(new Request(), $response);
5456

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

7476
$response = $kernel->handle($request);
77+
$kernel->terminate($request, $response);
7578

7679
$attributes = $this->storage[0]->getAttributes();
7780
$this->assertCount(1, $this->storage);
@@ -106,6 +109,8 @@ public function test_http_kernel_handle_stream_response(): void
106109
$this->assertCount(0, $this->storage);
107110

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

@@ -128,6 +133,8 @@ public function test_http_kernel_handle_binary_file_response(): void
128133
$this->assertCount(0, $this->storage);
129134

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

@@ -152,6 +159,8 @@ public function test_http_kernel_handle_with_empty_route(): void
152159
$request->attributes->set('_route', '');
153160

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

@@ -174,6 +183,8 @@ public function test_http_kernel_handle_without_route(): void
174183
$this->assertCount(0, $this->storage);
175184

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

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

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

203216
/** @var ImmutableSpan $span */

0 commit comments

Comments
 (0)