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

Side by Side Diff: tools/telemetry/telemetry/core/backends/chrome/tracing_backend.py

Issue 382833004: Remove StartAsyncDispatchNotifications from inspector_websocket (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update default timeout value for StopTracing call to 30s Created 6 years, 5 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
« no previous file with comments | « tools/telemetry/telemetry/core/backends/chrome/inspector_websocket.py ('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 2013 The Chromium Authors. All rights reserved. 1 # Copyright 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import logging 5 import logging
6 import re 6 import re
7 7
8 from telemetry.core.backends.chrome import inspector_websocket 8 from telemetry.core.backends.chrome import inspector_websocket
9 9
10 10
(...skipping 10 matching lines...) Expand all
21 "benchmark," 21 "benchmark,"
22 "webkit.console," 22 "webkit.console,"
23 "blink.console," 23 "blink.console,"
24 "trace_event_overhead") 24 "trace_event_overhead")
25 25
26 26
27 class TracingUnsupportedException(Exception): 27 class TracingUnsupportedException(Exception):
28 pass 28 pass
29 29
30 30
31 class TracingTimeoutException(Exception):
32 pass
33
34
31 class CategoryFilter(object): 35 class CategoryFilter(object):
32 def __init__(self, filter_string): 36 def __init__(self, filter_string):
33 self.excluded = set() 37 self.excluded = set()
34 self.included = set() 38 self.included = set()
35 self.disabled = set() 39 self.disabled = set()
36 self.synthetic_delays = set() 40 self.synthetic_delays = set()
37 self.contains_wildcards = False 41 self.contains_wildcards = False
38 42
39 if not filter_string: 43 if not filter_string:
40 return 44 return
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 def __init__(self, devtools_port): 107 def __init__(self, devtools_port):
104 self._inspector_websocket = inspector_websocket.InspectorWebsocket( 108 self._inspector_websocket = inspector_websocket.InspectorWebsocket(
105 self._NotificationHandler, 109 self._NotificationHandler,
106 self._ErrorHandler) 110 self._ErrorHandler)
107 111
108 self._inspector_websocket.Connect( 112 self._inspector_websocket.Connect(
109 'ws://127.0.0.1:%i/devtools/browser' % devtools_port) 113 'ws://127.0.0.1:%i/devtools/browser' % devtools_port)
110 self._category_filter = None 114 self._category_filter = None
111 self._nesting = 0 115 self._nesting = 0
112 self._tracing_data = [] 116 self._tracing_data = []
117 self._is_tracing_running = False
113 118
114 @property 119 @property
115 def is_tracing_running(self): 120 def is_tracing_running(self):
116 return self._inspector_websocket.is_dispatching_async_notifications 121 return self._is_tracing_running
117 122
118 def StartTracing(self, custom_categories=None, timeout=10): 123 def StartTracing(self, custom_categories=None, timeout=10):
119 """ Starts tracing on the first nested call and returns True. Returns False 124 """ Starts tracing on the first nested call and returns True. Returns False
120 and does nothing on subsequent nested calls. 125 and does nothing on subsequent nested calls.
121 """ 126 """
122 self._nesting += 1 127 self._nesting += 1
123 if self.is_tracing_running: 128 if self.is_tracing_running:
124 new_category_filter = CategoryFilter(custom_categories) 129 new_category_filter = CategoryFilter(custom_categories)
125 is_subset = new_category_filter.IsSubset(self._category_filter) 130 is_subset = new_category_filter.IsSubset(self._category_filter)
126 assert(is_subset != False) 131 assert(is_subset != False)
127 if is_subset == None: 132 if is_subset == None:
128 logging.warning('Cannot determine if category filter of nested ' + 133 logging.warning('Cannot determine if category filter of nested ' +
129 'StartTracing call is subset of current filter.') 134 'StartTracing call is subset of current filter.')
130 return False 135 return False
131 self._CheckNotificationSupported() 136 self._CheckNotificationSupported()
132 req = {'method': 'Tracing.start'} 137 req = {'method': 'Tracing.start'}
133 self._category_filter = CategoryFilter(custom_categories) 138 self._category_filter = CategoryFilter(custom_categories)
134 if custom_categories: 139 if custom_categories:
135 req['params'] = {'categories': custom_categories} 140 req['params'] = {'categories': custom_categories}
136 self._inspector_websocket.SyncRequest(req, timeout) 141 self._inspector_websocket.SyncRequest(req, timeout)
137 # Tracing.start will send asynchronous notifications containing trace 142 self._is_tracing_running = True
138 # data, until Tracing.end is called.
139 self._inspector_websocket.StartAsyncDispatchNotifications()
140 return True 143 return True
141 144
142 def StopTracing(self): 145 def StopTracing(self, timeout=30):
143 """ Stops tracing on the innermost (!) nested call, because we cannot get 146 """ Stops tracing on the innermost (!) nested call, because we cannot get
144 results otherwise. Resets _tracing_data on the outermost nested call. 147 results otherwise. Resets _tracing_data on the outermost nested call.
145 Returns the result of the trace, as TracingTimelineData object. 148 Returns the result of the trace, as TracingTimelineData object.
146 """ 149 """
147 self._nesting -= 1 150 self._nesting -= 1
148 assert self._nesting >= 0 151 assert self._nesting >= 0
149 if self.is_tracing_running: 152 if self.is_tracing_running:
150 req = {'method': 'Tracing.end'} 153 req = {'method': 'Tracing.end'}
151 self._inspector_websocket.SendAndIgnoreResponse(req) 154 self._inspector_websocket.SendAndIgnoreResponse(req)
152 self._inspector_websocket.StopAsyncDispatchNotifications() 155 # After Tracing.end, chrome browser will send asynchronous notifications
156 # containing trace data. This is until Tracing.tracingComplete is sent,
157 # which means there is no trace buffers pending flush.
158 try:
159 self._inspector_websocket.DispatchNotificationsUntilDone(timeout)
160 except \
161 inspector_websocket.DispatchNotificationsUntilDoneTimeoutException \
162 as err:
163 raise TracingTimeoutException(
164 'Trace data was not fully received due to timeout after %s '
165 'seconds. If the trace data is big, you may want to increase the '
166 'time out amount.' % err.elapsed_time)
chrishenry 2014/07/11 18:27:59 nit: timeout
167 self._is_tracing_running = False
153 if self._nesting == 0: 168 if self._nesting == 0:
154 self._category_filter = None 169 self._category_filter = None
155 return self._GetTraceResultAndReset() 170 return self._GetTraceResultAndReset()
156 else: 171 else:
157 return self._GetTraceResult() 172 return self._GetTraceResult()
158 173
159 def _GetTraceResult(self): 174 def _GetTraceResult(self):
160 assert not self.is_tracing_running 175 assert not self.is_tracing_running
161 return self._tracing_data 176 return self._tracing_data
162 177
(...skipping 25 matching lines...) Expand all
188 203
189 def _CheckNotificationSupported(self): 204 def _CheckNotificationSupported(self):
190 """Ensures we're running against a compatible version of chrome.""" 205 """Ensures we're running against a compatible version of chrome."""
191 req = {'method': 'Tracing.hasCompleted'} 206 req = {'method': 'Tracing.hasCompleted'}
192 res = self._inspector_websocket.SyncRequest(req) 207 res = self._inspector_websocket.SyncRequest(req)
193 if res.get('response'): 208 if res.get('response'):
194 raise TracingUnsupportedException( 209 raise TracingUnsupportedException(
195 'Tracing not supported for this browser') 210 'Tracing not supported for this browser')
196 elif 'error' in res: 211 elif 'error' in res:
197 return 212 return
OLDNEW
« no previous file with comments | « tools/telemetry/telemetry/core/backends/chrome/inspector_websocket.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698