src/EventListener/ResponseTerminateListener.php line 52

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventListener;
  4. use App\Services\Metrics\MetricsAdapter;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpKernel\KernelEvents;
  7. use Symfony\Component\HttpKernel\Event\TerminateEvent;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Throwable;
  10. class ResponseTerminateListener implements EventSubscriberInterface
  11. {
  12.     private const ACTIONS_BLACK_LIST = [
  13.         'GET /metrics',
  14.         'GET /robots.txt',
  15.         'POST /testHtml',
  16.         'GET /openapi/{fileSource}',
  17.         'GET /docs/file/{fileName}',
  18.         'GET /docs/{fileName}',
  19.         'GET /docs/',
  20.         'GET /.git/HEAD',
  21.         'GET /.git/config',
  22.         'GET /_wdt/aff0a1',
  23.         'GET /_wdt/635e7d',
  24.         'GET /_wdt/572ae2',
  25.         'GET /_wdt/2888d3',
  26.         'GET /_wdt/1a67b1',
  27.         'GET /_wdt/08f54a',
  28.     ];
  29.     private const SUPPORTED_METHODS = [
  30.         Request::METHOD_GET,
  31.         Request::METHOD_POST,
  32.         Request::METHOD_PUT,
  33.         Request::METHOD_PATCH,
  34.         Request::METHOD_DELETE,
  35.     ];
  36.     /**
  37.      * @var MetricsAdapter
  38.      */
  39.     private $metricsAdapter;
  40.     public function __construct(MetricsAdapter $metricsAdapter)
  41.     {
  42.         $this->metricsAdapter $metricsAdapter;
  43.     }
  44.     public function onKernelTerminate(TerminateEvent $event): void
  45.     {
  46.         try {
  47.             $path rtrim($event->getRequest()->getPathInfo(), '/');
  48.             $method $event->getRequest()->getMethod();
  49.             $action $method ' ' $path;
  50.             $requestDuration round((microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']), 2); // in seconds
  51.             if (strlen($action) > && in_array($methodself::SUPPORTED_METHODS) && !in_array($actionself::ACTIONS_BLACK_LIST)) {
  52.                 $this->metricsAdapter->increaseRequestsMetric(['action' => $action'status' => $event->getResponse()->getStatusCode()]);
  53.                 $this->metricsAdapter->increaseRequestDurationMetric($requestDuration, ['action' => $action'status' => $event->getResponse()->getStatusCode()]);
  54.                 $this->metricsAdapter->setGaugeMetric('apcu_memory_usage'$this->getApcuMemUsage());
  55.             }
  56.         } catch (Throwable $e) {
  57.         }
  58.     }
  59.     public static function getSubscribedEvents(): array
  60.     {
  61.         return [
  62.             KernelEvents::TERMINATE => ['onKernelTerminate', -100],
  63.         ];
  64.     }
  65.     private function getApcuMemUsage(): float
  66.     {
  67.         $mem apcu_sma_info();
  68.         $memSize $mem['num_seg'] * $mem['seg_size'];
  69.         $memAvail $mem['avail_mem'];
  70.         $memUsed $memSize $memAvail;
  71.         // in Mb
  72.         for ($i 0$i 2$i++) {
  73.             $memUsed /= 1024;
  74.         }
  75.         return round($memUsed1);
  76.     }
  77. }