Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(559)

Side by Side Diff: pkg/analysis_server/lib/src/get_handler.dart

Issue 796913004: enhance code completion tracking and measurement (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: merge Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 get.handler; 5 library get.handler;
6 6
7 import 'dart:convert'; 7 import 'dart:convert';
8 import 'dart:io'; 8 import 'dart:io';
9 import 'dart:math'; 9 import 'dart:math';
10 10
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 response.write('</body>'); 320 response.write('</body>');
321 response.write('</html>'); 321 response.write('</html>');
322 response.close(); 322 response.close();
323 } 323 }
324 324
325 /** 325 /**
326 * Return a response displaying code completion information. 326 * Return a response displaying code completion information.
327 */ 327 */
328 void _returnCompletionInfo(HttpRequest request) { 328 void _returnCompletionInfo(HttpRequest request) {
329 var refresh = request.requestedUri.queryParameters['refresh']; 329 var refresh = request.requestedUri.queryParameters['refresh'];
330 var maxCount = request.requestedUri.queryParameters['maxCount'];
330 HttpResponse response = request.response; 331 HttpResponse response = request.response;
331 response.statusCode = HttpStatus.OK; 332 response.statusCode = HttpStatus.OK;
332 response.headers.add(HttpHeaders.CONTENT_TYPE, "text/html"); 333 response.headers.add(HttpHeaders.CONTENT_TYPE, "text/html");
333 response.write('<html>'); 334 response.write('<html>');
334 response.write('<head>'); 335 response.write('<head>');
335 response.write('<title>Dart Analysis Server - Completion Stats</title>'); 336 response.write('<title>Dart Analysis Server - Completion Stats</title>');
336 response.write('<style>'); 337 response.write('<style>');
337 response.write('td.right {text-align: right;}'); 338 response.write('td.right {text-align: right;}');
338 response.write('</style>'); 339 response.write('</style>');
339 if (refresh is String) { 340 if (refresh is String) {
340 int seconds = int.parse(refresh, onError: (_) => 5); 341 int seconds = int.parse(refresh, onError: (_) => 5);
341 response.write('<meta http-equiv="refresh" content="$seconds">'); 342 response.write('<meta http-equiv="refresh" content="$seconds">');
342 } 343 }
343 response.write('</head>'); 344 response.write('</head>');
344 response.write('<body>'); 345 response.write('<body>');
345 _writeCompletionInfo(response); 346 _writeCompletionInfo(response, maxCount);
346 response.write('<form>'); 347 response.write('<p>&nbsp</p>');
347 response.write( 348 response.write('<p>Try ');
348 '<input type="button" onClick="history.go(0)" value="Refresh">'); 349 response.write('<a href="?refresh=5">?refresh=5</a>');
349 response.write('</form>'); 350 response.write(' to refresh every 5 seconds</p>');
350 response.write('<p>Append "?refresh=5" to refresh every 5 seconds</p>'); 351 response.write('<p>and ');
352 response.write('<a href="?maxCount=50">?maxCount=50</a>');
353 response.write(' to keep the last 50 performance measurements</p>');
351 response.write('</body>'); 354 response.write('</body>');
352 response.write('</html>'); 355 response.write('</html>');
353 response.close(); 356 response.close();
354 } 357 }
355 358
356 void _returnFailure(HttpRequest request, String message) { 359 void _returnFailure(HttpRequest request, String message) {
357 HttpResponse response = request.response; 360 HttpResponse response = request.response;
358 response.statusCode = HttpStatus.OK; 361 response.statusCode = HttpStatus.OK;
359 response.headers.add(HttpHeaders.CONTENT_TYPE, "text/html"); 362 response.headers.add(HttpHeaders.CONTENT_TYPE, "text/html");
360 response.write('<html>'); 363 response.write('<html>');
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 response.write('<li><a href="$COMPLETION_PATH">Completion Stats</a></li>'); 487 response.write('<li><a href="$COMPLETION_PATH">Completion Stats</a></li>');
485 response.write('<ul>'); 488 response.write('<ul>');
486 response.write('</body>'); 489 response.write('</body>');
487 response.write('</html>'); 490 response.write('</html>');
488 response.close(); 491 response.close();
489 } 492 }
490 493
491 /** 494 /**
492 * Append code completion information. 495 * Append code completion information.
493 */ 496 */
494 void _writeCompletionInfo(HttpResponse response) { 497 void _writeCompletionInfo(HttpResponse response, maxCount) {
495 response.write('<h1>Code Completion</h1>'); 498 response.write('<h1>Code Completion</h1>');
496 AnalysisServer analysisServer = _server.analysisServer; 499 AnalysisServer analysisServer = _server.analysisServer;
497 if (analysisServer == null) { 500 if (analysisServer == null) {
498 response.write('<p>Not running</p>'); 501 response.write('<p>Not running</p>');
499 return; 502 return;
500 } 503 }
501 CompletionDomainHandler handler = analysisServer.handlers.firstWhere( 504 CompletionDomainHandler handler = analysisServer.handlers.firstWhere(
502 (h) => h is CompletionDomainHandler, 505 (h) => h is CompletionDomainHandler,
503 orElse: () => null); 506 orElse: () => null);
504 if (handler == null) { 507 if (handler == null) {
505 response.write('<p>No code completion</p>'); 508 response.write('<p>No code completion</p>');
506 return; 509 return;
507 } 510 }
511 if (maxCount is String) {
512 int count = int.parse(maxCount, onError: (_) => 0);
513 handler.performanceListMaxLength = count;
514 }
508 CompletionPerformance performance = handler.performance; 515 CompletionPerformance performance = handler.performance;
509 if (performance == null) { 516 if (performance == null) {
510 response.write('<p>No performance stats yet</p>'); 517 response.write('<p>No performance stats yet</p>');
511 return; 518 return;
512 } 519 }
513 response.write('<h2>Performance</h2>');
514 response.write('<table>'); 520 response.write('<table>');
515 _writeRow(response, ['Elapsed', '', 'Operation'], header: true); 521 _writeRow(response, ['Elapsed', '', 'Operation'], header: true);
516 performance.operations.forEach((OperationPerformance op) { 522 performance.operations.forEach((OperationPerformance op) {
517 String elapsed = op.elapsed != null ? op.elapsed.toString() : '???'; 523 String elapsed = op.elapsed != null ? op.elapsed.toString() : '???';
518 _writeRow(response, [elapsed, '&nbsp;&nbsp;', op.name]); 524 _writeRow(response, [elapsed, '&nbsp;&nbsp;', op.name]);
519 }); 525 });
526 if (handler.priorityChangedPerformance == null) {
527 response.write('<p>No priorityChanged caching</p>');
528 } else {
529 int len = handler.priorityChangedPerformance.operations.length;
530 if (len > 0) {
531 var op = handler.priorityChangedPerformance.operations[len - 1];
532 if (op != null) {
533 _writeRow(response, ['&nbsp;', '&nbsp;', '&nbsp;']);
534 String elapsed = op.elapsed != null ? op.elapsed.toString() : '???';
535 _writeRow(response, [elapsed, '&nbsp;&nbsp;', op.name]);
536 }
537 }
538 }
520 response.write('</table>'); 539 response.write('</table>');
540 if (handler.performanceList.length > 0) {
541 response.write('<table>');
542 _writeRow(response, ['Milliseconds', '', '# Notifications', '', '# Suggest ions', '', 'Snippet'], header: true);
543 handler.performanceList.forEach((CompletionPerformance performance) {
544 _writeRow(
545 response,
546 [
547 performance.elapsedInMilliseconds,
548 '&nbsp;&nbsp;',
549 performance.notificationCount,
550 '&nbsp;&nbsp;',
551 performance.suggestionCount,
552 '&nbsp;&nbsp;',
553 performance.snippet]);
554 });
555 response.write('</table>');
556 }
521 } 557 }
522 558
523 /** 559 /**
524 * Write a single row within a table to the given [response] object. The row 560 * Write a single row within a table to the given [response] object. The row
525 * will have one cell for each of the [columns], and will be a header row if 561 * will have one cell for each of the [columns], and will be a header row if
526 * [header] is `true`. 562 * [header] is `true`.
527 */ 563 */
528 void _writeRow(HttpResponse response, List<Object> columns, {bool header: 564 void _writeRow(HttpResponse response, List<Object> columns, {bool header:
529 false, List<String> classes}) { 565 false, List<String> classes}) {
530 response.write('<tr>'); 566 response.write('<tr>');
(...skipping 16 matching lines...) Expand all
547 if (header) { 583 if (header) {
548 response.write('</th>'); 584 response.write('</th>');
549 } else { 585 } else {
550 response.write('</td>'); 586 response.write('</td>');
551 } 587 }
552 } 588 }
553 589
554 response.write('</tr>'); 590 response.write('</tr>');
555 } 591 }
556 } 592 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698