Skip to content

Commit dc9e6ef

Browse files
committed
Added debug listener
1 parent 4e074d7 commit dc9e6ef

14 files changed

+317
-34
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"symfony/console": "~2 || ~3",
1313
"symfony/http-kernel": "~2 || ~3",
1414
"symfony/dependency-injection": "~2 || ~3",
15-
"code-tool/jaeger-client-php": "~2.4"
15+
"code-tool/jaeger-client-php": "~2.5"
1616
},
1717
"require-dev": {
1818
"php-ds/php-ds": "@stable",

src/Bridge/AppStartSpanListener.php

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55

66
use Jaeger\Symfony\Tag\SymfonyComponentTag;
77
use Jaeger\Symfony\Tag\SymfonyVersionTag;
8-
use Jaeger\Tag\DoubleTag;
9-
use Jaeger\Tag\LongTag;
8+
use Jaeger\Symfony\Tag\TimeMicroTag;
9+
use Jaeger\Symfony\Tag\TimeSourceTag;
10+
use Jaeger\Symfony\Tag\TimeValueTag;
1011
use Jaeger\Tag\SpanKindServerTag;
11-
use Jaeger\Tag\StringTag;
1212
use Jaeger\Tracer\TracerInterface;
1313
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
1414
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
@@ -34,21 +34,22 @@ public static function getSubscribedEvents()
3434
public function onRequest(GetResponseEvent $event)
3535
{
3636
$request = $event->getRequest();
37-
if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) {
38-
$source = $request->server->has('REQUEST_TIME_FLOAT') ? 'header' : 'microtime';
39-
$value = $request->server->get('REQUEST_TIME_FLOAT', microtime(true));
40-
$startTime = (int)($value * 1000000);
41-
$this->tracer->finish(
42-
$this->tracer->start('symfony.start')
43-
->addTag(new SpanKindServerTag())
44-
->addTag(new SymfonyComponentTag())
45-
->addTag(new SymfonyVersionTag())
46-
->addTag(new StringTag('time.source', $source))
47-
->addTag(new DoubleTag('time.value', $value))
48-
->addTag(new LongTag('time.micro', $startTime))
49-
->start($startTime)
50-
);
37+
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
38+
return $this;
5139
}
40+
$source = $request->server->has('REQUEST_TIME_FLOAT') ? 'header' : 'microtime';
41+
$value = $request->server->get('REQUEST_TIME_FLOAT', microtime(true));
42+
$startTime = (int)($value * 1000000);
43+
$this->tracer->finish(
44+
$this->tracer->start('symfony.start')
45+
->addTag(new SpanKindServerTag())
46+
->addTag(new SymfonyComponentTag())
47+
->addTag(new SymfonyVersionTag())
48+
->addTag(new TimeSourceTag($source))
49+
->addTag(new TimeValueTag($value))
50+
->addTag(new TimeMicroTag($startTime))
51+
->start($startTime)
52+
);
5253

5354
return $this;
5455
}

src/Bridge/ContextInjector.php renamed to src/Bridge/ContextListener.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
1111
use Symfony\Component\HttpKernel\KernelEvents;
1212

13-
class ContextInjector implements EventSubscriberInterface
13+
class ContextListener implements EventSubscriberInterface
1414
{
1515
private $injectable;
1616

@@ -27,8 +27,8 @@ public function __construct(
2727
public static function getSubscribedEvents()
2828
{
2929
return [
30-
ConsoleEvents::COMMAND => ['onCommand', 4096],
31-
KernelEvents::REQUEST => ['onRequest', 4096],
30+
ConsoleEvents::COMMAND => ['onCommand', 8192],
31+
KernelEvents::REQUEST => ['onRequest', 8192],
3232
];
3333
}
3434

@@ -37,7 +37,7 @@ public function onCommand()
3737
return $this->inject();
3838
}
3939

40-
public function inject(): ContextInjector
40+
public function inject(): ContextListener
4141
{
4242
if (null === ($context = $this->extractor->extract())) {
4343
return $this;

src/Bridge/DebugListener.php

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Jaeger\Symfony\Bridge;
5+
6+
use Jaeger\Symfony\Debug\Extractor\DebugExtractorInterface;
7+
use Jaeger\Tracer\DebuggableInterface;
8+
use Symfony\Component\Console\ConsoleEvents;
9+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
10+
use Symfony\Component\HttpKernel\KernelEvents;
11+
12+
class DebugListener implements EventSubscriberInterface
13+
{
14+
private $debuggable;
15+
16+
private $extractor;
17+
18+
/**
19+
* DebugListener constructor.
20+
*
21+
* @param DebuggableInterface $debuggable
22+
* @param DebugExtractorInterface $extractor
23+
*/
24+
public function __construct(DebuggableInterface $debuggable, DebugExtractorInterface $extractor)
25+
{
26+
$this->debuggable = $debuggable;
27+
$this->extractor = $extractor;
28+
}
29+
30+
public static function getSubscribedEvents()
31+
{
32+
return [
33+
ConsoleEvents::COMMAND => ['onStart', 16384],
34+
KernelEvents::REQUEST => ['onStart', 16384],
35+
ConsoleEvents::TERMINATE => ['onTerminate'],
36+
KernelEvents::TERMINATE => ['onTerminate'],
37+
];
38+
}
39+
40+
public function onTerminate()
41+
{
42+
$this->debuggable->disable();
43+
44+
return $this;
45+
}
46+
47+
public function onStart()
48+
{
49+
if ('' === ($debugId = $this->extractor->getDebug())) {
50+
return $this;
51+
}
52+
$this->debuggable->enable($debugId);
53+
54+
return $this;
55+
}
56+
}

src/Bridge/RequestSpanListener.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public function __construct(\SplStack $stack, TracerInterface $tracer)
3535
public static function getSubscribedEvents()
3636
{
3737
return [
38-
KernelEvents::REQUEST => ['onRequest', 16],
38+
KernelEvents::REQUEST => ['onRequest', 4096],
3939
KernelEvents::RESPONSE => ['onResponse'],
4040
];
4141
}

src/Context/Extractor/EnvContextExtractor.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,17 @@ public static function getSubscribedEvents()
3333
{
3434
return [
3535
ConsoleEvents::COMMAND => ['onCommand', 8192],
36+
ConsoleEvents::TERMINATE => ['onTerminate'],
3637
];
3738
}
3839

40+
public function onTerminate()
41+
{
42+
$this->context = null;
43+
44+
return $this;
45+
}
46+
3947
public function extract(): ?SpanContext
4048
{
4149
return $this->context;

src/Context/Extractor/HeaderContextExtractor.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public static function getSubscribedEvents()
3535
{
3636
return [
3737
KernelEvents::REQUEST => ['onRequest', 8192],
38+
KernelEvents::TERMINATE => ['onTerminate'],
3839
];
3940
}
4041

@@ -43,6 +44,13 @@ public function extract(): ?SpanContext
4344
return $this->context;
4445
}
4546

47+
public function onTerminate()
48+
{
49+
$this->context = null;
50+
51+
return $this;
52+
}
53+
4654
public function onRequest(GetResponseEvent $event)
4755
{
4856
$request = $event->getRequest();
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Jaeger\Symfony\Debug\Extractor;
5+
6+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
7+
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
8+
use Symfony\Component\HttpKernel\HttpKernelInterface;
9+
use Symfony\Component\HttpKernel\KernelEvents;
10+
11+
class CookieDebugExtractor implements DebugExtractorInterface, EventSubscriberInterface
12+
{
13+
private $debugId = '';
14+
15+
private $cookieName;
16+
17+
public function __construct(string $cookieName)
18+
{
19+
$this->cookieName = $cookieName;
20+
}
21+
22+
public function onRequest(GetResponseEvent $event)
23+
{
24+
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
25+
return $this;
26+
}
27+
28+
$request = $event->getRequest();
29+
if (false === $request->cookies->has($this->cookieName)) {
30+
return $this;
31+
}
32+
33+
$this->debugId = (string)$request->cookies->get($this->cookieName, '');
34+
35+
return $this;
36+
}
37+
38+
public function onTerminate()
39+
{
40+
$this->debugId = '';
41+
42+
return $this;
43+
}
44+
45+
public function getDebug(): string
46+
{
47+
return $this->debugId;
48+
}
49+
50+
public static function getSubscribedEvents()
51+
{
52+
return [
53+
KernelEvents::REQUEST => ['onRequest', 8192],
54+
KernelEvents::TERMINATE => ['onTerminate'],
55+
];
56+
}
57+
58+
59+
}
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\Debug\Extractor;
5+
6+
class DebugExtractorChain implements DebugExtractorInterface
7+
{
8+
private $queue;
9+
10+
public function __construct(\SplPriorityQueue $queue)
11+
{
12+
$this->queue = $queue;
13+
}
14+
15+
public function add(DebugExtractorInterface $extractor, int $priority = 0): DebugExtractorChain
16+
{
17+
$this->queue->insert($extractor, $priority);
18+
19+
return $this;
20+
}
21+
22+
public function getDebug(): string
23+
{
24+
$queue = clone $this->queue;
25+
while (false === $queue->isEmpty()) {
26+
if ('' !== ($debugId = $queue->extract()->getDebug())) {
27+
return $debugId;
28+
}
29+
}
30+
31+
return '';
32+
}
33+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Jaeger\Symfony\Debug\Extractor;
5+
6+
interface DebugExtractorInterface
7+
{
8+
/**
9+
* @return string
10+
*/
11+
public function getDebug() : string;
12+
}

0 commit comments

Comments
 (0)