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

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

Issue 894823002: record and display request latency (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: merge Created 5 years, 10 months 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
« no previous file with comments | « pkg/analysis_server/lib/src/analysis_server.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 analysis_server.src.get_handler; 5 library analysis_server.src.get_handler;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 import 'dart:convert'; 8 import 'dart:convert';
9 import 'dart:io'; 9 import 'dart:io';
10 import 'dart:math'; 10 import 'dart:math';
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 * The path used to request an overlay contents. 80 * The path used to request an overlay contents.
81 */ 81 */
82 static const String OVERLAY_PATH = '/overlay'; 82 static const String OVERLAY_PATH = '/overlay';
83 83
84 /** 84 /**
85 * The path used to request overlays information. 85 * The path used to request overlays information.
86 */ 86 */
87 static const String OVERLAYS_PATH = '/overlays'; 87 static const String OVERLAYS_PATH = '/overlays';
88 88
89 /** 89 /**
90 * The path used to request overall performance information.
91 */
92 static const String PERFORMANCE_PATH = '/performance';
93
94 /**
90 * Query parameter used to represent the cache state to search for, when 95 * Query parameter used to represent the cache state to search for, when
91 * accessing [CACHE_STATE_PATH]. 96 * accessing [CACHE_STATE_PATH].
92 */ 97 */
93 static const String STATE_QUERY_PARAM = 'state'; 98 static const String STATE_QUERY_PARAM = 'state';
94 99
95 /** 100 /**
96 * Query parameter used to represent the context to search for, when 101 * Query parameter used to represent the context to search for, when
97 * accessing [CACHE_ENTRY_PATH] or [CACHE_STATE_PATH]. 102 * accessing [CACHE_ENTRY_PATH] or [CACHE_STATE_PATH].
98 */ 103 */
99 static const String CONTEXT_QUERY_PARAM = 'context'; 104 static const String CONTEXT_QUERY_PARAM = 'context';
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 } else if (path == COMPLETION_PATH) { 174 } else if (path == COMPLETION_PATH) {
170 _returnCompletionInfo(request); 175 _returnCompletionInfo(request);
171 } else if (path == CONTEXT_PATH) { 176 } else if (path == CONTEXT_PATH) {
172 _returnContextInfo(request); 177 _returnContextInfo(request);
173 } else if (path == ELEMENT_PATH) { 178 } else if (path == ELEMENT_PATH) {
174 _returnElement(request); 179 _returnElement(request);
175 } else if (path == OVERLAY_PATH) { 180 } else if (path == OVERLAY_PATH) {
176 _returnOverlayContents(request); 181 _returnOverlayContents(request);
177 } else if (path == OVERLAYS_PATH) { 182 } else if (path == OVERLAYS_PATH) {
178 _returnOverlaysInfo(request); 183 _returnOverlaysInfo(request);
184 } else if (path == PERFORMANCE_PATH) {
185 _returnPerformance(request);
179 } else { 186 } else {
180 _returnUnknownRequest(request); 187 _returnUnknownRequest(request);
181 } 188 }
182 } 189 }
183 190
184 /** 191 /**
185 * Return the folder being managed by the given [analysisServer] that matches 192 * Return the folder being managed by the given [analysisServer] that matches
186 * the given [contextFilter], or `null` if there is none. 193 * the given [contextFilter], or `null` if there is none.
187 */ 194 */
188 Folder _findFolder(AnalysisServer analysisServer, String contextFilter) { 195 Folder _findFolder(AnalysisServer analysisServer, String contextFilter) {
(...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 _overlayContents[count] = contents; 746 _overlayContents[count] = contents;
740 }); 747 });
741 }); 748 });
742 buffer.write('<tr><td colspan="2">Total: $count entries.</td></tr>'); 749 buffer.write('<tr><td colspan="2">Total: $count entries.</td></tr>');
743 buffer.write('</table>'); 750 buffer.write('</table>');
744 }); 751 });
745 }); 752 });
746 } 753 }
747 754
748 /** 755 /**
756 * Return a response displaying overall performance information.
757 */
758 void _returnPerformance(HttpRequest request) {
759 AnalysisServer analysisServer = _server.analysisServer;
760 if (analysisServer == null) {
761 return _returnFailure(request, 'Analysis server is not running');
762 }
763 _writeResponse(request, (StringBuffer buffer) {
764 _writePage(
765 buffer,
766 'Analysis Server - Performance',
767 [],
768 (StringBuffer buffer) {
769 buffer.write('<h3>Communication Performance</h3>');
770 _writeTwoColumns(buffer, (StringBuffer buffer) {
771 ServerPerformance perf = analysisServer.performanceDuringStartup;
772 int requestCount = perf.requestCount;
773 num averageLatency =
774 requestCount > 0 ? (perf.requestLatency / requestCount).round() : 0;
775 int maximumLatency = perf.maxLatency;
776 num slowRequestPercent =
777 requestCount > 0 ? (perf.slowRequestCount * 100 / requestCount).ro und() : 0;
778 buffer.write('<h4>Startup</h4>');
779 buffer.write('<table>');
780 _writeRow(
781 buffer,
782 [requestCount, 'requests'],
783 classes: ["right", null]);
784 _writeRow(
785 buffer,
786 [averageLatency, 'ms average latency'],
787 classes: ["right", null]);
788 _writeRow(
789 buffer,
790 [maximumLatency, 'ms maximum latency'],
791 classes: ["right", null]);
792 _writeRow(
793 buffer,
794 [slowRequestPercent, '% > 150 ms latency'],
795 classes: ["right", null]);
796 if (analysisServer.performanceAfterStartup != null) {
797 int startupTime =
798 analysisServer.performanceAfterStartup.startTime -
799 perf.startTime;
800 _writeRow(
801 buffer,
802 [startupTime, 'ms for initial analysis to complete']);
803 }
804 buffer.write('</table>');
805 }, (StringBuffer buffer) {
806 ServerPerformance perf = analysisServer.performanceAfterStartup;
807 if (perf == null) {
808 return;
809 }
810 int requestCount = perf.requestCount;
811 num averageLatency =
812 requestCount > 0 ? (perf.requestLatency * 10 / requestCount).round () / 10 : 0;
813 int maximumLatency = perf.maxLatency;
814 num slowRequestPercent =
815 requestCount > 0 ? (perf.slowRequestCount * 100 / requestCount).ro und() : 0;
816 buffer.write('<h4>Current</h4>');
817 buffer.write('<table>');
818 _writeRow(
819 buffer,
820 [requestCount, 'requests'],
821 classes: ["right", null]);
822 _writeRow(
823 buffer,
824 [averageLatency, 'ms average latency'],
825 classes: ["right", null]);
826 _writeRow(
827 buffer,
828 [maximumLatency, 'ms maximum latency'],
829 classes: ["right", null]);
830 _writeRow(
831 buffer,
832 [slowRequestPercent, '% > 150 ms latency'],
833 classes: ["right", null]);
834 buffer.write('</table>');
835 });
836 });
837 });
838 }
839
840 /**
749 * Return a response indicating the status of the analysis server. 841 * Return a response indicating the status of the analysis server.
750 */ 842 */
751 void _returnServerStatus(HttpRequest request) { 843 void _returnServerStatus(HttpRequest request) {
752 _writeResponse(request, (StringBuffer buffer) { 844 _writeResponse(request, (StringBuffer buffer) {
753 _writePage(buffer, 'Analysis Server - Status', [], (StringBuffer buffer) { 845 _writePage(buffer, 'Analysis Server - Status', [], (StringBuffer buffer) {
754 if (_writeServerStatus(buffer)) { 846 if (_writeServerStatus(buffer)) {
755 _writeAnalysisStatus(buffer); 847 _writeAnalysisStatus(buffer);
756 _writeEditStatus(buffer); 848 _writeEditStatus(buffer);
757 _writeExecutionStatus(buffer); 849 _writeExecutionStatus(buffer);
758 _writeRecentOutput(buffer); 850 _writeRecentOutput(buffer);
759 } 851 }
760 }); 852 });
761 }); 853 });
762 } 854 }
763 855
764 /** 856 /**
765 * Return an error in response to an unrecognized request received by the HTTP 857 * Return an error in response to an unrecognized request received by the HTTP
766 * server. 858 * server.
767 */ 859 */
768 void _returnUnknownRequest(HttpRequest request) { 860 void _returnUnknownRequest(HttpRequest request) {
769 HttpResponse response = request.response; 861 _writeResponse(request, (StringBuffer buffer) {
770 response.statusCode = HttpStatus.NOT_FOUND; 862 _writePage(buffer, 'Analysis Server', [], (StringBuffer buffer) {
771 response.headers.contentType = _htmlContent; 863 buffer.write('<h3>Pages</h3>');
772 response.write('<html>'); 864 buffer.write('<p>');
773 response.write('<head>'); 865 buffer.write(_makeLink(COMPLETION_PATH, {}, 'Completion data'));
774 response.write('<title>Dart Analysis Server - Page Not Found</title>'); 866 buffer.write('</p>');
775 response.write('</head>'); 867 buffer.write('<p>');
776 response.write('<body>'); 868 buffer.write(_makeLink(PERFORMANCE_PATH, {}, 'Performance'));
777 response.write('<h1>Page Not Found</h1>'); 869 buffer.write('</p>');
778 response.write('<p>Try one of these links instead:</p>'); 870 buffer.write('<p>');
779 response.write('<ul>'); 871 buffer.write(_makeLink(STATUS_PATH, {}, 'Server status'));
780 response.write('<li><a href="$STATUS_PATH">Server Status</a></li>'); 872 buffer.write('</p>');
781 response.write('<li><a href="$COMPLETION_PATH">Completion Stats</a></li>'); 873 });
782 response.write('<ul>'); 874 });
783 response.write('</body>');
784 response.write('</html>');
785 response.close();
786 } 875 }
787 876
788 /** 877 /**
789 * Return a two digit decimal representation of the given non-negative integer 878 * Return a two digit decimal representation of the given non-negative integer
790 * [value]. 879 * [value].
791 */ 880 */
792 String _twoDigit(int value) { 881 String _twoDigit(int value) {
793 if (value < 10) { 882 if (value < 10) {
794 return '0$value'; 883 return '0$value';
795 } 884 }
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after
1384 } else if (value is Element) { 1473 } else if (value is Element) {
1385 String link = 1474 String link =
1386 _makeLink(ELEMENT_PATH, linkParameters, value.runtimeType.toString()); 1475 _makeLink(ELEMENT_PATH, linkParameters, value.runtimeType.toString());
1387 buffer.write('<i>$link</i>'); 1476 buffer.write('<i>$link</i>');
1388 } else { 1477 } else {
1389 buffer.write(HTML_ESCAPE.convert(value.toString())); 1478 buffer.write(HTML_ESCAPE.convert(value.toString()));
1390 buffer.write(' <i>(${value.runtimeType.toString()})</i>'); 1479 buffer.write(' <i>(${value.runtimeType.toString()})</i>');
1391 } 1480 }
1392 } 1481 }
1393 } 1482 }
OLDNEW
« no previous file with comments | « pkg/analysis_server/lib/src/analysis_server.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698