@sgidlev

Как использовать профайлер от Симфони для сбора метрики и отправки их в логгер?

Всем привет.

Хочу использовать встроенный в симфони профайлер для сбора метрик (время обработки, кол-во запросов к бд, и т.д.) во время выполнения тестов, консольных комманд, а также во время выполнения запросов к серверу. Если с тестами удалось более менее нормально получить данные от прфайлера, то во время выполнения запроса к серверу пока встретил трудности.

Я использую EventListener и событие onKernelResponse, где хочу, чтобы на каждый запрос к серверу я смог собрать данные по метрике и отправить их в логгер, например в Senty. В этом случае не удается собрать events в TimeDataCollector, т.к. их просто нет.

Ниже приведу код:
<?php

namespace App\EventListener;

use App\AppAdapter\AppRequest;
use App\AppAdapter\Response\AppJsonResponse;
use App\AppAdapter\Response\AppResponse;
use App\Utils\Response\PrepareJsonResponse;
use App\Utils\Response\PrepareResponse;
use Doctrine\Bundle\DoctrineBundle\DataCollector\DoctrineDataCollector;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\DataCollector\TimeDataCollector;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\Profiler\Profiler;
use Symfony\Component\Stopwatch\Stopwatch;

class KernelResponseListener
{
    protected ContainerInterface $containerBuilder;
    protected ?AppRequest $appRequest;
    private Profiler $profiler;
    private ContainerInterface $container;
    private Stopwatch $stopwatch;
    private RequestStack $requestStack;

    public function __construct(Stopwatch $stopwatch, RequestStack $requestStack, ContainerInterface $container, ContainerInterface $containerBuilder, Profiler $profiler)
    {
        $this->containerBuilder = $containerBuilder;
        $this->appRequest = $containerBuilder->get(AppRequest::class);
        $this->profiler = $profiler;
        $this->container = $container;
        $this->stopwatch = $stopwatch;
        $this->requestStack = $requestStack;
    }

    /**
     * @param ViewEvent $event
     *
     * @return void
     */
    public function onKernelResponse(ResponseEvent $event): void
    {

        $profile =  $this->profiler->collect($event->getRequest(), $event->getResponse());

        /** @var TimeDataCollector $time */
        $time = $profile->getCollector('time');

        dump($time);
        dd($this->profiler->get('time'));
        
    }
}


И результат:
6287734e4749a511936486.png

Кто-то может подсказать как использовать профайлер для метрики?
  • Вопрос задан
  • 78 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы