Skip to content

Commit c3e2485

Browse files
github-actions[bot]gaelreyrol
authored andcommitted
fix(DependencyInjection): ensure TracerInterface is aliased to main tracer
1 parent ae66add commit c3e2485

7 files changed

Lines changed: 397 additions & 5 deletions

File tree

src/DependencyInjection/OpenTelemetryTracesExtension.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use FriendsOfOpenTelemetry\OpenTelemetryBundle\OpenTelemetry\Exporter\ExporterOptionsInterface;
66
use FriendsOfOpenTelemetry\OpenTelemetryBundle\OpenTelemetry\Trace\TraceSamplerEnum;
7+
use OpenTelemetry\API\Trace\TracerInterface;
78
use Symfony\Component\DependencyInjection\ChildDefinition;
89
use Symfony\Component\DependencyInjection\ContainerBuilder;
910
use Symfony\Component\DependencyInjection\Reference;
@@ -56,11 +57,7 @@ public function __invoke(array $config, ContainerBuilder $container): void
5657

5758
if (null !== $defaultTracer) {
5859
$this->container->setAlias('open_telemetry.traces.default_tracer', new Reference(sprintf('open_telemetry.traces.tracers.%s', $defaultTracer)));
59-
60-
// $container->registerAttributeForAutoconfiguration(Traceable::class, static function (ChildDefinition $definition, Traceable $attribute) {
61-
// $tracer = null !== $attribute->tracer ? $attribute->tracer : 'open_telemetry.traces.default_tracer';
62-
// $definition->addTag('open_telemetry.traceable', ['tracer' => new Reference($tracer)]);
63-
// });
60+
$this->container->setAlias(TracerInterface::class, new Reference(sprintf('open_telemetry.traces.tracers.%s', $defaultTracer)));
6461
}
6562
}
6663

tests/Functional/Application/src/Controller/ActionTraceableController.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
use App\Entity\Dummy;
66
use Doctrine\ORM\EntityManagerInterface;
77
use FriendsOfOpenTelemetry\OpenTelemetryBundle\Instrumentation\Attribute\Traceable;
8+
use OpenTelemetry\API\Trace\StatusCode;
9+
use OpenTelemetry\API\Trace\TracerInterface;
10+
use OpenTelemetry\Context\Context;
11+
use OpenTelemetry\SemConv\TraceAttributes;
812
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
913
use Symfony\Component\HttpFoundation\Request;
1014
use Symfony\Component\HttpFoundation\Response;
@@ -80,4 +84,30 @@ public function notTraceable(): Response
8084
{
8185
return new Response(null, Response::HTTP_FOUND);
8286
}
87+
88+
#[Traceable]
89+
#[Route('/manual-action', methods: ['GET'])]
90+
public function manual(TracerInterface $tracer): Response
91+
{
92+
$spanBuilder = $tracer
93+
->spanBuilder('Manual')
94+
->setAttributes([
95+
TraceAttributes::CODE_FUNCTION_NAME => 'manual',
96+
TraceAttributes::CODE_NAMESPACE => self::class,
97+
]);
98+
99+
$parent = Context::getCurrent();
100+
101+
$span = $spanBuilder->setParent($parent)->startSpan();
102+
sleep(1);
103+
$span->addEvent('sleep', [
104+
'sleep.duration' => '1s',
105+
]);
106+
$span->setStatus(StatusCode::STATUS_OK);
107+
$span->end();
108+
109+
return $this->json([
110+
'status' => 'ok',
111+
]);
112+
}
83113
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
namespace App\Controller;
4+
5+
use OpenTelemetry\API\Trace\StatusCode;
6+
use OpenTelemetry\API\Trace\TracerInterface;
7+
use OpenTelemetry\Context\Context;
8+
use OpenTelemetry\SemConv\TraceAttributes;
9+
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
10+
use Symfony\Component\DependencyInjection\Attribute\Autowire;
11+
use Symfony\Component\HttpFoundation\Response;
12+
use Symfony\Component\Routing\Attribute\Route;
13+
14+
class AutowireTracerController extends AbstractController
15+
{
16+
public function __construct(
17+
#[Autowire('@open_telemetry.traces.tracers.fallback')]
18+
private readonly TracerInterface $tracer,
19+
) {
20+
}
21+
22+
#[Route('/autowire-tracer', methods: ['GET'])]
23+
public function index(): Response
24+
{
25+
$spanBuilder = $this->tracer
26+
->spanBuilder('Manual')
27+
->setAttributes([
28+
TraceAttributes::CODE_FUNCTION_NAME => 'manual',
29+
TraceAttributes::CODE_NAMESPACE => self::class,
30+
]);
31+
32+
$parent = Context::getCurrent();
33+
34+
$span = $spanBuilder->setParent($parent)->startSpan();
35+
sleep(1);
36+
$span->addEvent('sleep', [
37+
'sleep.duration' => '1s',
38+
]);
39+
$span->setStatus(StatusCode::STATUS_OK);
40+
$span->end();
41+
42+
return $this->json([
43+
'status' => 'ok',
44+
]);
45+
}
46+
}

tests/Functional/Application/src/Controller/ClassTraceableController.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,51 @@
33
namespace App\Controller;
44

55
use FriendsOfOpenTelemetry\OpenTelemetryBundle\Instrumentation\Attribute\Traceable;
6+
use OpenTelemetry\API\Trace\StatusCode;
7+
use OpenTelemetry\API\Trace\TracerInterface;
8+
use OpenTelemetry\Context\Context;
9+
use OpenTelemetry\SemConv\TraceAttributes;
610
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
711
use Symfony\Component\HttpFoundation\Response;
812
use Symfony\Component\Routing\Attribute\Route;
913

1014
#[Traceable]
1115
class ClassTraceableController extends AbstractController
1216
{
17+
public function __construct(private readonly TracerInterface $tracer)
18+
{
19+
}
20+
1321
#[Route('/class-traceable', methods: ['GET'])]
1422
public function index(): Response
1523
{
1624
return $this->json([
1725
'status' => 'ok',
1826
]);
1927
}
28+
29+
#[Route('/class-manual', methods: ['GET'])]
30+
public function manual(): Response
31+
{
32+
$spanBuilder = $this->tracer
33+
->spanBuilder('Manual')
34+
->setAttributes([
35+
TraceAttributes::CODE_FUNCTION_NAME => 'manual',
36+
TraceAttributes::CODE_NAMESPACE => self::class,
37+
]);
38+
39+
$parent = Context::getCurrent();
40+
41+
$span = $spanBuilder->setParent($parent)->startSpan();
42+
sleep(1);
43+
$span->addEvent('sleep', [
44+
'sleep.duration' => '1s',
45+
]);
46+
$span->setStatus(StatusCode::STATUS_OK);
47+
$span->end();
48+
49+
return $this->json([
50+
'status' => 'ok',
51+
]);
52+
}
2053
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
namespace App\Controller;
4+
5+
use FriendsOfOpenTelemetry\OpenTelemetryBundle\Instrumentation\Attribute\Traceable;
6+
use OpenTelemetry\API\Trace\StatusCode;
7+
use OpenTelemetry\API\Trace\TracerInterface;
8+
use OpenTelemetry\Context\Context;
9+
use OpenTelemetry\SemConv\TraceAttributes;
10+
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
11+
use Symfony\Component\DependencyInjection\Attribute\Autowire;
12+
use Symfony\Component\HttpFoundation\Response;
13+
use Symfony\Component\Routing\Attribute\Route;
14+
15+
#[Traceable]
16+
class DualTracerController extends AbstractController
17+
{
18+
#[Route('/fallback-dual-tracer', methods: ['GET'])]
19+
public function fallback(
20+
#[Autowire('@open_telemetry.traces.tracers.fallback')]
21+
TracerInterface $tracer,
22+
): Response {
23+
$spanBuilder = $tracer
24+
->spanBuilder('Manual')
25+
->setAttributes([
26+
TraceAttributes::CODE_FUNCTION_NAME => 'manual',
27+
TraceAttributes::CODE_NAMESPACE => self::class,
28+
]);
29+
30+
$parent = Context::getCurrent();
31+
32+
$span = $spanBuilder->setParent($parent)->startSpan();
33+
sleep(1);
34+
$span->addEvent('sleep', [
35+
'sleep.duration' => '1s',
36+
]);
37+
$span->setStatus(StatusCode::STATUS_OK);
38+
$span->end();
39+
40+
return $this->json([
41+
'status' => 'ok',
42+
]);
43+
}
44+
45+
#[Route('/main-dual-tracer', methods: ['GET'])]
46+
public function main(
47+
#[Autowire('@open_telemetry.traces.tracers.main')]
48+
TracerInterface $tracer,
49+
): Response {
50+
$spanBuilder = $tracer
51+
->spanBuilder('Manual')
52+
->setAttributes([
53+
TraceAttributes::CODE_FUNCTION_NAME => 'manual',
54+
TraceAttributes::CODE_NAMESPACE => self::class,
55+
]);
56+
57+
$parent = Context::getCurrent();
58+
59+
$span = $spanBuilder->setParent($parent)->startSpan();
60+
sleep(1);
61+
$span->addEvent('sleep', [
62+
'sleep.duration' => '1s',
63+
]);
64+
$span->setStatus(StatusCode::STATUS_OK);
65+
$span->end();
66+
67+
return $this->json([
68+
'status' => 'ok',
69+
]);
70+
}
71+
}

0 commit comments

Comments
 (0)