Skip to content

Commit 4c174ab

Browse files
committed
Added name generator service
1 parent 5fd8dba commit 4c174ab

File tree

6 files changed

+155
-18
lines changed

6 files changed

+155
-18
lines changed

src/Bridge/RequestSpanListener.php

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Jaeger\Http\HttpCodeTag;
77
use Jaeger\Http\HttpMethodTag;
88
use Jaeger\Http\HttpUriTag;
9+
use Jaeger\Symfony\Name\Generator\NameGeneratorInterface;
910
use Jaeger\Symfony\Tag\SymfonyComponentTag;
1011
use Jaeger\Symfony\Tag\SymfonyVersionTag;
1112
use Jaeger\Symfony\Tag\TimeMicroTag;
@@ -14,7 +15,6 @@
1415
use Jaeger\Tag\SpanKindServerTag;
1516
use Jaeger\Tracer\TracerInterface;
1617
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
17-
use Symfony\Component\HttpFoundation\Request;
1818
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
1919
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
2020
use Symfony\Component\HttpKernel\HttpKernelInterface;
@@ -24,11 +24,14 @@ class RequestSpanListener implements EventSubscriberInterface
2424
{
2525
private $spans;
2626

27+
private $nameGenerator;
28+
2729
private $tracer;
2830

29-
public function __construct(\SplStack $stack, TracerInterface $tracer)
31+
public function __construct(\SplStack $stack, NameGeneratorInterface $nameGenerator, TracerInterface $tracer)
3032
{
3133
$this->spans = $stack;
34+
$this->nameGenerator = $nameGenerator;
3235
$this->tracer = $tracer;
3336
}
3437

@@ -57,7 +60,7 @@ public function onRequest(GetResponseEvent $event)
5760
{
5861
$request = $event->getRequest();
5962
$requestSpan = $this->tracer->start(
60-
$this->getOperationName($request),
63+
$this->nameGenerator->generate(),
6164
[
6265
new HttpMethodTag($request->getMethod()),
6366
new HttpUriTag($request->getRequestUri()),
@@ -81,19 +84,4 @@ public function onRequest(GetResponseEvent $event)
8184

8285
return $this;
8386
}
84-
85-
public function getOperationName(Request $request)
86-
{
87-
if (null !== ($fragment = $request->attributes->get('is_fragment'))) {
88-
return ($controller = $request->attributes->get('_controller', null))
89-
? sprintf('fragment.%s', $controller)
90-
: 'fragment';
91-
}
92-
93-
if (null === ($routeName = $request->attributes->get('_route', null))) {
94-
return $request->getRequestUri();
95-
}
96-
97-
return $routeName;
98-
}
9987
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Jaeger\Symfony\Name\Generator;
5+
6+
use Symfony\Component\Console\ConsoleEvents;
7+
use Symfony\Component\Console\Event\ConsoleCommandEvent;
8+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
9+
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
10+
use Symfony\Component\HttpKernel\KernelEvents;
11+
12+
class DefaultNameGenerator implements NameGeneratorInterface, EventSubscriberInterface
13+
{
14+
private $name = '';
15+
16+
17+
public static function getSubscribedEvents()
18+
{
19+
return [
20+
KernelEvents::REQUEST => ['onRequest', 8192],
21+
ConsoleEvents::COMMAND => ['onCommand', 8192],
22+
KernelEvents::TERMINATE => ['onTerminate'],
23+
ConsoleEvents::TERMINATE => ['onTerminate'],
24+
];
25+
}
26+
27+
public function onCommand(ConsoleCommandEvent $event)
28+
{
29+
$this->name = $event->getCommand()->getName();
30+
31+
return $this;
32+
}
33+
34+
public function onRequest(GetResponseEvent $event)
35+
{
36+
$request = $event->getRequest();
37+
if (null !== ($fragment = $request->attributes->get('is_fragment'))) {
38+
$this->name = ($controller = $request->attributes->get('_controller', null))
39+
? sprintf('fragment.%s', $controller)
40+
: 'fragment';
41+
42+
return $this;
43+
}
44+
45+
if (null === ($routeName = $request->attributes->get('_route', null))) {
46+
$this->name = $request->getRequestUri();
47+
48+
return $this;
49+
}
50+
51+
$this->name = $routeName;
52+
53+
return $this;
54+
}
55+
56+
public function onTerminate()
57+
{
58+
$this->name = '';
59+
60+
return $this;
61+
}
62+
63+
public function generate(): string
64+
{
65+
return $this->name;
66+
}
67+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Jaeger\Symfony\Name\Generator;
5+
6+
class NameGeneratorChain implements NameGeneratorInterface
7+
{
8+
private $queue;
9+
10+
public function __construct(\SplPriorityQueue $queue)
11+
{
12+
$this->queue = $queue;
13+
}
14+
15+
public function add(NameGeneratorInterface $extractor, int $priority = 0): NameGeneratorChain
16+
{
17+
$this->queue->insert($extractor, $priority);
18+
19+
return $this;
20+
}
21+
22+
public function generate(): string
23+
{
24+
$queue = clone $this->queue;
25+
while (false === $queue->isEmpty()) {
26+
if ('' !== ($debugId = $queue->extract()->generate())) {
27+
return $debugId;
28+
}
29+
}
30+
31+
return '';
32+
}
33+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Jaeger\Symfony\Name\Generator;
5+
6+
interface NameGeneratorInterface
7+
{
8+
public function generate() : string;
9+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Jaeger\Symfony\Resources\DependencyInjection;
5+
6+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
7+
use Symfony\Component\DependencyInjection\ContainerBuilder;
8+
use Symfony\Component\DependencyInjection\Reference;
9+
10+
class NameGeneratorChainCompilerPass implements CompilerPassInterface
11+
{
12+
public function process(ContainerBuilder $container)
13+
{
14+
if (false === $container->hasDefinition('jaeger.name.generator.chain')) {
15+
throw new \RuntimeException(
16+
sprintf('Required service %s is missing from container', 'jaeger.name.generator.chain')
17+
);
18+
}
19+
20+
$definition = $container->getDefinition('jaeger.name.generator.chain');
21+
foreach ($container->findTaggedServiceIds('jaeger.name.generator') as $id => $tags) {
22+
foreach ($tags as $tag) {
23+
$priority = $tag['priority'] ?? 0;
24+
$definition->addMethodCall('add', [new Reference($id), $priority]);
25+
}
26+
}
27+
}
28+
}

src/Resources/config/services.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,17 @@ services:
113113
- '@spl.priority.queue'
114114
jaeger.debug.extractor:
115115
alias: 'jaeger.debug.extractor.chain'
116+
jaeger.name.generator.default:
117+
class: Jaeger\Symfony\Name\Generator\DefaultNameGenerator
118+
tags:
119+
- {name: 'kernel.event_subscriber' }
120+
- {name: 'jaeger.name.generator', priority: -1}
121+
jaeger.name.generator.chain:
122+
class: Jaeger\Symfony\Name\Generator\NameGeneratorChain
123+
arguments:
124+
- '@spl.priority.queue'
125+
jaeger.name.generator:
126+
alias: 'jaeger.name.generator.chain'
116127
jaeger.debug.listener:
117128
class: Jaeger\Symfony\Bridge\DebugListener
118129
arguments:
@@ -131,6 +142,7 @@ services:
131142
class: Jaeger\Symfony\Bridge\RequestSpanListener
132143
arguments:
133144
- '@spl.stack'
145+
- '@jaeger.name.generator'
134146
- '@jaeger.tracer'
135147
tags:
136148
- {name: 'kernel.event_subscriber' }

0 commit comments

Comments
 (0)