From 03cd9419e3bd90a9309fffe1d6394b9e9bba2128 Mon Sep 17 00:00:00 2001 From: Dimitri Gritsajuk Date: Wed, 1 May 2019 16:32:24 +0200 Subject: [PATCH 1/3] [Profiling] Add query backtrace data --- Dbal/Logging/BacktraceLogger.php | 23 +++++++++++ DependencyInjection/Configuration.php | 4 ++ DependencyInjection/DoctrineExtension.php | 13 ++++-- Resources/config/dbal.xml | 1 + Resources/views/Collector/db.html.twig | 47 ++++++++++++++++++++-- Tests/Dbal/Logging/BacktraceLoggerTest.php | 20 +++++++++ 6 files changed, 100 insertions(+), 8 deletions(-) create mode 100644 Dbal/Logging/BacktraceLogger.php create mode 100644 Tests/Dbal/Logging/BacktraceLoggerTest.php diff --git a/Dbal/Logging/BacktraceLogger.php b/Dbal/Logging/BacktraceLogger.php new file mode 100644 index 000000000..9cd29494a --- /dev/null +++ b/Dbal/Logging/BacktraceLogger.php @@ -0,0 +1,23 @@ +queries[$this->currentQuery]['backtrace'] = $backtrace; + } +} diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index b3e05944d..6f75d1b7d 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -143,6 +143,10 @@ private function getDbalConnectionsNode() ->scalarNode('schema_filter')->end() ->booleanNode('logging')->defaultValue($this->debug)->end() ->booleanNode('profiling')->defaultValue($this->debug)->end() + ->booleanNode('profiling_backtrace') + ->defaultValue(false) + ->info('To enable Query backtrace record') + ->end() ->scalarNode('server_version')->end() ->scalarNode('driver_class')->end() ->scalarNode('wrapper_class')->end() diff --git a/DependencyInjection/DoctrineExtension.php b/DependencyInjection/DoctrineExtension.php index 75fde439e..475aaf39d 100644 --- a/DependencyInjection/DoctrineExtension.php +++ b/DependencyInjection/DoctrineExtension.php @@ -132,9 +132,14 @@ protected function loadDbalConnection($name, array $connection, ContainerBuilder $logger = new Reference('doctrine.dbal.logger'); } unset($connection['logging']); - if ($connection['profiling']) { - $profilingLoggerId = 'doctrine.dbal.logger.profiling.' . $name; - $container->setDefinition($profilingLoggerId, new ChildDefinition('doctrine.dbal.logger.profiling')); + + if ($connection['profiling'] || $connection['profiling_backtrace']) { + $profilingAbstractId = $connection['profiling_backtrace'] ? + 'doctrine.dbal.logger.backtrace' : + 'doctrine.dbal.logger.profiling'; + + $profilingLoggerId = $profilingAbstractId . '.' . $name; + $container->setDefinition($profilingLoggerId, new ChildDefinition($profilingAbstractId)); $profilingLogger = new Reference($profilingLoggerId); $container->getDefinition('data_collector.doctrine')->addMethodCall('addLogger', [$name, $profilingLogger]); @@ -149,7 +154,7 @@ protected function loadDbalConnection($name, array $connection, ContainerBuilder $logger = $profilingLogger; } } - unset($connection['profiling']); + unset($connection['profiling'], $connection['profiling_backtrace']); if (isset($connection['auto_commit'])) { $configuration->addMethodCall('setAutoCommit', [$connection['auto_commit']]); diff --git a/Resources/config/dbal.xml b/Resources/config/dbal.xml index d0f2a868b..7cc724505 100644 --- a/Resources/config/dbal.xml +++ b/Resources/config/dbal.xml @@ -30,6 +30,7 @@ + diff --git a/Resources/views/Collector/db.html.twig b/Resources/views/Collector/db.html.twig index 4cfb9a012..560180701 100644 --- a/Resources/views/Collector/db.html.twig +++ b/Resources/views/Collector/db.html.twig @@ -148,7 +148,7 @@ {% if profiler_markup_version > 1 %}

Query Metrics

- +
{{ collector.querycount }} @@ -159,17 +159,17 @@ {{ collector.groupedQueryCount }} Different statements
- +
{{ '%0.2f'|format(collector.time * 1000) }} ms Query time
- +
{{ collector.invalidEntityCount }} Invalid entities
- + {% if collector.cacheEnabled %}
{{ collector.cacheHitsCount }} @@ -254,6 +254,11 @@    Explain query {% endif %} + + {% if query.backtrace is defined %} +    + View query backtrace + {% endif %}