From efada49f1557d958c53f263d45be529ed2a6698f Mon Sep 17 00:00:00 2001 From: Gregor Harlan Date: Thu, 31 Aug 2017 12:26:12 +0200 Subject: [PATCH] profiler enhancements (#460) --- DataCollector/PropelDataCollector.php | 2 +- Logger/PropelLogger.php | 27 +-- Resources/views/Collector/propel.html.twig | 198 ++++++++++----------- Resources/views/Panel/explain.html.twig | 2 - Twig/Extension/SyntaxExtension.php | 2 +- 5 files changed, 100 insertions(+), 131 deletions(-) diff --git a/DataCollector/PropelDataCollector.php b/DataCollector/PropelDataCollector.php index 524a7fd..9e7d71e 100644 --- a/DataCollector/PropelDataCollector.php +++ b/DataCollector/PropelDataCollector.php @@ -36,7 +36,7 @@ class PropelDataCollector extends DataCollector public function collect(Request $request, Response $response, \Exception $exception = null) { $this->data = array( - 'queries' => $this->buildQueries(), + 'queries' => $this->cloneVar($this->buildQueries()), 'querycount' => $this->countQueries(), ); } diff --git a/Logger/PropelLogger.php b/Logger/PropelLogger.php index ca6bd29..247e0cb 100644 --- a/Logger/PropelLogger.php +++ b/Logger/PropelLogger.php @@ -13,6 +13,7 @@ namespace Propel\Bundle\PropelBundle\Logger; use Psr\Log\LoggerInterface; use Psr\Log\LoggerTrait; use Symfony\Component\Stopwatch\Stopwatch; +use Symfony\Component\VarDumper\Caster\TraceStub; /** * @author Kévin Gomez @@ -64,10 +65,9 @@ class PropelLogger implements LoggerInterface } $add = true; - $stackTrace = $this->getStackTrace(); + $trace = debug_backtrace(); if (null !== $this->stopwatch) { - $trace = debug_backtrace(); $method = $trace[3]['function']; $watch = 'Propel Query '.(count($this->queries)+1); @@ -91,7 +91,7 @@ class PropelLogger implements LoggerInterface 'connection' => $connection->getName(), 'time' => $event->getDuration() / 1000, 'memory' => $event->getMemory(), - 'stackTrace' => $stackTrace, + 'trace' => new TraceStub($trace), ); } @@ -102,25 +102,4 @@ class PropelLogger implements LoggerInterface { return $this->queries; } - - /** - * Returns the current stack trace. - * - * @return array - */ - private function getStackTrace() - { - $e = new \Exception(); - $trace = explode("\n", $e->getTraceAsString()); - $trace = array_reverse($trace); - array_shift($trace); // remove {main} - array_pop($trace); // remove call to this method - - foreach ($trace as $i => &$value) { - $value = $i + 1 . ')' . substr($value, strpos($value, ' ')); - $value = preg_replace('/\((\d+)\)/', ':$1', $value, 1); - } - - return $trace; - } } diff --git a/Resources/views/Collector/propel.html.twig b/Resources/views/Collector/propel.html.twig index d824f42..c94915b 100644 --- a/Resources/views/Collector/propel.html.twig +++ b/Resources/views/Collector/propel.html.twig @@ -2,32 +2,38 @@ {% block toolbar %} {# the web debug toolbar content #} - {% set icon %} - Propel - {{ collector.querycount }} - {% endset %} - {% set text %} -
- DB Queries - {{ collector.querycount }} -
-
- Query time - {{ '%0.2f'|format(collector.time * 1000) }} ms -
-{% endset %} - {% include 'WebProfilerBundle:Profiler:toolbar_item.html.twig' with { 'link': profiler_url } %} + {% if collector.querycount %} + {% set icon %} + Propel + {{ collector.querycount }} + + in + {{ '%0.2f'|format(collector.time * 1000) }} + ms + + {% endset %} + {% set text %} +
+ DB Queries + {{ collector.querycount }} +
+
+ Query time + {{ '%0.2f'|format(collector.time * 1000) }} ms +
+ {% endset %} + + {% set status = collector.querycount > 50 ? 'yellow' : '' %} + + {% include '@WebProfiler/Profiler/toolbar_item.html.twig' with { 'link': profiler_url, status: status } %} + {% endif %} {% endblock %} {% block menu %} {# the menu content #} - + Propel - - {{ collector.querycount }} - {{ '%0.0f'|format(collector.time * 1000) }} ms - {% endblock %} @@ -42,7 +48,7 @@ color: #464646; white-space: nowrap; } - .SQLInfo, .SQLComment { + .SQLComment { color: gray; display: block; font-size: 0.9em; @@ -60,94 +66,80 @@ padding: 8px 35px 8px 14px; font-weight: bold; } - - #content .SQLExplain h2 { - font-size: 17px; - margin-bottom: 0; - } - - .query-trace { - display: none; - overflow: auto; - padding: 5px; - border: 1px solid silver; - margin: 5px; - border-radius: 5px; - font-family: monospace; - white-space: nowrap; - color: #333; - } - - .query-trace .gray { - color: silver; - } - - .query-trace .gray + .regular { - margin-top: 3px; - } - .query-trace .regular + .gray { - margin-top: 3px; - } - +

Query Metrics

-

Queries

- - - - - - - - {% if not collector.querycount %} - - {% else %} - {% for i, query in collector.queries %} - - + + {% endfor %} + +
SQL queries
No queries.
- - {{ query.sql|format_sql|raw }} - {% if app.request.query.has('query') and app.request.query.get('query') == i %} -
- {{ render(controller('PropelBundle:Panel:explain', { - 'token': token, - 'panel': 'propel', - 'query': app.request.query.get('query'), - 'connection': app.request.query.get('connection') - })) }} + {% if not collector.querycount %} +
+

No database queries were performed.

+
+ {% else %} +
+
+ {{ collector.querycount }} + Database Queries +
+ +
+ {{ '%0.2f'|format(collector.time * 1000) }} ms + Query time +
+
+ +

Queries

+ + + + + + + + + + + {% for i, query in collector.queries %} + + + + + - - {% endfor %} - {% endif %} - -
#TimeMemoryQuery
{{ loop.index }}{{ '%0.2f'|format(query.time * 1000) }} ms{{ query.memory|format_memory }} + + {{ query.sql|format_sql|raw }} + - {% endif %} -
- Time: {{ query.time }} - Memory: {{ query.memory|format_memory }} - Connection: {{ query.connection }} - - Stacktrace - {% if app.request.query.get('query', -1) != i %} - - Explain the query + {% if app.request.query.has('query') and app.request.query.get('query') == i %} +
+ {{ render(controller('PropelBundle:Panel:explain', { + 'token': token, + 'panel': 'propel', + 'query': app.request.query.get('query'), + 'connection': app.request.query.get('connection') + })) }} +
{% endif %} -
-
- {% for trace in query.stackTrace %} -
{{ trace }}
- {% endfor %} -
-
+ +
+ {{ profiler_dump(query.trace, maxDepth=1) }} +
+
+ {% endif %} {{ render(controller('PropelBundle:Panel:configuration')) }} {% endblock %} diff --git a/Resources/views/Panel/explain.html.twig b/Resources/views/Panel/explain.html.twig index 709bf57..639d7dc 100644 --- a/Resources/views/Panel/explain.html.twig +++ b/Resources/views/Panel/explain.html.twig @@ -1,5 +1,3 @@ -

Explanation

- {% for label in data[0]|keys %} diff --git a/Twig/Extension/SyntaxExtension.php b/Twig/Extension/SyntaxExtension.php index 95c63fa..13dd518 100644 --- a/Twig/Extension/SyntaxExtension.php +++ b/Twig/Extension/SyntaxExtension.php @@ -51,7 +51,7 @@ class SyntaxExtension extends \Twig_Extension $absBytes /= 1024; } - return self::toPrecision($sign * $absBytes, $precision) . $suffix[$i]; + return self::toPrecision($sign * $absBytes, $precision).' '.$suffix[$i]; } public function formatSQL($sql)