Skip to content

Commit 328dac6

Browse files
committed
Create exception listener
1 parent 5a49ee0 commit 328dac6

File tree

3 files changed

+89
-0
lines changed

3 files changed

+89
-0
lines changed

src/Bridge/ExceptionListener.php

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Jaeger\Symfony\Bridge;
5+
6+
use Jaeger\Span\SpanManagerInterface;
7+
use Jaeger\Tag\ErrorTag;
8+
use Jaeger\Tracer\TracerInterface;
9+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
10+
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
11+
use Symfony\Component\HttpKernel\Event\RequestEvent;
12+
use Symfony\Component\HttpKernel\Event\TerminateEvent;
13+
use Symfony\Component\HttpKernel\HttpKernelInterface;
14+
15+
class ExceptionListener implements EventSubscriberInterface
16+
{
17+
private $tracer;
18+
private $spanManager;
19+
private $globalSpanHandler;
20+
private $exceptionExist;
21+
22+
public function __construct(
23+
TracerInterface $tracer,
24+
SpanManagerInterface $spanManager,
25+
GlobalSpanHandler $globalSpanHandler
26+
) {
27+
$this->tracer = $tracer;
28+
$this->spanManager = $spanManager;
29+
$this->globalSpanHandler = $globalSpanHandler;
30+
$this->exceptionExist = false;
31+
}
32+
33+
public static function getSubscribedEvents(): array
34+
{
35+
return [
36+
ExceptionEvent::class => ['onKernelException', 0],
37+
RequestEvent::class => ['onRequest', 28],
38+
TerminateEvent::class => ['onTerminate', 4097],
39+
];
40+
}
41+
42+
public function onKernelException(ExceptionEvent $event): void
43+
{
44+
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
45+
return;
46+
}
47+
48+
$span = $this->spanManager->getSpan();
49+
50+
if (null !== $span) {
51+
$span->addTag(new ErrorTag());
52+
$this->exceptionExist = true;
53+
}
54+
}
55+
56+
public function onRequest(RequestEvent $event): void
57+
{
58+
if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) {
59+
return;
60+
}
61+
62+
if ($this->exceptionExist) {
63+
$span = $this->spanManager->getSpan();
64+
$span->addTag(new ErrorTag());
65+
}
66+
}
67+
68+
public function onTerminate(): void
69+
{
70+
if ($this->exceptionExist) {
71+
$this->globalSpanHandler->addTag(new ErrorTag());
72+
}
73+
}
74+
}

src/Bridge/GlobalSpanHandler.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Jaeger\Symfony\Tag\SymfonyComponentTag;
1111
use Jaeger\Symfony\Tag\SymfonyVersionTag;
1212
use Jaeger\Tag\SpanKindServerTag;
13+
use Jaeger\Thrift\Tag;
1314
use Jaeger\Tracer\TracerInterface;
1415
use Symfony\Component\HttpFoundation\Request;
1516

@@ -64,4 +65,9 @@ public function flush(): void
6465
$this->span->finish((int)$this->durationUsec);
6566
$this->span = $this->durationUsec = null;
6667
}
68+
69+
public function addTag(Tag $tag): void
70+
{
71+
$this->span->addTag($tag);
72+
}
6773
}

src/Resources/services.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,3 +189,12 @@ services:
189189
arguments: ['@jaeger.span.handler.background', '@jaeger.span.handler.gloabal']
190190
tags:
191191
- {name: 'kernel.event_subscriber' }
192+
193+
jaeger.exception.listener:
194+
class: Jaeger\Symfony\Bridge\ExceptionListener
195+
arguments:
196+
- '@jaeger.tracer'
197+
- '@jaeger.span.manager'
198+
- '@jaeger.span.handler.gloabal'
199+
tags:
200+
- {name: 'kernel.event_subscriber'}

0 commit comments

Comments
 (0)