Skip to content

Commit

Permalink
Merge pull request #59 from jcchavezs/improvements
Browse files Browse the repository at this point in the history
refactor: improves performance of the library
  • Loading branch information
jcchavezs committed Apr 8, 2020
2 parents 1cabcfd + b76b932 commit 68004ba
Show file tree
Hide file tree
Showing 10 changed files with 235 additions and 61 deletions.
9 changes: 9 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,10 @@ jobs:
- run: |
# wait just in case
sleep 1
# makes sure we get one trace
test $(curl -s 127.0.0.1:9411/api/v2/traces | jq '.[0] | length') -eq 1
# makes sure the trace does not contain errors
test $(curl -s 127.0.0.1:9411/api/v2/traces | jq -c '.[0][0].tags.error') = "null"
exit $?
symfony-4:
Expand Down Expand Up @@ -66,7 +69,10 @@ jobs:
- run: |
# wait just in case
sleep 1
# makes sure we get one trace
test $(curl -s 127.0.0.1:9411/api/v2/traces | jq '.[0] | length') -eq 1
# makes sure the trace does not contain errors
test $(curl -s 127.0.0.1:9411/api/v2/traces | jq -c '.[0][0].tags.error') = "null"
exit $?
symfony-5:
Expand Down Expand Up @@ -100,7 +106,10 @@ jobs:
- run: |
# wait just in case
sleep 1
# makes sure we get one trace
test $(curl -s 127.0.0.1:9411/api/v2/traces | jq '.[0] | length') -eq 1
# makes sure the trace does not contain errors
test $(curl -s 127.0.0.1:9411/api/v2/traces | jq -c '.[0][0].tags.error') = "null"
exit $?
workflows:
Expand Down
6 changes: 6 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ jobs:
env: SYMFONY_VERSION=4.4
- php: "7.3"
env: SYMFONY_VERSION=4.4
- php: "7.2"
env: SYMFONY_VERSION=5.0
- php: "7.3"
env: SYMFONY_VERSION=5.0
- php: "7.4"
env: SYMFONY_VERSION=5.0

install:
- composer require symfony/config:"^$SYMFONY_VERSION" symfony/http-kernel:"^$SYMFONY_VERSION" symfony/routing:"^$SYMFONY_VERSION" symfony/dependency-injection:"^$SYMFONY_VERSION"
Expand Down
20 changes: 12 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@ services:
- "@zipkin.default_tracing"
- "@logger"
tags:
- { name: kernel.event_listener, event: kernel.request, priority: 256 }
- { name: kernel.event_listener, event: kernel.terminate }
- { name: kernel.event_listener, event: kernel.request, priority: 2560 }
- { name: kernel.event_listener, event: kernel.response, priority: -2560 }
- { name: kernel.event_listener, event: kernel.exception }
- { name: kernel.event_listener, event: kernel.terminate }
```

`@zipkin.default_tracing` is a `Zipkin\DefaultTracing` instance which is being
Expand Down Expand Up @@ -144,9 +145,10 @@ services:
- "@logger"
- { instance: %instance_name% }
tags:
- { name: kernel.event_listener, event: kernel.request, priority: 256 }
- { name: kernel.event_listener, event: kernel.terminate }
- { name: kernel.event_listener, event: kernel.request, priority: 2560 }
- { name: kernel.event_listener, event: kernel.response, priority: -2560 }
- { name: kernel.event_listener, event: kernel.exception }
- { name: kernel.event_listener, event: kernel.terminate }
```

## Custom Tracing
Expand All @@ -163,9 +165,10 @@ services:
- "@my_own_tracing"
- "@logger"
tags:
- { name: kernel.event_listener, event: kernel.request, priority: 256 }
- { name: kernel.event_listener, event: kernel.terminate }
- { name: kernel.event_listener, event: kernel.request, priority: 2560 }
- { name: kernel.event_listener, event: kernel.response, priority: -2560 }
- { name: kernel.event_listener, event: kernel.exception }
- { name: kernel.event_listener, event: kernel.terminate }
```

## Span customizers
Expand Down Expand Up @@ -201,9 +204,10 @@ services:
- { instance: %instance_name% }
- "@zipkin.span_customizer.by_path_namer"
tags:
- { name: kernel.event_listener, event: kernel.request, priority: 256 }
- { name: kernel.event_listener, event: kernel.terminate }
- { name: kernel.event_listener, event: kernel.request, priority: 2560 }
- { name: kernel.event_listener, event: kernel.response, priority: -2560 }
- { name: kernel.event_listener, event: kernel.exception }
- { name: kernel.event_listener, event: kernel.terminate }
```

## Contributing
Expand Down
2 changes: 1 addition & 1 deletion src/ZipkinBundle/DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ final class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
if (Kernel::VERSION[0] == '5') {
if (Kernel::VERSION[0] === '5') {
$treeBuilder = new TreeBuilder('zipkin');
$rootNode = $treeBuilder->getRootNode();
} else {
Expand Down
125 changes: 87 additions & 38 deletions src/ZipkinBundle/Middleware.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,21 @@
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\KernelEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;

final class Middleware
{
const SPAN_CLOSER_KEY = 'zipkin_bundle_span_closer';

/**
* @var Tracing
* @var Tracer
*/
private $tracing;
private $tracer;

/**
* @var callable
*/
private $extractor;

/**
* @var LoggerInterface
Expand All @@ -43,15 +49,16 @@ final class Middleware
/**
* @var bool
*/
private $usesDeprecatedEvents = false;
private $usesDeprecatedEvents;

public function __construct(
Tracing $tracing,
LoggerInterface $logger,
array $tags = [],
SpanCustomizer ...$spanCustomizers
) {
$this->tracing = $tracing;
$this->tracer = $tracing->getTracer();
$this->extractor = $tracing->getPropagation()->getExtractor(new Map());
$this->logger = $logger;
$this->tags = $tags;
$this->spanCustomizers = $spanCustomizers;
Expand All @@ -77,7 +84,7 @@ public function onKernelRequest(KernelEvent $event)
return;
}

$span = $this->tracing->getTracer()->nextSpan($spanContext);
$span = $this->tracer->nextSpan($spanContext);
$span->start();
$span->setName($request->getMethod());
$span->setKind(Kind\SERVER);
Expand All @@ -88,7 +95,7 @@ public function onKernelRequest(KernelEvent $event)
$span->tag($key, $value);
}

$request->attributes->set(self::SPAN_CLOSER_KEY, $this->tracing->getTracer()->openScope($span));
$request->attributes->set(self::SPAN_CLOSER_KEY, $this->tracer->openScope($span));
}

/**
Expand All @@ -100,7 +107,7 @@ public function onKernelController(KernelEvent $event)
return;
}

$span = $this->tracing->getTracer()->getCurrentSpan();
$span = $this->tracer->getCurrentSpan();
if ($span !== null) {
$span->annotate('symfony.kernel.controller', now());
}
Expand All @@ -115,32 +122,79 @@ public function onKernelException(KernelEvent $event)
return;
}

$span = $this->tracing->getTracer()->getCurrentSpan();
if ($span !== null) {
$span = $this->tracer->getCurrentSpan();
if ($span === null) {
return;
}

if ($this->usesDeprecatedEvents) {
/**
* @var \Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent $event
*/
$errorMessage = $event->getException()->getMessage();
} else {
/**
* @var \Symfony\Component\HttpKernel\Event\ExceptionEvent $event
*/
$errorMessage = $event->getThrowable()->getMessage();
}

$span->tag(Tags\ERROR, $errorMessage);
$this->finishSpan($event->getRequest(), null);
}

/**
* @see https://symfony.com/doc/4.4/reference/events.html#kernel-response
*/
public function onKernelResponse(KernelEvent $event)
{
if ($this->usesDeprecatedEvents) {
/**
* @var \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
*/
} else {
/**
* @var \Symfony\Component\HttpKernel\Event\ResponseEvent $event
*/
}

$this->finishSpan($event->getRequest(), $event->getResponse());
}

/**
* @see https://symfony.com/doc/4.4/reference/events.html#kernel-terminate
*/
public function onKernelTerminate(KernelEvent $event)
{
// Previously, the onKernelResponse listener did not exist in this class
// and hence we finished the span and closed the scope on terminate.
// However, terminate happens after the response have been sent and it could
// happen that span is being finished after some other processing attached by
// the user. onKernelResponse is the right place to finish the span but in order
// to not to break existing user relaying on the onKernelTerminate to finish
// the span we add this temporary fix.

$scopeCloser = $event->getRequest()->attributes->get(self::SPAN_CLOSER_KEY);
if ($scopeCloser !== null) {
if ($this->usesDeprecatedEvents) {
/**
* @var Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent $event
* @var \Symfony\Component\HttpKernel\Event\PostResponseEvent $event
*/
$errorMessage = $event->getException()->getMessage();
} else {
/**
* @var Symfony\Component\HttpKernel\Event\ExceptionEvent $event
* @var \Symfony\Component\HttpKernel\Event\TerminateEvent $event
*/
$errorMessage = $event->getThrowable()->getMessage();
}

$span->tag(Tags\ERROR, $errorMessage);
$this->finishSpan($event->getRequest(), $event->getResponse());
}

$this->flushTracer();
}

/**
* @see https://symfony.com/doc/4.4/reference/events.html#kernel-terminate
*/
public function onKernelTerminate(KernelEvent $event)
private function finishSpan(Request $request, $response)
{
$request = $event->getRequest();

$span = $this->tracing->getTracer()->getCurrentSpan();
$span = $this->tracer->getCurrentSpan();
if ($span === null) {
return;
}
Expand All @@ -154,20 +208,19 @@ public function onKernelTerminate(KernelEvent $event)
$span->tag('symfony.route', $routeName);
}

$statusCode = $event->getResponse()->getStatusCode();
if ($statusCode > 399) {
$span->tag(Tags\ERROR, (string) $statusCode);
if ($response != null) {
$statusCode = $response->getStatusCode();
if ($statusCode > 399) {
$span->tag(Tags\ERROR, (string) $statusCode);
}
$span->tag(Tags\HTTP_STATUS_CODE, (string) $statusCode);
}

$span->tag(Tags\HTTP_STATUS_CODE, (string) $statusCode);
$span->finish();

$scopeCloser = $request->attributes->get(self::SPAN_CLOSER_KEY);
if ($scopeCloser !== null) {
$scopeCloser();
}

$this->flushTracer();
}

/**
Expand All @@ -176,9 +229,7 @@ public function onKernelTerminate(KernelEvent $event)
*/
private function extractContextFromRequest(Request $request)
{
$extractor = $this->tracing->getPropagation()->getExtractor(new Map());

return $extractor(array_map(
return ($this->extractor)(array_map(
function ($values) {
return $values[0];
},
Expand All @@ -188,12 +239,10 @@ function ($values) {

private function flushTracer()
{
register_shutdown_function(function (Tracer $tracer, LoggerInterface $logger) {
try {
$tracer->flush();
} catch (Exception $e) {
$logger->error($e->getMessage());
}
}, $this->tracing->getTracer(), $this->logger);
try {
$this->tracer->flush();
} catch (Exception $e) {
$this->logger->error($e->getMessage());
}
}
}
4 changes: 2 additions & 2 deletions tests/Integration/Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
SYMFONY_VERSION ?= dev-master
LIBRARY_BRANCH ?= 3.0
SYMFONY_VERSION ?= 4.4
LIBRARY_BRANCH ?= master

build: ## Builds the symfony app
./build.sh $(SYMFONY_VERSION) $(LIBRARY_BRANCH) $(SAMPLER)
Expand Down
5 changes: 3 additions & 2 deletions tests/Integration/tracing.custom.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ services:
- { "version": "xxx" }
- "@zipkin.span_namer.route"
tags:
- { name: kernel.event_listener, event: kernel.request, priority: 256 }
- { name: kernel.event_listener, event: kernel.terminate }
- { name: kernel.event_listener, event: kernel.request, priority: 2560 }
- { name: kernel.event_listener, event: kernel.response, priority: -2560 }
- { name: kernel.event_listener, event: kernel.exception }
- { name: kernel.event_listener, event: kernel.terminate }
7 changes: 4 additions & 3 deletions tests/Integration/tracing.default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ zipkin:
services:
zipkin.span_namer.route:
class: ZipkinBundle\SpanCustomizers\ByPathNamer\SpanCustomizer
factory: [ZipkinBundle\SpanCustomizers\ByPathNamer\SpanCustomizer, 'create']
factory: [ZipkinBundle\SpanCustomizers\ByPathNamer\SpanCustomizer, "create"]
arguments:
- "%kernel.cache_dir%"

Expand All @@ -33,6 +33,7 @@ services:
- { "version": "xxx" }
- "@zipkin.span_namer.route"
tags:
- { name: kernel.event_listener, event: kernel.request, priority: 256 }
- { name: kernel.event_listener, event: kernel.terminate }
- { name: kernel.event_listener, event: kernel.request, priority: 2560 }
- { name: kernel.event_listener, event: kernel.response, priority: -2560 }
- { name: kernel.event_listener, event: kernel.exception }
- { name: kernel.event_listener, event: kernel.terminate }
7 changes: 4 additions & 3 deletions tests/Integration/tracing.percentage.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ zipkin:
services:
zipkin.span_namer.route:
class: ZipkinBundle\SpanCustomizers\ByPathNamer\SpanCustomizer
factory: [ZipkinBundle\SpanCustomizers\ByPathNamer\SpanCustomizer, 'create']
factory: [ZipkinBundle\SpanCustomizers\ByPathNamer\SpanCustomizer, "create"]
arguments:
- "%kernel.cache_dir%"

Expand All @@ -31,6 +31,7 @@ services:
- { "version": "xxx" }
- "@zipkin.span_namer.route"
tags:
- { name: kernel.event_listener, event: kernel.request, priority: 256 }
- { name: kernel.event_listener, event: kernel.terminate }
- { name: kernel.event_listener, event: kernel.request, priority: 2560 }
- { name: kernel.event_listener, event: kernel.response, priority: -2560 }
- { name: kernel.event_listener, event: kernel.exception }
- { name: kernel.event_listener, event: kernel.terminate }
Loading

0 comments on commit 68004ba

Please sign in to comment.