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

Unified Diff: telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend.py

Issue 2160793003: Support traces containing all parts/agents returned via DevTools streams (Closed) Base URL: https://chromium.googlesource.com/external/github.com/catapult-project/catapult.git@master
Patch Set: dropped _had_data_collected Created 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend_unittest.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend.py
diff --git a/telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend.py b/telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend.py
index ad068e162559309790a88b6003204bced76e3ae8..5cb8607c58292c2421f7c1ed7e4268dc6c66ecf4 100644
--- a/telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend.py
+++ b/telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend.py
@@ -91,13 +91,13 @@ class TracingBackend(object):
self._inspector_websocket = inspector_socket
self._inspector_websocket.RegisterDomain(
self._TRACING_DOMAIN, self._NotificationHandler)
- self._trace_events = []
self._is_tracing_running = is_tracing_running
self._start_issued = False
self._can_collect_data = False
self._has_received_all_tracing_data = False
self._support_modern_devtools_tracing_start_api = (
support_modern_devtools_tracing_start_api)
+ self._trace_data_builder = None
@property
def is_tracing_running(self):
@@ -112,7 +112,6 @@ class TracingBackend(object):
return False
assert not self._can_collect_data, 'Data not collected from last trace.'
# Reset collected tracing data from previous tracing calls.
- self._trace_events = []
if not self.IsTracingSupported():
raise TracingUnsupportedException(
@@ -162,8 +161,7 @@ class TracingBackend(object):
tracing run is pushed.
"""
if not self.is_tracing_running:
- if not self._trace_events:
- raise TracingHasNotRunException()
+ raise TracingHasNotRunException()
else:
if not self._start_issued:
# Tracing is running but start was not issued so, startup tracing must
@@ -226,15 +224,14 @@ class TracingBackend(object):
def CollectTraceData(self, trace_data_builder, timeout=30):
if not self._can_collect_data:
raise Exception('Cannot collect before tracing is finished.')
- self._CollectTracingData(timeout)
+ self._CollectTracingData(trace_data_builder, timeout)
self._can_collect_data = False
- trace_data_builder.AddEventsTo(
- trace_data_module.CHROME_TRACE_PART, self._trace_events)
- def _CollectTracingData(self, timeout):
+ def _CollectTracingData(self, trace_data_builder, timeout):
"""Collects tracing data. Assumes that Tracing.end has already been sent.
Args:
+ trace_data_builder: An instance of TraceDataBuilder to put results into.
timeout: The timeout in seconds.
Raises:
@@ -244,45 +241,61 @@ class TracingBackend(object):
"""
self._has_received_all_tracing_data = False
start_time = time.time()
- while True:
- try:
- self._inspector_websocket.DispatchNotifications(timeout)
- start_time = time.time()
- except websocket.WebSocketTimeoutException:
- pass
- except (socket.error, websocket.WebSocketException):
- raise TracingUnrecoverableException(
- 'Exception raised while collecting tracing data:\n' +
- traceback.format_exc())
-
- if self._has_received_all_tracing_data:
- break
-
- elapsed_time = time.time() - start_time
- if elapsed_time > timeout:
- raise TracingTimeoutException(
- 'Only received partial trace data due to timeout after %s seconds. '
- 'If the trace data is big, you may want to increase the timeout '
- 'amount.' % elapsed_time)
+ self._trace_data_builder = trace_data_builder
+ try:
+ while True:
+ try:
+ self._inspector_websocket.DispatchNotifications(timeout)
+ start_time = time.time()
+ except websocket.WebSocketTimeoutException:
+ pass
+ except (socket.error, websocket.WebSocketException):
+ raise TracingUnrecoverableException(
+ 'Exception raised while collecting tracing data:\n' +
+ traceback.format_exc())
+
+ if self._has_received_all_tracing_data:
+ break
+
+ elapsed_time = time.time() - start_time
+ if elapsed_time > timeout:
+ raise TracingTimeoutException(
+ 'Only received partial trace data due to timeout after %s '
+ 'seconds. If the trace data is big, you may want to increase '
+ 'the timeout amount.' % elapsed_time)
+ finally:
+ self._trace_data_builder = None
def _NotificationHandler(self, res):
if 'Tracing.dataCollected' == res.get('method'):
value = res.get('params', {}).get('value')
- self._trace_events.extend(value)
+ self._trace_data_builder.AddEventsTo(
+ trace_data_module.CHROME_TRACE_PART, value)
elif 'Tracing.tracingComplete' == res.get('method'):
stream_handle = res.get('params', {}).get('stream')
if not stream_handle:
self._has_received_all_tracing_data = True
return
-
- if self._trace_events:
- raise TracingUnexpectedResponseException(
- 'Got both dataCollected events and a stream from server')
reader = _DevToolsStreamReader(self._inspector_websocket, stream_handle)
reader.Read(self._ReceivedAllTraceDataFromStream)
def _ReceivedAllTraceDataFromStream(self, data):
- self._trace_events = json.loads(data)
+ trace = json.loads(data)
+ if type(trace) == dict:
+ for part in trace_data_module.ALL_TRACE_PARTS:
+ field_name = part.raw_field_name
+ if field_name in trace:
+ self._trace_data_builder.AddEventsTo(part, trace[field_name])
+
+ if 'metadata' in trace:
+ self._trace_data_builder.SetMetadataFor(
+ trace_data_module.CHROME_TRACE_PART, trace['metadata'])
+
+ elif type(trace) == list:
+ self._trace_data_builder.AddEventsTo(
+ trace_data_module.CHROME_TRACE_PART, trace)
+ else:
+ raise TracingUnexpectedResponseException('Unexpected trace type')
self._has_received_all_tracing_data = True
def Close(self):
« no previous file with comments | « no previous file | telemetry/telemetry/internal/backends/chrome_inspector/tracing_backend_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698