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..9b7c55cc2 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_collect_backtrace') + ->defaultValue(false) + ->info('Enables collecting backtraces when profiling is enabled') + ->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..8c7f730d8 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')); + $profilingAbstractId = $connection['profiling_collect_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_collect_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/config/schema/doctrine-1.0.xsd b/Resources/config/schema/doctrine-1.0.xsd index bb56bb608..b99af97ef 100644 --- a/Resources/config/schema/doctrine-1.0.xsd +++ b/Resources/config/schema/doctrine-1.0.xsd @@ -36,6 +36,7 @@ + diff --git a/Resources/doc/configuration.rst b/Resources/doc/configuration.rst index 0387aa0b8..fc5e86cd1 100644 --- a/Resources/doc/configuration.rst +++ b/Resources/doc/configuration.rst @@ -104,6 +104,9 @@ Configuration Reference logging: "%kernel.debug%" profiling: "%kernel.debug%" + # When true, profiling also collects a backtrace for each query + profiling_collect_backtrace: false + server_version: ~ driver_class: ~ # Allows to specify a custom wrapper implementation to use. @@ -493,6 +496,7 @@ Configuration Reference schema-filter="" logging="%kernel.debug%" profiling="%kernel.debug%" + profiling-collect-backtrace="false" server-version="" driver-class="" wrapper-class="" 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 %}