Skip to content

Commit a166ef0

Browse files
committed
Spllit ContextInjector into 2 classes
1 parent bfdc09b commit a166ef0

File tree

5 files changed

+150
-80
lines changed

5 files changed

+150
-80
lines changed

composer.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
"symfony/console": "~2 || ~3",
1313
"symfony/http-kernel": "~2 || ~3",
1414
"symfony/dependency-injection": "~2 || ~3",
15-
"symfony/routing": "~2 || ~3",
1615
"code-tool/jaeger-client-php": "~2"
1716
},
1817
"require-dev": {

src/Bridge/AppStartSpanListener.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Jaeger\Symfony\Bridge;
5+
6+
use Jaeger\Tracer\TracerInterface;
7+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
8+
use Symfony\Component\HttpFoundation\Request;
9+
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
10+
use Symfony\Component\HttpKernel\HttpKernelInterface;
11+
use Symfony\Component\HttpKernel\KernelEvents;
12+
13+
class AppStartSpanListener implements EventSubscriberInterface
14+
{
15+
private $tracer;
16+
17+
public function __construct(TracerInterface $tracer)
18+
{
19+
$this->tracer = $tracer;
20+
}
21+
22+
public function getStartTime(Request $request): int
23+
{
24+
return (int)($request->server->get('REQUEST_TIME_FLOAT', microtime(true)) * 1000000);
25+
}
26+
27+
public static function getSubscribedEvents()
28+
{
29+
return [
30+
KernelEvents::REQUEST => ['onRequest'],
31+
];
32+
}
33+
34+
public function onRequest(GetResponseEvent $event)
35+
{
36+
$request = $event->getRequest();
37+
if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) {
38+
$this->tracer->finish($this->tracer->start('app.start')->start($this->getStartTime($request)));
39+
}
40+
41+
return $this;
42+
}
43+
}

src/Bridge/ContextInjector.php

Lines changed: 6 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,16 @@
55

66
use Jaeger\Codec\CodecInterface;
77
use Jaeger\Codec\CodecRegistry;
8-
use Jaeger\Http\HttpCodeTag;
9-
use Jaeger\Http\HttpMethodTag;
10-
use Jaeger\Http\HttpUriTag;
11-
use Jaeger\Tag\DoubleTag;
12-
use Jaeger\Tag\LongTag;
13-
use Jaeger\Tag\StringTag;
148
use Jaeger\Tracer\InjectableInterface;
159
use Jaeger\Tracer\TracerInterface;
1610
use Symfony\Component\Console\ConsoleEvents;
1711
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
18-
use Symfony\Component\HttpFoundation\Request;
19-
use Symfony\Component\HttpFoundation\RequestStack;
20-
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
2112
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
2213
use Symfony\Component\HttpKernel\HttpKernelInterface;
2314
use Symfony\Component\HttpKernel\KernelEvents;
24-
use Symfony\Component\Routing\RouterInterface;
2515

2616
class ContextInjector implements EventSubscriberInterface
2717
{
28-
private $spans;
29-
3018
private $injectable;
3119

3220
private $tracer;
@@ -36,33 +24,23 @@ class ContextInjector implements EventSubscriberInterface
3624
*/
3725
private $registry;
3826

39-
private $requestStack;
40-
41-
private $router;
42-
4327
private $format;
4428

4529
private $envName;
4630

4731
private $headerName;
4832

4933
public function __construct(
50-
\SplStack $stack,
5134
InjectableInterface $injectable,
5235
TracerInterface $tracer,
5336
CodecRegistry $registry,
54-
RequestStack $requestStack,
55-
RouterInterface $router,
5637
string $format,
5738
string $envName,
5839
string $headerName
5940
) {
60-
$this->spans = $stack;
6141
$this->injectable = $injectable;
6242
$this->tracer = $tracer;
6343
$this->registry = $registry;
64-
$this->requestStack = $requestStack;
65-
$this->router = $router;
6644
$this->format = $format;
6745
$this->envName = $envName;
6846
$this->headerName = $headerName;
@@ -71,45 +49,18 @@ public function __construct(
7149
public static function getSubscribedEvents()
7250
{
7351
return [
74-
ConsoleEvents::COMMAND => [['onCommand']],
75-
KernelEvents::REQUEST => [['onRequest']],
76-
KernelEvents::RESPONSE => [['onResponse']],
52+
ConsoleEvents::COMMAND => ['onCommand'],
53+
KernelEvents::REQUEST => ['onRequest'],
7754
];
7855
}
7956

80-
public function getOperationName(Request $request)
81-
{
82-
if (null !== ($fragment = $request->attributes->get('is_fragment'))) {
83-
return ($controller = $request->attributes->get('_controller', null))
84-
? sprintf('fragment.%s', $controller)
85-
: 'fragment';
86-
}
87-
88-
if (null === ($routeName = $request->attributes->get('_route', null))) {
89-
return $request->getRequestUri();
90-
}
91-
92-
return $routeName;
93-
}
94-
95-
public function onResponse(FilterResponseEvent $event)
96-
{
97-
$this->tracer->finish(
98-
$this->spans->pop()->addTag(new HttpCodeTag($event->getResponse()->getStatusCode()))
99-
);
100-
101-
return $this;
102-
}
103-
10457
public function onCommand()
10558
{
106-
if (null === ($data = $_ENV[$this->envName] ?? null)) {
107-
return $this;
108-
}
109-
if (null === ($context = $this->registry[$this->format]->decode($data))) {
110-
return $this;
59+
if (($data = $_ENV[$this->envName] ?? null)
60+
&& $context = $this->registry[$this->format]->decode($data)) {
61+
$this->injectable->assign($context);
11162
}
112-
$this->injectable->assign($context);
63+
11364

11465
return $this;
11566
}
@@ -123,27 +74,6 @@ public function onRequest(GetResponseEvent $event)
12374
$this->injectable->assign($context);
12475
}
12576

126-
$requestSpan = $this->tracer->start(
127-
$this->getOperationName($request),
128-
[
129-
new HttpMethodTag($request->getMethod()),
130-
new HttpUriTag($request->getRequestUri()),
131-
]
132-
);
133-
134-
if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) {
135-
$source = $request->server->has('REQUEST_TIME_FLOAT') ? 'header' : 'microtime';
136-
$value = $request->server->get('REQUEST_TIME_FLOAT', microtime(true));
137-
$startTime = (int)($value * 1000000);
138-
$requestSpan
139-
->addTag(new StringTag('time.source', $source))
140-
->addTag(new DoubleTag('time.value', $value))
141-
->addTag(new LongTag('time.micro', $startTime))
142-
->start($startTime);
143-
$this->tracer->finish($this->tracer->start('app.start')->start($startTime));
144-
}
145-
$this->spans->push($requestSpan);
146-
14777
return $this;
14878
}
14979
}

src/Bridge/RequestSpanListener.php

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Jaeger\Symfony\Bridge;
5+
6+
use Jaeger\Http\HttpCodeTag;
7+
use Jaeger\Http\HttpMethodTag;
8+
use Jaeger\Http\HttpUriTag;
9+
use Jaeger\Tag\DoubleTag;
10+
use Jaeger\Tag\LongTag;
11+
use Jaeger\Tag\StringTag;
12+
use Jaeger\Tracer\TracerInterface;
13+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
14+
use Symfony\Component\HttpFoundation\Request;
15+
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
16+
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
17+
use Symfony\Component\HttpKernel\HttpKernelInterface;
18+
use Symfony\Component\HttpKernel\KernelEvents;
19+
20+
class RequestSpanListener implements EventSubscriberInterface
21+
{
22+
private $spans;
23+
24+
private $tracer;
25+
26+
public function __construct(\SplStack $stack, TracerInterface $tracer)
27+
{
28+
$this->spans = $stack;
29+
$this->tracer = $tracer;
30+
}
31+
32+
public static function getSubscribedEvents()
33+
{
34+
return [
35+
KernelEvents::REQUEST => ['onRequest', 1],
36+
KernelEvents::RESPONSE => ['onResponse', 1],
37+
];
38+
}
39+
40+
public function getOperationName(Request $request)
41+
{
42+
if (null !== ($fragment = $request->attributes->get('is_fragment'))) {
43+
return ($controller = $request->attributes->get('_controller', null))
44+
? sprintf('fragment.%s', $controller)
45+
: 'fragment';
46+
}
47+
48+
if (null === ($routeName = $request->attributes->get('_route', null))) {
49+
return $request->getRequestUri();
50+
}
51+
52+
return $routeName;
53+
}
54+
55+
public function onResponse(FilterResponseEvent $event)
56+
{
57+
$this->tracer->finish(
58+
$this->spans->pop()->addTag(new HttpCodeTag($event->getResponse()->getStatusCode()))
59+
);
60+
61+
return $this;
62+
}
63+
64+
public function onRequest(GetResponseEvent $event)
65+
{
66+
$request = $event->getRequest();
67+
$requestSpan = $this->tracer->start(
68+
$this->getOperationName($request),
69+
[
70+
new HttpMethodTag($request->getMethod()),
71+
new HttpUriTag($request->getRequestUri()),
72+
]
73+
);
74+
75+
if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) {
76+
$source = $request->server->has('REQUEST_TIME_FLOAT') ? 'header' : 'microtime';
77+
$value = $request->server->get('REQUEST_TIME_FLOAT', microtime(true));
78+
$startTime = (int)($value * 1000000);
79+
$requestSpan
80+
->addTag(new StringTag('time.source', $source))
81+
->addTag(new DoubleTag('time.value', $value))
82+
->addTag(new LongTag('time.micro', $startTime))
83+
->start($startTime);
84+
}
85+
$this->spans->push($requestSpan);
86+
87+
return $this;
88+
}
89+
}

src/Resources/config/services.yml

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,17 +67,26 @@ services:
6767
jaeger.context.injector:
6868
class: Jaeger\Symfony\Bridge\ContextInjector
6969
arguments:
70-
- '@spl.stack'
7170
- '@jaeger.tracer'
7271
- '@jaeger.tracer'
7372
- '@jaeger.codec.registry'
74-
- '@request_stack'
75-
- '@router'
7673
- '%env(JAEGER_CONTEXT_FORMAT)%'
7774
- '%env(JAEGER_CONTEXT_ENV)%'
7875
- '%env(JAEGER_CONTEXT_HEADER)%'
7976
tags:
8077
- {name: 'kernel.event_subscriber' }
78+
request.span.listener:
79+
class: Jaeger\Symfony\Bridge\RequestSpanListener
80+
arguments:
81+
- '@spl.stack'
82+
- '@jaeger.tracer'
83+
tags:
84+
- {name: 'kernel.event_subscriber' }
85+
app.start.listener:
86+
class: Jaeger\Symfony\Bridge\AppStartSpanListener
87+
arguments: ['@jaeger.tracer']
88+
tags:
89+
- {name: 'kernel.event_subscriber' }
8190
symfony.jaeger.tracer.bridge:
8291
class: Jaeger\Symfony\Bridge\TracerBridge
8392
arguments: ['@jaeger.tracer']

0 commit comments

Comments
 (0)