OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library analysis_server.src.status.get_handler; | 5 library analysis_server.src.status.get_handler; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:collection'; | 8 import 'dart:collection'; |
9 import 'dart:convert'; | 9 import 'dart:convert'; |
10 import 'dart:io'; | 10 import 'dart:io'; |
11 import 'dart:math'; | 11 import 'dart:math'; |
12 | 12 |
13 import 'package:analysis_server/plugin/protocol/protocol.dart' hide Element; | 13 import 'package:analysis_server/plugin/protocol/protocol.dart' hide Element; |
14 import 'package:analysis_server/src/analysis_server.dart'; | 14 import 'package:analysis_server/src/analysis_server.dart'; |
15 import 'package:analysis_server/src/domain_completion.dart'; | 15 import 'package:analysis_server/src/domain_completion.dart'; |
| 16 import 'package:analysis_server/src/domain_diagnostic.dart'; |
16 import 'package:analysis_server/src/domain_execution.dart'; | 17 import 'package:analysis_server/src/domain_execution.dart'; |
17 import 'package:analysis_server/src/operation/operation.dart'; | 18 import 'package:analysis_server/src/operation/operation.dart'; |
18 import 'package:analysis_server/src/operation/operation_analysis.dart'; | 19 import 'package:analysis_server/src/operation/operation_analysis.dart'; |
19 import 'package:analysis_server/src/operation/operation_queue.dart'; | 20 import 'package:analysis_server/src/operation/operation_queue.dart'; |
20 import 'package:analysis_server/src/services/index/index.dart'; | 21 import 'package:analysis_server/src/services/index/index.dart'; |
21 import 'package:analysis_server/src/services/index/local_index.dart'; | 22 import 'package:analysis_server/src/services/index/local_index.dart'; |
22 import 'package:analysis_server/src/services/index/store/split_store.dart'; | 23 import 'package:analysis_server/src/services/index/store/split_store.dart'; |
23 import 'package:analysis_server/src/socket_server.dart'; | 24 import 'package:analysis_server/src/socket_server.dart'; |
24 import 'package:analysis_server/src/status/ast_writer.dart'; | 25 import 'package:analysis_server/src/status/ast_writer.dart'; |
25 import 'package:analysis_server/src/status/element_writer.dart'; | 26 import 'package:analysis_server/src/status/element_writer.dart'; |
| 27 import 'package:analysis_server/src/utilities/average.dart'; |
26 import 'package:analyzer/file_system/file_system.dart'; | 28 import 'package:analyzer/file_system/file_system.dart'; |
27 import 'package:analyzer/src/context/cache.dart'; | 29 import 'package:analyzer/src/context/cache.dart'; |
28 import 'package:analyzer/src/context/context.dart' show AnalysisContextImpl; | 30 import 'package:analyzer/src/context/context.dart' show AnalysisContextImpl; |
29 import 'package:analyzer/src/generated/ast.dart'; | 31 import 'package:analyzer/src/generated/ast.dart'; |
30 import 'package:analyzer/src/generated/element.dart'; | 32 import 'package:analyzer/src/generated/element.dart'; |
31 import 'package:analyzer/src/generated/engine.dart' | 33 import 'package:analyzer/src/generated/engine.dart' |
32 hide AnalysisCache, AnalysisContextImpl, AnalysisTask; | 34 hide AnalysisCache, AnalysisContextImpl, AnalysisTask; |
33 import 'package:analyzer/src/generated/java_engine.dart'; | 35 import 'package:analyzer/src/generated/java_engine.dart'; |
34 import 'package:analyzer/src/generated/resolver.dart'; | 36 import 'package:analyzer/src/generated/resolver.dart'; |
35 import 'package:analyzer/src/generated/source.dart'; | 37 import 'package:analyzer/src/generated/source.dart'; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 * The path used to request communication performance information. | 89 * The path used to request communication performance information. |
88 */ | 90 */ |
89 static const String COMMUNICATION_PERFORMANCE_PATH = '/perf/communication'; | 91 static const String COMMUNICATION_PERFORMANCE_PATH = '/perf/communication'; |
90 | 92 |
91 /** | 93 /** |
92 * The path used to request information about a specific context. | 94 * The path used to request information about a specific context. |
93 */ | 95 */ |
94 static const String CONTEXT_PATH = '/context'; | 96 static const String CONTEXT_PATH = '/context'; |
95 | 97 |
96 /** | 98 /** |
| 99 * The path used to request diagnostic information. |
| 100 */ |
| 101 static const String DIAGNOSTIC_PATH = '/diagnostic'; |
| 102 |
| 103 /** |
97 * The path used to request information about a element model. | 104 * The path used to request information about a element model. |
98 */ | 105 */ |
99 static const String ELEMENT_PATH = '/element'; | 106 static const String ELEMENT_PATH = '/element'; |
100 | 107 |
101 /** | 108 /** |
102 * The path used to request information about elements with the given name. | 109 * The path used to request information about elements with the given name. |
103 */ | 110 */ |
104 static const String INDEX_ELEMENT_BY_NAME = '/index/element-by-name'; | 111 static const String INDEX_ELEMENT_BY_NAME = '/index/element-by-name'; |
105 | 112 |
106 /** | 113 /** |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 /** | 157 /** |
151 * Query parameter used to represent the cache state to search for, when | 158 * Query parameter used to represent the cache state to search for, when |
152 * accessing [CACHE_STATE_PATH]. | 159 * accessing [CACHE_STATE_PATH]. |
153 */ | 160 */ |
154 static const String STATE_QUERY_PARAM = 'state'; | 161 static const String STATE_QUERY_PARAM = 'state'; |
155 | 162 |
156 static final ContentType _htmlContent = | 163 static final ContentType _htmlContent = |
157 new ContentType("text", "html", charset: "utf-8"); | 164 new ContentType("text", "html", charset: "utf-8"); |
158 | 165 |
159 /** | 166 /** |
| 167 * Rolling average of calls to get diagnostics. |
| 168 */ |
| 169 Average _diagnosticCallAverage = new Average(); |
| 170 |
| 171 /** |
160 * The socket server whose status is to be reported on. | 172 * The socket server whose status is to be reported on. |
161 */ | 173 */ |
162 SocketServer _server; | 174 SocketServer _server; |
163 | 175 |
164 /** | 176 /** |
165 * Buffer containing strings printed by the analysis server. | 177 * Buffer containing strings printed by the analysis server. |
166 */ | 178 */ |
167 List<String> _printBuffer; | 179 List<String> _printBuffer; |
168 | 180 |
169 /** | 181 /** |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 } else if (path == CACHE_STATE_PATH) { | 216 } else if (path == CACHE_STATE_PATH) { |
205 _returnCacheState(request); | 217 _returnCacheState(request); |
206 } else if (path == CACHE_ENTRY_PATH) { | 218 } else if (path == CACHE_ENTRY_PATH) { |
207 _returnCacheEntry(request); | 219 _returnCacheEntry(request); |
208 } else if (path == COMPLETION_PATH) { | 220 } else if (path == COMPLETION_PATH) { |
209 _returnCompletionInfo(request); | 221 _returnCompletionInfo(request); |
210 } else if (path == COMMUNICATION_PERFORMANCE_PATH) { | 222 } else if (path == COMMUNICATION_PERFORMANCE_PATH) { |
211 _returnCommunicationPerformance(request); | 223 _returnCommunicationPerformance(request); |
212 } else if (path == CONTEXT_PATH) { | 224 } else if (path == CONTEXT_PATH) { |
213 _returnContextInfo(request); | 225 _returnContextInfo(request); |
| 226 } else if (path == DIAGNOSTIC_PATH) { |
| 227 _returnDiagnosticInfo(request); |
214 } else if (path == ELEMENT_PATH) { | 228 } else if (path == ELEMENT_PATH) { |
215 _returnElement(request); | 229 _returnElement(request); |
216 } else if (path == INDEX_ELEMENT_BY_NAME) { | 230 } else if (path == INDEX_ELEMENT_BY_NAME) { |
217 _returnIndexElementByName(request); | 231 _returnIndexElementByName(request); |
218 } else if (path == OVERLAY_PATH) { | 232 } else if (path == OVERLAY_PATH) { |
219 _returnOverlayContents(request); | 233 _returnOverlayContents(request); |
220 } else if (path == OVERLAYS_PATH) { | 234 } else if (path == OVERLAYS_PATH) { |
221 _returnOverlaysInfo(request); | 235 _returnOverlaysInfo(request); |
222 } else { | 236 } else { |
223 _returnUnknownRequest(request); | 237 _returnUnknownRequest(request); |
(...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1054 } else { | 1068 } else { |
1055 exceptions.forEach((CaughtException exception) { | 1069 exceptions.forEach((CaughtException exception) { |
1056 _writeException(buffer, exception); | 1070 _writeException(buffer, exception); |
1057 }); | 1071 }); |
1058 } | 1072 } |
1059 }); | 1073 }); |
1060 }); | 1074 }); |
1061 } | 1075 } |
1062 | 1076 |
1063 /** | 1077 /** |
| 1078 * Return a response displaying diagnostic information. |
| 1079 */ |
| 1080 void _returnDiagnosticInfo(HttpRequest request) { |
| 1081 String value = request.requestedUri.queryParameters['index']; |
| 1082 int index = value != null ? int.parse(value, onError: (_) => 0) : 0; |
| 1083 _writeResponse(request, (StringBuffer buffer) { |
| 1084 _writePage(buffer, 'Analysis Server - Diagnostic info', [], |
| 1085 (StringBuffer buffer) { |
| 1086 _writeDiagnosticStatus(buffer); |
| 1087 }); |
| 1088 }); |
| 1089 } |
| 1090 |
| 1091 /** |
1064 * Return a response containing information about an element structure. | 1092 * Return a response containing information about an element structure. |
1065 */ | 1093 */ |
1066 void _returnElement(HttpRequest request) { | 1094 void _returnElement(HttpRequest request) { |
1067 AnalysisServer analysisServer = _server.analysisServer; | 1095 AnalysisServer analysisServer = _server.analysisServer; |
1068 if (analysisServer == null) { | 1096 if (analysisServer == null) { |
1069 return _returnFailure(request, 'Analysis server not running'); | 1097 return _returnFailure(request, 'Analysis server not running'); |
1070 } | 1098 } |
1071 String contextFilter = request.uri.queryParameters[CONTEXT_QUERY_PARAM]; | 1099 String contextFilter = request.uri.queryParameters[CONTEXT_QUERY_PARAM]; |
1072 if (contextFilter == null) { | 1100 if (contextFilter == null) { |
1073 return _returnFailure( | 1101 return _returnFailure( |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1210 } | 1238 } |
1211 | 1239 |
1212 /** | 1240 /** |
1213 * Return a response indicating the status of the analysis server. | 1241 * Return a response indicating the status of the analysis server. |
1214 */ | 1242 */ |
1215 void _returnServerStatus(HttpRequest request) { | 1243 void _returnServerStatus(HttpRequest request) { |
1216 _writeResponse(request, (StringBuffer buffer) { | 1244 _writeResponse(request, (StringBuffer buffer) { |
1217 _writePage(buffer, 'Analysis Server - Status', [], (StringBuffer buffer) { | 1245 _writePage(buffer, 'Analysis Server - Status', [], (StringBuffer buffer) { |
1218 if (_writeServerStatus(buffer)) { | 1246 if (_writeServerStatus(buffer)) { |
1219 _writeAnalysisStatus(buffer); | 1247 _writeAnalysisStatus(buffer); |
| 1248 _writeDiagnosticStatus(buffer); |
1220 _writeEditStatus(buffer); | 1249 _writeEditStatus(buffer); |
1221 _writeExecutionStatus(buffer); | 1250 _writeExecutionStatus(buffer); |
1222 _writePluginStatus(buffer); | 1251 _writePluginStatus(buffer); |
1223 _writeRecentOutput(buffer); | 1252 _writeRecentOutput(buffer); |
1224 } | 1253 } |
1225 }); | 1254 }); |
1226 }); | 1255 }); |
1227 } | 1256 } |
1228 | 1257 |
1229 /** | 1258 /** |
(...skipping 10 matching lines...) Expand all Loading... |
1240 buffer.write('<p>'); | 1269 buffer.write('<p>'); |
1241 buffer | 1270 buffer |
1242 .write(makeLink(COMMUNICATION_PERFORMANCE_PATH, {}, 'Performance')); | 1271 .write(makeLink(COMMUNICATION_PERFORMANCE_PATH, {}, 'Performance')); |
1243 buffer.write('</p>'); | 1272 buffer.write('</p>'); |
1244 buffer.write('<p>'); | 1273 buffer.write('<p>'); |
1245 buffer.write(makeLink(STATUS_PATH, {}, 'Server status')); | 1274 buffer.write(makeLink(STATUS_PATH, {}, 'Server status')); |
1246 buffer.write('</p>'); | 1275 buffer.write('</p>'); |
1247 buffer.write('<p>'); | 1276 buffer.write('<p>'); |
1248 buffer.write(makeLink(OVERLAYS_PATH, {}, 'File overlays')); | 1277 buffer.write(makeLink(OVERLAYS_PATH, {}, 'File overlays')); |
1249 buffer.write('</p>'); | 1278 buffer.write('</p>'); |
| 1279 buffer.write('<p>'); |
| 1280 buffer.write(makeLink(DIAGNOSTIC_PATH, {}, 'Diagnostic info')); |
| 1281 buffer.write('</p>'); |
1250 }); | 1282 }); |
1251 }); | 1283 }); |
1252 } | 1284 } |
1253 | 1285 |
1254 /** | 1286 /** |
1255 * Return a two digit decimal representation of the given non-negative integer | 1287 * Return a two digit decimal representation of the given non-negative integer |
1256 * [value]. | 1288 * [value]. |
1257 */ | 1289 */ |
1258 String _twoDigit(int value) { | 1290 String _twoDigit(int value) { |
1259 if (value < 10) { | 1291 if (value < 10) { |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1442 <p><strong># Notifications</strong> - the total number of notifications | 1474 <p><strong># Notifications</strong> - the total number of notifications |
1443 sent to the client with completion results for this request. | 1475 sent to the client with completion results for this request. |
1444 <p><strong># Suggestions</strong> - the number of suggestions | 1476 <p><strong># Suggestions</strong> - the number of suggestions |
1445 sent to the client in the first notification, followed by a comma, | 1477 sent to the client in the first notification, followed by a comma, |
1446 followed by the number of suggestions send to the client | 1478 followed by the number of suggestions send to the client |
1447 in the last notification. If there is only one notification, | 1479 in the last notification. If there is only one notification, |
1448 then there will be only one number in this column.'''); | 1480 then there will be only one number in this column.'''); |
1449 } | 1481 } |
1450 | 1482 |
1451 /** | 1483 /** |
| 1484 * Write the status of the diagnostic domain to the given [buffer]. |
| 1485 */ |
| 1486 void _writeDiagnosticStatus(StringBuffer buffer) { |
| 1487 DiagnosticDomainHandler handler = |
| 1488 new DiagnosticDomainHandler(_server.analysisServer); |
| 1489 |
| 1490 var request = new DiagnosticGetDiagnosticsParams().toRequest('0'); |
| 1491 |
| 1492 var stopwatch = new Stopwatch(); |
| 1493 stopwatch.start(); |
| 1494 var response = handler.handleRequest(request); |
| 1495 stopwatch.stop(); |
| 1496 |
| 1497 int elapsedMs = stopwatch.elapsedMilliseconds; |
| 1498 _diagnosticCallAverage.addSample(elapsedMs); |
| 1499 |
| 1500 buffer.write('<h3>Timing</h3>'); |
| 1501 |
| 1502 buffer.write('<p>'); |
| 1503 buffer.write('getDiagnostic (last call): $elapsedMs (ms)'); |
| 1504 buffer.write('<p>'); |
| 1505 buffer.write('getDiagnostic (rolling average): ' |
| 1506 '${_diagnosticCallAverage.value} (ms)'); |
| 1507 buffer.write('<p> '); |
| 1508 |
| 1509 var json = response.toJson()[Response.RESULT]; |
| 1510 List contexts = json['contexts']; |
| 1511 for (var context in contexts) { |
| 1512 buffer.write('<p>'); |
| 1513 buffer.write('<h3>${context["name"]}</h3>'); |
| 1514 buffer.write('<p>'); |
| 1515 buffer.write('explicitFileCount: ${context["explicitFileCount"]}'); |
| 1516 buffer.write('<p>'); |
| 1517 buffer.write('implicitFileCount: ${context["implicitFileCount"]}'); |
| 1518 buffer.write('<p>'); |
| 1519 buffer.write('workItemQueueLength: ${context["workItemQueueLength"]}'); |
| 1520 buffer.write('<p>'); |
| 1521 buffer.write('workItemQueueLengthAverage: ' |
| 1522 '${context["workItemQueueLengthAverage"]}'); |
| 1523 buffer.write('<p> '); |
| 1524 } |
| 1525 } |
| 1526 |
| 1527 /** |
1452 * Write the status of the edit domain (on the main status page) to the given | 1528 * Write the status of the edit domain (on the main status page) to the given |
1453 * [buffer]. | 1529 * [buffer]. |
1454 */ | 1530 */ |
1455 void _writeEditStatus(StringBuffer buffer) { | 1531 void _writeEditStatus(StringBuffer buffer) { |
1456 buffer.write('<h3>Edit Domain</h3>'); | 1532 buffer.write('<h3>Edit Domain</h3>'); |
1457 _writeTwoColumns(buffer, (StringBuffer buffer) { | 1533 _writeTwoColumns(buffer, (StringBuffer buffer) { |
1458 buffer.write('<p><b>Performance Data</b></p>'); | 1534 buffer.write('<p><b>Performance Data</b></p>'); |
1459 buffer.write('<p>'); | 1535 buffer.write('<p>'); |
1460 buffer.write(makeLink(COMPLETION_PATH, {}, 'Completion data')); | 1536 buffer.write(makeLink(COMPLETION_PATH, {}, 'Completion data')); |
1461 buffer.write('</p>'); | 1537 buffer.write('</p>'); |
(...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1945 */ | 2021 */ |
1946 static String makeLink( | 2022 static String makeLink( |
1947 String path, Map<String, String> params, String innerHtml, | 2023 String path, Map<String, String> params, String innerHtml, |
1948 [bool hasError = false]) { | 2024 [bool hasError = false]) { |
1949 Uri uri = new Uri(path: path, queryParameters: params); | 2025 Uri uri = new Uri(path: path, queryParameters: params); |
1950 String href = HTML_ESCAPE.convert(uri.toString()); | 2026 String href = HTML_ESCAPE.convert(uri.toString()); |
1951 String classAttribute = hasError ? ' class="error"' : ''; | 2027 String classAttribute = hasError ? ' class="error"' : ''; |
1952 return '<a href="$href"$classAttribute>$innerHtml</a>'; | 2028 return '<a href="$href"$classAttribute>$innerHtml</a>'; |
1953 } | 2029 } |
1954 } | 2030 } |
OLD | NEW |