Skip to content

Commit 36c3385

Browse files
committed
Added more elaborate background handling
1 parent 7f22030 commit 36c3385

File tree

6 files changed

+197
-55
lines changed

6 files changed

+197
-55
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Jaeger\Symfony\Bridge;
5+
6+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
7+
use Symfony\Component\HttpKernel\KernelEvents;
8+
9+
class BackgroundFinishListener implements EventSubscriberInterface
10+
{
11+
private $handler;
12+
13+
public function __construct(BackgroundSpanHandler $handler)
14+
{
15+
$this->handler = $handler;
16+
}
17+
18+
public static function getSubscribedEvents()
19+
{
20+
return [KernelEvents::TERMINATE => ['onTerminate', -4096],];
21+
}
22+
23+
public function onTerminate()
24+
{
25+
$this->handler->finish();
26+
27+
return $this;
28+
}
29+
}

src/Bridge/BackgroundSpanHandler.php

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Jaeger\Symfony\Bridge;
5+
6+
use Jaeger\Http\HttpMethodTag;
7+
use Jaeger\Http\HttpUriTag;
8+
use Jaeger\Symfony\Tag\SymfonyBackgroundTag;
9+
use Jaeger\Symfony\Tag\SymfonyComponentTag;
10+
use Jaeger\Symfony\Tag\SymfonyVersionTag;
11+
use Jaeger\Tag\SpanKindServerTag;
12+
use Jaeger\Tracer\TracerInterface;
13+
use Symfony\Component\HttpFoundation\Request;
14+
15+
class BackgroundSpanHandler
16+
{
17+
private $span;
18+
19+
private $tracer;
20+
21+
public function __construct(TracerInterface $tracer)
22+
{
23+
$this->tracer = $tracer;
24+
}
25+
26+
public function start(Request $request)
27+
{
28+
$this->span = $this->tracer->start(
29+
'background',
30+
[
31+
new HttpMethodTag($request->getMethod()),
32+
new HttpUriTag($request->getRequestUri()),
33+
new SpanKindServerTag(),
34+
new SymfonyComponentTag(),
35+
new SymfonyVersionTag(),
36+
new SymfonyBackgroundTag(),
37+
]
38+
);
39+
}
40+
41+
public function finish()
42+
{
43+
44+
}
45+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Jaeger\Symfony\Bridge;
5+
6+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
7+
use Symfony\Component\HttpKernel\Event\PostResponseEvent;
8+
use Symfony\Component\HttpKernel\KernelEvents;
9+
10+
class BackgroundStartListener implements EventSubscriberInterface
11+
{
12+
private $handler;
13+
14+
public function __construct(BackgroundSpanHandler $handler)
15+
{
16+
$this->handler = $handler;
17+
}
18+
19+
public static function getSubscribedEvents()
20+
{
21+
return [KernelEvents::TERMINATE => ['onTerminate', 4096],];
22+
}
23+
24+
public function onTerminate(PostResponseEvent $event)
25+
{
26+
$this->handler->start($event->getRequest());
27+
28+
return $this;
29+
}
30+
}

src/Bridge/GlobalSpanListener.php

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Jaeger\Symfony\Bridge;
5+
6+
use Jaeger\Http\HttpMethodTag;
7+
use Jaeger\Http\HttpUriTag;
8+
use Jaeger\Symfony\Name\Generator\NameGeneratorInterface;
9+
use Jaeger\Symfony\Tag\SymfonyComponentTag;
10+
use Jaeger\Symfony\Tag\SymfonyVersionTag;
11+
use Jaeger\Tag\SpanKindServerTag;
12+
use Jaeger\Tracer\TracerInterface;
13+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
14+
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
15+
use Symfony\Component\HttpKernel\HttpKernelInterface;
16+
use Symfony\Component\HttpKernel\KernelEvents;
17+
18+
class GlobalSpanListener implements EventSubscriberInterface
19+
{
20+
private $span;
21+
22+
private $nameGenerator;
23+
24+
private $tracer;
25+
26+
public function __construct(NameGeneratorInterface $nameGenerator, TracerInterface $tracer)
27+
{
28+
$this->nameGenerator = $nameGenerator;
29+
$this->tracer = $tracer;
30+
}
31+
32+
public static function getSubscribedEvents()
33+
{
34+
return [
35+
KernelEvents::REQUEST => ['onRequest', 30],
36+
KernelEvents::TERMINATE => ['onTerminate', -16384],
37+
];
38+
}
39+
40+
public function onTerminate()
41+
{
42+
if (null === $this->span) {
43+
return $this;
44+
}
45+
$this->tracer->finish($this->span);
46+
47+
return $this;
48+
}
49+
50+
public function onRequest(GetResponseEvent $event)
51+
{
52+
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
53+
return $this;
54+
}
55+
56+
$request = $event->getRequest();
57+
$requestSpan = $this->tracer->start(
58+
$this->nameGenerator->generate(),
59+
[
60+
new HttpMethodTag($request->getMethod()),
61+
new HttpUriTag($request->getRequestUri()),
62+
new SpanKindServerTag(),
63+
new SymfonyComponentTag(),
64+
new SymfonyVersionTag()
65+
]
66+
);
67+
$this->span = $requestSpan->start((int)1000000 * $request->server->get('REQUEST_TIME_FLOAT', microtime(true)));
68+
69+
return $this;
70+
}
71+
}

src/Bridge/RequestSpanListener.php

Lines changed: 2 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,13 @@
77
use Jaeger\Http\HttpMethodTag;
88
use Jaeger\Http\HttpUriTag;
99
use Jaeger\Symfony\Name\Generator\NameGeneratorInterface;
10-
use Jaeger\Symfony\Tag\SymfonyBackgroundTag;
1110
use Jaeger\Symfony\Tag\SymfonyComponentTag;
1211
use Jaeger\Symfony\Tag\SymfonyVersionTag;
13-
use Jaeger\Symfony\Tag\TimeMicroTag;
14-
use Jaeger\Symfony\Tag\TimeSourceTag;
15-
use Jaeger\Symfony\Tag\TimeValueTag;
1612
use Jaeger\Tag\SpanKindServerTag;
1713
use Jaeger\Tracer\TracerInterface;
1814
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
1915
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
2016
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
21-
use Symfony\Component\HttpKernel\Event\PostResponseEvent;
2217
use Symfony\Component\HttpKernel\HttpKernelInterface;
2318
use Symfony\Component\HttpKernel\KernelEvents;
2419

@@ -42,56 +37,15 @@ public static function getSubscribedEvents()
4237
return [
4338
KernelEvents::REQUEST => ['onRequest', 29],
4439
KernelEvents::RESPONSE => ['onResponse', -1024],
45-
KernelEvents::TERMINATE => ['onTerminate', -1024],
4640
];
4741
}
4842

49-
public function onTerminate(PostResponseEvent $event)
50-
{
51-
if ($this->spans->isEmpty()) {
52-
return $this;
53-
}
54-
55-
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
56-
return $this;
57-
}
58-
59-
$this->tracer->finish($this->spans->pop());
60-
$this->tracer->finish(
61-
$this->spans->pop()->addTag(new HttpCodeTag($event->getResponse()->getStatusCode()))
62-
);
63-
64-
return $this;
65-
}
66-
6743
public function onResponse(FilterResponseEvent $event)
6844
{
6945
if ($this->spans->isEmpty()) {
7046
return $this;
7147
}
72-
73-
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
74-
$this->tracer->finish(
75-
$this->spans->pop()->addTag(new HttpCodeTag($event->getResponse()->getStatusCode()))
76-
);
77-
78-
return $this;
79-
}
80-
81-
$request = $event->getRequest();
82-
$this->spans->push(
83-
$this->tracer->start(
84-
'background',
85-
[
86-
new HttpMethodTag($request->getMethod()),
87-
new HttpUriTag($request->getRequestUri()),
88-
new SpanKindServerTag(),
89-
new SymfonyComponentTag(),
90-
new SymfonyVersionTag(),
91-
new SymfonyBackgroundTag(),
92-
]
93-
)
94-
);
48+
$this->tracer->finish($this->spans->pop()->addTag(new HttpCodeTag($event->getResponse()->getStatusCode())));
9549

9650
return $this;
9751
}
@@ -110,14 +64,7 @@ public function onRequest(GetResponseEvent $event)
11064
]
11165
);
11266
if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) {
113-
$source = $request->server->has('REQUEST_TIME_FLOAT') ? 'header' : 'microtime';
114-
$value = $request->server->get('REQUEST_TIME_FLOAT', microtime(true));
115-
$startTime = (int)($value * 1000000);
116-
$requestSpan
117-
->addTag(new TimeSourceTag($source))
118-
->addTag(new TimeValueTag($value))
119-
->addTag(new TimeMicroTag($startTime))
120-
->start($startTime);
67+
$requestSpan->start((int)1000000 * $request->server->get('REQUEST_TIME_FLOAT', microtime(true)));
12168
}
12269

12370
$this->spans->push($requestSpan);

src/Resources/config/services.yml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,13 @@ services:
153153
- '@jaeger.tracer'
154154
tags:
155155
- {name: 'kernel.event_subscriber' }
156+
jaeger.global.span.listener:
157+
class: Jaeger\Symfony\Bridge\GlobalSpanListener
158+
arguments:
159+
- '@jaeger.name.generator'
160+
- '@jaeger.tracer'
161+
tags:
162+
- {name: 'kernel.event_subscriber' }
156163
jaeger.app.start.listener:
157164
class: Jaeger\Symfony\Bridge\AppStartSpanListener
158165
arguments: ['@jaeger.tracer']
@@ -163,3 +170,16 @@ services:
163170
arguments: ['@jaeger.tracer']
164171
tags:
165172
- {name: 'kernel.event_subscriber' }
173+
jaeger.span.handler.background:
174+
class: Jaeger\Symfony\Bridge\BackgroundSpanHandler
175+
arguments: ['@jaeger.tracer']
176+
jaeger.span.background.listener.finish:
177+
class: Jaeger\Symfony\Bridge\BackgroundFinishListener
178+
arguments: ['@jaeger.span.handler.background']
179+
tags:
180+
- {name: 'kernel.event_subscriber' }
181+
jaeger.span.background.listener.start:
182+
class: Jaeger\Symfony\Bridge\BackgroundStartListener
183+
arguments: ['@jaeger.span.handler.background']
184+
tags:
185+
- {name: 'kernel.event_subscriber' }

0 commit comments

Comments
 (0)