<?php
namespace App\EventListener;
use App\Service\LoggerConfigurationService;
use App\WsProxy\Subscriber\SoapCallCollectorSubscriber;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\TerminateEvent;
class KernelOnTerminateListener
{
private LoggerConfigurationService $loggerConfigurationService;
private LoggerInterface $logger;
private LoggerInterface $metricsLogger;
private SoapCallCollectorSubscriber $soapCollector;
public function __construct(
LoggerConfigurationService $loggerConfigurationService,
LoggerInterface $lsiGlobalLogger,
LoggerInterface $metricsLogger,
SoapCallCollectorSubscriber $soapCollector
)
{
$this->loggerConfigurationService = $loggerConfigurationService;
$this->logger = $lsiGlobalLogger;
$this->metricsLogger = $metricsLogger;
$this->soapCollector = $soapCollector;
}
private function getRequestArray(Request $request): array
{
return [
'attributes' => $request->attributes->all(),
'request' => $request->request->all(),
'query' => $request->query->all(),
'server' => $request->server->all(),
'cookies' => $request->cookies->all(),
'headers' => $request->headers->all(),
'content' => $request->getContent(),
'pathInfo' => $request->getPathInfo(),
'getRequestUri' => $request->getRequestUri(),
'method' => $request->getMethod()
];
}
private function getResponseArray(Response $response): array
{
return [
'headers' => $response->headers->all(),
'content' => $response->getContent(),
'statusCode' => $response->getStatusCode()
];
}
public function onTerminateEvent(TerminateEvent $event): void
{
$this->logMetrics($event);
$this->logRequests($event);
}
private function logRequests(TerminateEvent $event): void
{
if (!$this->loggerConfigurationService->isEnabled('request_logger')) {
return;
}
$request = $event->getRequest();
$routePath = $request->getPathInfo();
$routeName = $request->get('_route');
if ($this->loggerConfigurationService->isRoutePathEnabled($routePath, 'request_logger')
|| $this->loggerConfigurationService->isRouteNameEnabled($routeName, 'request_logger')) {
$requestArray = $this->getRequestArray($event->getRequest());
$responseArray = $this->getResponseArray($event->getResponse());
$this->logger->debug('Request', $requestArray);
$this->logger->debug('Response', $responseArray);
}
}
private function logMetrics(TerminateEvent $event): void
{
if (!$this->loggerConfigurationService->isEnabled('metrics_logger')) {
return;
}
$request = $event->getRequest();
$routePath = $request->getPathInfo();
if ($this->loggerConfigurationService->isRoutePathEnabled($routePath, 'metrics_logger')) {
$reqMicroSecond = (int)($request->server->get('REQUEST_TIME_FLOAT')*1000);
$resMicroSecond = (int)(microtime(true)*1000);
$arMetrics = [
'uri' => $request->getPathInfo(),
'method' => $request->getMethod(),
'controller' => $request->get('_route'),
'req' => $reqMicroSecond,
'res' => $resMicroSecond,
'dur' => $resMicroSecond - $reqMicroSecond,
'soap' => [
'calls' => [],
'total_req' => 0,
'total_time' => 0
]
];
if($this->soapCollector->getCalls() !== []) {
$arMetrics['soap']['total_req'] = count($this->soapCollector->getCalls());
$arMetrics['soap']['total_time'] = (int)$this->soapCollector->getTotalTiming();
foreach ($this->soapCollector->getCalls() as $call) {
$arMetrics['soap']['calls'][] = [
'method' => $call->getMethod(),
'dur' => (int)$call->getTiming()
];
}
}
$this->metricsLogger->debug('', $arMetrics);
}
}
}