Index: pkg/analysis_server/lib/src/status/get_handler.dart |
diff --git a/pkg/analysis_server/lib/src/status/get_handler.dart b/pkg/analysis_server/lib/src/status/get_handler.dart |
index 6ea69d3bec33d573b132a8142b4b436cd2c19877..c51e4826e392e840de7bd0a59839958379ab2fbb 100644 |
--- a/pkg/analysis_server/lib/src/status/get_handler.dart |
+++ b/pkg/analysis_server/lib/src/status/get_handler.dart |
@@ -13,6 +13,7 @@ import 'dart:math'; |
import 'package:analysis_server/plugin/protocol/protocol.dart' hide Element; |
import 'package:analysis_server/src/analysis_server.dart'; |
import 'package:analysis_server/src/domain_completion.dart'; |
+import 'package:analysis_server/src/domain_diagnostic.dart'; |
import 'package:analysis_server/src/domain_execution.dart'; |
import 'package:analysis_server/src/operation/operation.dart'; |
import 'package:analysis_server/src/operation/operation_analysis.dart'; |
@@ -23,6 +24,7 @@ import 'package:analysis_server/src/services/index/store/split_store.dart'; |
import 'package:analysis_server/src/socket_server.dart'; |
import 'package:analysis_server/src/status/ast_writer.dart'; |
import 'package:analysis_server/src/status/element_writer.dart'; |
+import 'package:analysis_server/src/utilities/average.dart'; |
import 'package:analyzer/file_system/file_system.dart'; |
import 'package:analyzer/src/context/cache.dart'; |
import 'package:analyzer/src/context/context.dart' show AnalysisContextImpl; |
@@ -94,6 +96,11 @@ class GetHandler { |
static const String CONTEXT_PATH = '/context'; |
/** |
+ * The path used to request diagnostic information. |
+ */ |
+ static const String DIAGNOSTIC_PATH = '/diagnostic'; |
+ |
+ /** |
* The path used to request information about a element model. |
*/ |
static const String ELEMENT_PATH = '/element'; |
@@ -157,6 +164,11 @@ class GetHandler { |
new ContentType("text", "html", charset: "utf-8"); |
/** |
+ * Rolling average of calls to get diagnostics. |
+ */ |
+ Average _diagnosticCallAverage = new Average(); |
+ |
+ /** |
* The socket server whose status is to be reported on. |
*/ |
SocketServer _server; |
@@ -211,6 +223,8 @@ class GetHandler { |
_returnCommunicationPerformance(request); |
} else if (path == CONTEXT_PATH) { |
_returnContextInfo(request); |
+ } else if (path == DIAGNOSTIC_PATH) { |
+ _returnDiagnosticInfo(request); |
} else if (path == ELEMENT_PATH) { |
_returnElement(request); |
} else if (path == INDEX_ELEMENT_BY_NAME) { |
@@ -1061,6 +1075,20 @@ class GetHandler { |
} |
/** |
+ * Return a response displaying diagnostic information. |
+ */ |
+ void _returnDiagnosticInfo(HttpRequest request) { |
+ String value = request.requestedUri.queryParameters['index']; |
+ int index = value != null ? int.parse(value, onError: (_) => 0) : 0; |
+ _writeResponse(request, (StringBuffer buffer) { |
+ _writePage(buffer, 'Analysis Server - Diagnostic info', [], |
+ (StringBuffer buffer) { |
+ _writeDiagnosticStatus(buffer); |
+ }); |
+ }); |
+ } |
+ |
+ /** |
* Return a response containing information about an element structure. |
*/ |
void _returnElement(HttpRequest request) { |
@@ -1217,6 +1245,7 @@ class GetHandler { |
_writePage(buffer, 'Analysis Server - Status', [], (StringBuffer buffer) { |
if (_writeServerStatus(buffer)) { |
_writeAnalysisStatus(buffer); |
+ _writeDiagnosticStatus(buffer); |
_writeEditStatus(buffer); |
_writeExecutionStatus(buffer); |
_writePluginStatus(buffer); |
@@ -1247,6 +1276,9 @@ class GetHandler { |
buffer.write('<p>'); |
buffer.write(makeLink(OVERLAYS_PATH, {}, 'File overlays')); |
buffer.write('</p>'); |
+ buffer.write('<p>'); |
+ buffer.write(makeLink(DIAGNOSTIC_PATH, {}, 'Diagnostic info')); |
+ buffer.write('</p>'); |
}); |
}); |
} |
@@ -1449,6 +1481,50 @@ class GetHandler { |
} |
/** |
+ * Write the status of the diagnostic domain to the given [buffer]. |
+ */ |
+ void _writeDiagnosticStatus(StringBuffer buffer) { |
+ DiagnosticDomainHandler handler = |
+ new DiagnosticDomainHandler(_server.analysisServer); |
+ |
+ var request = new DiagnosticGetDiagnosticsParams().toRequest('0'); |
+ |
+ var stopwatch = new Stopwatch(); |
+ stopwatch.start(); |
+ var response = handler.handleRequest(request); |
+ stopwatch.stop(); |
+ |
+ int elapsedMs = stopwatch.elapsedMilliseconds; |
+ _diagnosticCallAverage.addSample(elapsedMs); |
+ |
+ buffer.write('<h3>Timing</h3>'); |
+ |
+ buffer.write('<p>'); |
+ buffer.write('getDiagnostic (last call): $elapsedMs (ms)'); |
+ buffer.write('<p>'); |
+ buffer.write('getDiagnostic (rolling average): ' |
+ '${_diagnosticCallAverage.value} (ms)'); |
+ buffer.write('<p> '); |
+ |
+ var json = response.toJson()[Response.RESULT]; |
+ List contexts = json['contexts']; |
+ for (var context in contexts) { |
+ buffer.write('<p>'); |
+ buffer.write('<h3>${context["name"]}</h3>'); |
+ buffer.write('<p>'); |
+ buffer.write('explicitFileCount: ${context["explicitFileCount"]}'); |
+ buffer.write('<p>'); |
+ buffer.write('implicitFileCount: ${context["implicitFileCount"]}'); |
+ buffer.write('<p>'); |
+ buffer.write('workItemQueueLength: ${context["workItemQueueLength"]}'); |
+ buffer.write('<p>'); |
+ buffer.write('workItemQueueLengthAverage: ' |
+ '${context["workItemQueueLengthAverage"]}'); |
+ buffer.write('<p> '); |
+ } |
+ } |
+ |
+ /** |
* Write the status of the edit domain (on the main status page) to the given |
* [buffer]. |
*/ |