From cff36b5c909f94d3ec89f14f43e42576c32ac2d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20H=C3=A9lias?= Date: Fri, 20 Jan 2023 12:16:58 +0100 Subject: [PATCH] Compatibility with the new logging middleware --- composer.json | 1 + config/services.php | 3 ++ .../Compiler/AddDoctrineLoggerPass.php | 5 ++++ .../Compiler/MetricRegistryPass.php | 2 +- .../MonitoringMetricsExtension.php | 2 +- src/EventListener/MonitoringListener.php | 2 +- src/Metric/DoctrineMetric.php | 29 +++++++++++++++++++ tests/Fixtures/config.yaml | 1 + 8 files changed, 42 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 807cb14..7f3bdfd 100644 --- a/composer.json +++ b/composer.json @@ -30,6 +30,7 @@ "phpunit/phpunit": "<8.0" }, "require-dev": { + "doctrine/annotations": "^2.0", "doctrine/doctrine-bundle": "^2.0", "doctrine/orm": "^2.9", "phpunit/phpunit": "^9.3", diff --git a/config/services.php b/config/services.php index 6f7d354..111e095 100644 --- a/config/services.php +++ b/config/services.php @@ -17,6 +17,9 @@ ->set('monitoring.metrics', MetricRegistry::class) ->set('monitoring.metric.doctrine', DoctrineMetric::class) + ->args([ + service('doctrine.debug_data_holder')->nullOnInvalid() + ]) ->tag('monitoring.metric') ->set('monitoring.metric.memory', MemoryMetric::class) ->tag('monitoring.metric') diff --git a/src/DependencyInjection/Compiler/AddDoctrineLoggerPass.php b/src/DependencyInjection/Compiler/AddDoctrineLoggerPass.php index 0fa931b..448e7a0 100644 --- a/src/DependencyInjection/Compiler/AddDoctrineLoggerPass.php +++ b/src/DependencyInjection/Compiler/AddDoctrineLoggerPass.php @@ -16,6 +16,11 @@ public function process(ContainerBuilder $container): void return; } + // With DebugDataHolder, no need to use logger + if ($container->has('doctrine.debug_data_holder')) { + return; + } + $definition = $container->getDefinition('monitoring.metric.doctrine'); $connections = $container->getParameter('doctrine.connections'); diff --git a/src/DependencyInjection/Compiler/MetricRegistryPass.php b/src/DependencyInjection/Compiler/MetricRegistryPass.php index feaef8d..fb6750f 100644 --- a/src/DependencyInjection/Compiler/MetricRegistryPass.php +++ b/src/DependencyInjection/Compiler/MetricRegistryPass.php @@ -9,7 +9,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; -class MetricRegistryPass implements CompilerPassInterface +final class MetricRegistryPass implements CompilerPassInterface { public function process(ContainerBuilder $container): void { diff --git a/src/DependencyInjection/MonitoringMetricsExtension.php b/src/DependencyInjection/MonitoringMetricsExtension.php index 63a7c52..d691c89 100644 --- a/src/DependencyInjection/MonitoringMetricsExtension.php +++ b/src/DependencyInjection/MonitoringMetricsExtension.php @@ -9,7 +9,7 @@ use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; -class MonitoringMetricsExtension extends Extension +final class MonitoringMetricsExtension extends Extension { public function load(array $configs, ContainerBuilder $container): void { diff --git a/src/EventListener/MonitoringListener.php b/src/EventListener/MonitoringListener.php index a7fc9e8..40fb51d 100644 --- a/src/EventListener/MonitoringListener.php +++ b/src/EventListener/MonitoringListener.php @@ -21,7 +21,7 @@ public function __construct(MetricRegistry $metricRegistry) public function onKernelResponse(ResponseEvent $event): void { $route = $event->getRequest()->attributes->get('_route'); - if (null === $route || strpos($route, '_') === 0) { + if (null === $route || str_starts_with($route, '_')) { return; } diff --git a/src/Metric/DoctrineMetric.php b/src/Metric/DoctrineMetric.php index 26f639c..70dfb9c 100644 --- a/src/Metric/DoctrineMetric.php +++ b/src/Metric/DoctrineMetric.php @@ -5,17 +5,25 @@ namespace Odandb\MonitoringMetricsBundle\Metric; use Doctrine\DBAL\Logging\DebugStack; +use Symfony\Bridge\Doctrine\Middleware\Debug\DebugDataHolder; use Symfony\Component\HttpFoundation\Response; class DoctrineMetric extends AbstractMetric { public const HEADER_NAME = 'X-Monitor-Doctrine-Queries'; + protected ?DebugDataHolder $debugDataHolder; + /** * @var DebugStack[] */ private array $loggers = []; + public function __construct(?DebugDataHolder $debugDataHolder = null) + { + $this->debugDataHolder = $debugDataHolder; + } + /** * Adds the stack logger for a connection. */ @@ -27,6 +35,21 @@ public function addLogger(string $name, DebugStack $logger): void public function metric(Response $response): void { $queries = []; + + if (null !== $this->debugDataHolder) { + foreach ($this->debugDataHolder->getData() as $name => $data) { + if (!isset($queries[$name])) { + $queries[$name] = 0; + } + + $queries[$name] += count($data); + } + + $response->headers->set(self::HEADER_NAME, (string) array_sum($queries)); + + return; + } + foreach ($this->loggers as $name => $logger) { if (!isset($queries[$name])) { $queries[$name] = 0; @@ -40,6 +63,12 @@ public function metric(Response $response): void public function reset(): void { + if (null !== $this->debugDataHolder) { + $this->debugDataHolder->reset(); + + return; + } + foreach ($this->loggers as $logger) { $logger->queries = []; $logger->currentQuery = 0; diff --git a/tests/Fixtures/config.yaml b/tests/Fixtures/config.yaml index 6e78729..d44af23 100644 --- a/tests/Fixtures/config.yaml +++ b/tests/Fixtures/config.yaml @@ -5,6 +5,7 @@ framework: annotations: enabled: true secret: '123456789' + http_method_override: false router: utf8: true resource: '%kernel.project_dir%/routing.yaml'