Skip to content

Commit

Permalink
Merge pull request #4879 from coopcycle/logging-routes
Browse files Browse the repository at this point in the history
Log routes in messenger logs
  • Loading branch information
vladimir-8 authored Feb 7, 2025
2 parents 1288b04 + f900248 commit 0b13a23
Show file tree
Hide file tree
Showing 10 changed files with 197 additions and 41 deletions.
1 change: 1 addition & 0 deletions app/config/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ framework:
middleware:
# service ids that implement Symfony\Component\Messenger\Middleware\MiddlewareInterface
- 'AppBundle\Messenger\RequestIdMiddleware'
- 'AppBundle\Messenger\RouteMiddleware'
# each time a message is handled, the Doctrine connection
# is "pinged" and reconnected if it's closed. Useful
# if your workers run for a long time and the database
Expand Down
9 changes: 9 additions & 0 deletions src/Log/ApiRequestResponseProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,17 @@ public function __invoke(array $record)
$record['extra']['method'] = $request->getMethod();
$record['extra']['request_uri'] = $request->getRequestUri();
$record['extra']['status_code'] = $response->getStatusCode();

$record['extra']['request_headers'] = (string) $requestHeaders;
$record['extra']['request_body'] = $requestBody;

$record['extra']['requests'] = [
[
'controller' => $request->attributes->get('_controller'),
'route' => $request->attributes->get('_route'),
]
];

$record['extra']['response_headers'] = (string) $response->headers;
$record['extra']['response_body'] = $responseBody;

Expand Down
15 changes: 5 additions & 10 deletions src/Log/MessengerRequestIdProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,14 @@
use Monolog\Attribute\AsMonologProcessor;

#[AsMonologProcessor]
class MessengerRequestIdProcessor
class MessengerRequestIdProcessor extends MessengerStampProcessor
{
private ?string $requestId = null;

public function setStamp(?RequestIdStamp $stamp): void
{
$this->requestId = $stamp?->getRequestId();
}

public function __invoke(array $record): array
{
if ($this->requestId !== null) {
$record['extra']['request_id'] = $this->requestId;
$stamp = $this->getStamp();

if ($stamp instanceof RequestIdStamp) {
$record['extra']['request_id'] = $stamp->getValue();
}

return $record;
Expand Down
26 changes: 26 additions & 0 deletions src/Log/MessengerRouteProcessor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

namespace AppBundle\Log;

use AppBundle\Messenger\Stamp\RouteStamp;
use Monolog\Attribute\AsMonologProcessor;

#[AsMonologProcessor]
class MessengerRouteProcessor extends MessengerStampProcessor
{
public function __invoke(array $record): array
{
$stamp = $this->getStamp();

if ($stamp instanceof RouteStamp) {
$record['extra']['requests'] = [
[
'controller' => $stamp->getController(),
'route' => $stamp->getRoute()
]
];
}

return $record;
}
}
20 changes: 20 additions & 0 deletions src/Log/MessengerStampProcessor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace AppBundle\Log;

use Symfony\Component\Messenger\Stamp\StampInterface;

abstract class MessengerStampProcessor
{
private ?StampInterface $stamp = null;

public function getStamp(): ?StampInterface
{
return $this->stamp;
}

public function setStamp(?StampInterface $stamp): void
{
$this->stamp = $stamp;
}
}
43 changes: 16 additions & 27 deletions src/Messenger/RequestIdMiddleware.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,42 +5,31 @@
use AppBundle\Log\MessengerRequestIdProcessor;
use AppBundle\Messenger\Stamp\RequestIdStamp;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
use Symfony\Component\Messenger\Middleware\StackInterface;
use Symfony\Component\Messenger\Stamp\ConsumedByWorkerStamp;
use Symfony\Component\Messenger\Stamp\StampInterface;

class RequestIdMiddleware implements MiddlewareInterface
class RequestIdMiddleware extends StampMiddleware
{
private ?RequestIdStamp $currentRequestIdStamp = null;

public function __construct(
private readonly RequestStack $requestStack,
private readonly MessengerRequestIdProcessor $messengerRequestIdProcessor
) {
MessengerRequestIdProcessor $stampProcessor,
)
{
parent::__construct($stampProcessor);
}

public function handle(Envelope $envelope, StackInterface $stack): Envelope
protected function getStampFqcn(): string
{
if ($stamp = $envelope->last(RequestIdStamp::class)) {
$this->messengerRequestIdProcessor->setStamp($stamp);
$this->currentRequestIdStamp = $stamp;

try {
return $stack->next()->handle($envelope, $stack);
} finally {
$this->messengerRequestIdProcessor->setStamp(null);
$this->currentRequestIdStamp = null;
}
}
return RequestIdStamp::class;
}

protected function createStamp(): ?StampInterface
{
$request = $this->requestStack->getCurrentRequest();
if (! $envelope->last(ConsumedByWorkerStamp::class) && $request && $request->headers->has('X-Request-ID')) {
$envelope = $envelope->with(new RequestIdStamp($request->headers->get('X-Request-ID')));
} elseif (! $envelope->last(ConsumedByWorkerStamp::class) && $this->currentRequestIdStamp !== null) {
$envelope = $envelope->with($this->currentRequestIdStamp);
}

return $stack->next()->handle($envelope, $stack);
if ($request && $request->headers->has('X-Request-ID')) {
return new RequestIdStamp($request->headers->get('X-Request-ID'));
} else {
return null;
}
}
}
43 changes: 43 additions & 0 deletions src/Messenger/RouteMiddleware.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

namespace AppBundle\Messenger;

use AppBundle\Log\MessengerRouteProcessor;
use AppBundle\Messenger\Stamp\RouteStamp;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Messenger\Stamp\StampInterface;

class RouteMiddleware extends StampMiddleware
{
public function __construct(
private readonly RequestStack $requestStack,
MessengerRouteProcessor $stampProcessor,
)
{
parent::__construct($stampProcessor);
}

protected function getStampFqcn(): string
{
return RouteStamp::class;
}

protected function createStamp(): ?StampInterface
{
$request = $this->requestStack->getCurrentRequest();

if ($request) {
$route = $request->attributes->get('_route');
$controller = $request->attributes->get('_controller');

if (null !== $route && null !== $controller) {
return new RouteStamp($route, $controller);
} else {
return null;
}

} else {
return null;
}
}
}
9 changes: 5 additions & 4 deletions src/Messenger/Stamp/RequestIdStamp.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@
class RequestIdStamp implements StampInterface
{
public function __construct(
private string $requestId
) {
private readonly string $value
)
{
}

public function getRequestId(): string
public function getValue(): string
{
return $this->requestId;
return $this->value;
}
}
24 changes: 24 additions & 0 deletions src/Messenger/Stamp/RouteStamp.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

namespace AppBundle\Messenger\Stamp;

use Symfony\Component\Messenger\Stamp\StampInterface;

class RouteStamp implements StampInterface
{
public function __construct(
private readonly string $route,
private readonly string $controller,
) {
}

public function getRoute(): string
{
return $this->route;
}

public function getController(): string
{
return $this->controller;
}
}
48 changes: 48 additions & 0 deletions src/Messenger/StampMiddleware.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

namespace AppBundle\Messenger;

use AppBundle\Log\MessengerStampProcessor;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
use Symfony\Component\Messenger\Middleware\StackInterface;
use Symfony\Component\Messenger\Stamp\ConsumedByWorkerStamp;
use Symfony\Component\Messenger\Stamp\StampInterface;

abstract class StampMiddleware implements MiddlewareInterface
{
private ?StampInterface $currentStamp = null;

public function __construct(
private readonly MessengerStampProcessor $messengerStampProcessor
)
{
}

public function handle(Envelope $envelope, StackInterface $stack): Envelope
{
if ($stamp = $envelope->last($this->getStampFqcn())) {
$this->messengerStampProcessor->setStamp($stamp);
$this->currentStamp = $stamp;

try {
return $stack->next()->handle($envelope, $stack);
} finally {
$this->messengerStampProcessor->setStamp(null);
$this->currentStamp = null;
}
}

if (!$envelope->last(ConsumedByWorkerStamp::class) && $stamp = $this->createStamp()) {
$envelope = $envelope->with($stamp);
} elseif (!$envelope->last(ConsumedByWorkerStamp::class) && $this->currentStamp !== null) {
$envelope = $envelope->with($this->currentStamp);
}

return $stack->next()->handle($envelope, $stack);
}

abstract protected function getStampFqcn(): string;

abstract protected function createStamp(): ?StampInterface;
}

0 comments on commit 0b13a23

Please sign in to comment.