Skip to content

Commit 92cf684

Browse files
authored
handle symfony subrequests (#262)
- kind=internal - name contains controller
1 parent e89dc2a commit 92cf684

File tree

4 files changed

+29
-2
lines changed

4 files changed

+29
-2
lines changed

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"readme": "./README.md",
88
"license": "Apache-2.0",
99
"minimum-stability": "dev",
10+
"prefer-stable": true,
1011
"require": {
1112
"php": "^8.0",
1213
"ext-opentelemetry": "*",

src/SymfonyInstrumentation.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Symfony\Component\HttpFoundation\Request;
1717
use Symfony\Component\HttpFoundation\Response;
1818
use Symfony\Component\HttpKernel\HttpKernel;
19+
use Symfony\Component\HttpKernel\HttpKernelInterface;
1920

2021
final class SymfonyInstrumentation
2122
{
@@ -37,11 +38,16 @@ public static function register(): void
3738
?int $lineno,
3839
) use ($instrumentation): array {
3940
$request = ($params[0] instanceof Request) ? $params[0] : null;
41+
$type = $params[1] ?? HttpKernelInterface::MAIN_REQUEST;
42+
$method = $request?->getMethod() ?? 'unknown';
43+
$name = ($type === HttpKernelInterface::SUB_REQUEST)
44+
? sprintf('%s %s', $method, $request?->attributes?->get('_controller') ?? 'sub-request')
45+
: $method;
4046
/** @psalm-suppress ArgumentTypeCoercion */
4147
$builder = $instrumentation
4248
->tracer()
43-
->spanBuilder(\sprintf('%s', $request?->getMethod() ?? 'unknown'))
44-
->setSpanKind(SpanKind::KIND_SERVER)
49+
->spanBuilder($name)
50+
->setSpanKind(($type === HttpKernelInterface::SUB_REQUEST) ? SpanKind::KIND_INTERNAL : SpanKind::KIND_SERVER)
4551
->setAttribute(TraceAttributes::CODE_FUNCTION, $function)
4652
->setAttribute(TraceAttributes::CODE_NAMESPACE, $class)
4753
->setAttribute(TraceAttributes::CODE_FILEPATH, $filename)

tests/Integration/AbstractTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use OpenTelemetry\API\Instrumentation\Configurator;
99
use OpenTelemetry\API\Trace\Propagation\TraceContextPropagator;
1010
use OpenTelemetry\Context\ScopeInterface;
11+
use OpenTelemetry\SDK\Trace\ImmutableSpan;
1112
use OpenTelemetry\SDK\Trace\SpanExporter\InMemoryExporter;
1213
use OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor;
1314
use OpenTelemetry\SDK\Trace\TracerProvider;
@@ -16,6 +17,7 @@
1617
abstract class AbstractTest extends TestCase
1718
{
1819
private ScopeInterface $scope;
20+
/** @var ArrayObject<int, ImmutableSpan> $storage */
1921
protected ArrayObject $storage;
2022

2123
public function setUp(): void

tests/Integration/SymfonyInstrumentationTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44

55
namespace OpenTelemetry\Tests\Instrumentation\Symfony\tests\Integration;
66

7+
use OpenTelemetry\API\Trace\SpanKind;
78
use OpenTelemetry\Contrib\Propagation\ServerTiming\ServerTimingPropagator;
89
use OpenTelemetry\Contrib\Propagation\TraceResponse\TraceResponsePropagator;
10+
use OpenTelemetry\SDK\Trace\ImmutableSpan;
911
use OpenTelemetry\SemConv\TraceAttributes;
1012
use Symfony\Component\EventDispatcher\EventDispatcher;
1113
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
@@ -164,6 +166,22 @@ public function test_http_kernel_handle_without_route(): void
164166
);
165167
}
166168

169+
public function test_http_kernel_handle_subrequest(): void
170+
{
171+
$kernel = $this->getHttpKernel(new EventDispatcher());
172+
$this->assertCount(0, $this->storage);
173+
$request = new Request();
174+
$request->attributes->set('_controller', 'ErrorController');
175+
176+
$kernel->handle($request, HttpKernelInterface::SUB_REQUEST);
177+
$this->assertCount(1, $this->storage);
178+
179+
/** @var ImmutableSpan $span */
180+
$span = $this->storage[0];
181+
$this->assertSame('GET ErrorController', $span->getName());
182+
$this->assertSame(SpanKind::KIND_INTERNAL, $span->getKind());
183+
}
184+
167185
private function getHttpKernel(EventDispatcherInterface $eventDispatcher, $controller = null, RequestStack $requestStack = null, array $arguments = []): HttpKernel
168186
{
169187
$controller ??= fn () => new Response('Hello');

0 commit comments

Comments
 (0)