Index: pkg/analysis_server/tool/instrumentation/page/stats_page.dart |
diff --git a/pkg/analysis_server/tool/instrumentation/page/stats_page.dart b/pkg/analysis_server/tool/instrumentation/page/stats_page.dart |
index 42cd70453005f69bb0d5c4dedb6a3c6f7892c242..9ed8b180ff0f99b1a4e41f9533f3004aad6936ea 100644 |
--- a/pkg/analysis_server/tool/instrumentation/page/stats_page.dart |
+++ b/pkg/analysis_server/tool/instrumentation/page/stats_page.dart |
@@ -2,8 +2,6 @@ |
// for details. All rights reserved. Use of this source code is governed by a |
// BSD-style license that can be found in the LICENSE file. |
-import 'dart:collection'; |
- |
import '../log/log.dart'; |
import 'page_writer.dart'; |
@@ -20,7 +18,7 @@ class StatsPage extends PageWriter { |
/** |
* A table mapping the kinds of entries in the log to the number of each kind. |
*/ |
- final Map<String, int> entryCounts = new HashMap<String, int>(); |
+ final Map<String, int> entryCounts = <String, int>{}; |
/** |
* The number of responses that returned an error. |
@@ -28,12 +26,25 @@ class StatsPage extends PageWriter { |
int errorCount = 0; |
/** |
+ * The number of responses from each plugin that returned an error. |
+ */ |
+ Map<String, int> pluginErrorCount = <String, int>{}; |
+ |
+ /** |
* A table mapping request method names to a list of the latencies associated |
* with those requests, where the latency is defined to be the time between |
* when the request was sent by the client and when the server started |
* processing the request. |
*/ |
- final Map<String, List<int>> latencyData = new HashMap<String, List<int>>(); |
+ final Map<String, List<int>> latencyData = <String, List<int>>{}; |
+ |
+ /** |
+ * A table mapping request method names to a list of the latencies associated |
+ * with those requests, where the latency is defined to be the time between |
+ * when the request was sent by the server and when the plugin sent a response. |
+ */ |
+ final Map<String, Map<String, List<int>>> pluginResponseData = |
+ <String, Map<String, List<int>>>{}; |
/** |
* A list of the number of milliseconds between a completion request and the |
@@ -89,9 +100,7 @@ class StatsPage extends PageWriter { |
if (entry.result('error') != null) { |
errorCount++; |
} |
- } |
- |
- if (entry is RequestEntry) { |
+ } else if (entry is RequestEntry) { |
String method = entry.method; |
int latency = entry.timeStamp - entry.clientRequestTime; |
latencyData.putIfAbsent(method, () => new List<int>()).add(latency); |
@@ -108,6 +117,19 @@ class StatsPage extends PageWriter { |
} |
} |
} |
+ } else if (entry is PluginResponseEntry) { |
+ if (entry.result('error') != null) { |
+ int count = pluginErrorCount[entry.pluginId] ?? 0; |
+ pluginErrorCount[entry.pluginId] = count + 1; |
+ } |
+ } else if (entry is PluginRequestEntry) { |
+ PluginResponseEntry response = log.pluginResponseFor(entry); |
+ int responseTime = response.timeStamp - entry.timeStamp; |
+ var pluginData = pluginResponseData.putIfAbsent( |
+ entry.pluginId, () => <String, List<int>>{}); |
+ pluginData |
+ .putIfAbsent(entry.method, () => new List<int>()) |
+ .add(responseTime); |
} |
} |
} |
@@ -153,6 +175,16 @@ class StatsPage extends PageWriter { |
sink.write('<span class="label">Number of entries:</span> '); |
sink.write(entries.length); |
sink.writeln('</p>'); |
+ sink.write('<p>'); |
+ sink.write('<span class="label">Error count:</span> '); |
+ sink.write(errorCount); |
+ sink.writeln('</p>'); |
+ pluginErrorCount.forEach((String pluginId, int count) { |
+ sink.write('<p>'); |
+ sink.write('<span class="label">Errors from $pluginId:</span> '); |
+ sink.write(count); |
+ sink.writeln('</p>'); |
+ }); |
sink.writeln('<table>'); |
sink.writeln('<tr><th>count</th><th>kind</th></tr>'); |
for (String kind in entryKinds) { |
@@ -169,7 +201,6 @@ class StatsPage extends PageWriter { |
} |
void _writeRightColumn(StringSink sink) { |
- List<String> methodNames = latencyData.keys.toList()..sort(); |
completionResponseTimes.sort(); |
sink.writeln('<h3>Latency</h3>'); |
@@ -179,6 +210,7 @@ class StatsPage extends PageWriter { |
sink.writeln('<table>'); |
sink.writeln( |
'<tr><th>min</th><th>mean</th><th>max</th><th>method</th></tr>'); |
+ List<String> methodNames = latencyData.keys.toList()..sort(); |
for (String method in methodNames) { |
List<int> latencies = latencyData[method]..sort(); |
// TODO(brianwilkerson) Add a spark-line distribution graph. |
@@ -203,5 +235,32 @@ class StatsPage extends PageWriter { |
sink.write(', '); |
sink.write(completionResponseTimes[completionResponseTimes.length - 1]); |
sink.writeln('</p>'); |
+ |
+ if (pluginResponseData.isNotEmpty) { |
+ sink.writeln('<h3>Plugin response times</h3>'); |
+ pluginResponseData |
+ .forEach((String pluginId, Map<String, List<int>> responseData) { |
+ sink.write('<p>'); |
+ sink.write(pluginId); |
+ sink.writeln('</p>'); |
+ sink.writeln('<table>'); |
+ List<String> methodNames = responseData.keys.toList()..sort(); |
+ for (String method in methodNames) { |
+ List<int> responseTimes = responseData[method]..sort(); |
+ // TODO(brianwilkerson) Add a spark-line distribution graph. |
+ sink.write('<tr><td class="int">'); |
+ sink.write(responseTimes[0]); |
+ sink.write('</td><td class="int">'); |
+ sink.write(_mean(responseTimes)); |
+ sink.write('</td><td class="int">'); |
+ sink.write(responseTimes[responseTimes.length - 1]); |
+ sink.write('</td><td>'); |
+ sink.write(method); |
+ sink.writeln('</td></tr>'); |
+ } |
+ ; |
+ sink.writeln('</table>'); |
+ }); |
+ } |
} |
} |