From d4a6351e1287bac96e8bdfac8699ef7c960662e5 Mon Sep 17 00:00:00 2001 From: Kevin Pfeifer Date: Sun, 9 Aug 2026 11:42:42 +0200 Subject: [PATCH] Clean up performance listeners after requests --- src/EventListener.php | 11 +++- .../CakeSentryPerformanceMiddleware.php | 56 ++++++++++++------- 2 files changed, 45 insertions(+), 22 deletions(-) diff --git a/src/EventListener.php b/src/EventListener.php index 771649d..e6ac11e 100644 --- a/src/EventListener.php +++ b/src/EventListener.php @@ -11,6 +11,11 @@ class EventListener implements EventListenerInterface { use EventSpanTrait; + /** + * @var array|null + */ + private ?array $events = null; + /** * Return an array of events to listen to. * @@ -18,6 +23,10 @@ class EventListener implements EventListenerInterface */ public function implementedEvents(): array { + if ($this->events !== null) { + return $this->events; + } + $before = function (string $name): callable { return function () use ($name): void { DebugTimer::start($name); @@ -35,7 +44,7 @@ public function implementedEvents(): array ]; }; - return [ + return $this->events = [ 'Controller.initialize' => [ ['priority' => 0, 'callable' => $before('Event: Controller.initialize')], ['priority' => 999, 'callable' => $after('Event: Controller.initialize')], diff --git a/src/Middleware/CakeSentryPerformanceMiddleware.php b/src/Middleware/CakeSentryPerformanceMiddleware.php index cce0493..80f7757 100644 --- a/src/Middleware/CakeSentryPerformanceMiddleware.php +++ b/src/Middleware/CakeSentryPerformanceMiddleware.php @@ -19,6 +19,7 @@ use CakeSentry\Database\Log\CakeSentryLog; use CakeSentry\Event\CacheEventListener; use CakeSentry\Event\HttpEventListener; +use CakeSentry\DebugTimer; use CakeSentry\EventListener; use CakeSentry\QuerySpanTrait; use Psr\Http\Message\ResponseInterface; @@ -77,39 +78,52 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface SentrySdk::getCurrentHub()->setSpan($span); $this->addQueryData(); + $eventManager = EventManager::instance(); $listener = new EventListener(); - EventManager::instance()->on($listener); - EventManager::instance()->on(new HttpEventListener()); + $httpListener = new HttpEventListener(); + $eventManager->on($listener); + $eventManager->on($httpListener); + $cacheListener = null; if (class_exists('\Cake\Cache\Event\CacheAfterAddEvent')) { - EventManager::instance()->on(new CacheEventListener()); + $cacheListener = new CacheEventListener(); + $eventManager->on($cacheListener); } - $response = $handler->handle($request); + try { + $response = $handler->handle($request); - $listener->addSpans(); + $listener->addSpans(); - // We don't want to trace 404 responses as they are not relevant for performance monitoring. - if ($response->getStatusCode() === 404) { - $transaction->setSampled(false); - } + // We don't want to trace 404 responses as they are not relevant for performance monitoring. + if ($response->getStatusCode() === 404) { + $transaction->setSampled(false); + } - $span->setHttpStatus($response->getStatusCode()); - $span->finish(); + $span->setHttpStatus($response->getStatusCode()); + $span->finish(); - SentrySdk::getCurrentHub()->setSpan($transaction); + SentrySdk::getCurrentHub()->setSpan($transaction); - $transaction->setHttpStatus($response->getStatusCode()); + $transaction->setHttpStatus($response->getStatusCode()); - if (function_exists('fastcgi_finish_request')) { - // Send the transaction to sentry after the client has received the response - EventManager::instance()->on('Server.terminate', function () use ($transaction): void { + if (function_exists('fastcgi_finish_request')) { + // Send the transaction to sentry after the client has received the response + EventManager::instance()->on('Server.terminate', function () use ($transaction): void { + $transaction->finish(); + }); + } else { $transaction->finish(); - }); - } else { - $transaction->finish(); - } + } - return $response; + return $response; + } finally { + $eventManager->off($listener); + $eventManager->off($httpListener); + if ($cacheListener !== null) { + $eventManager->off($cacheListener); + } + DebugTimer::clear(); + } } /**