| Index: tools/telemetry/telemetry/timeline/trace_data.py
|
| diff --git a/tools/telemetry/telemetry/timeline/trace_data.py b/tools/telemetry/telemetry/timeline/trace_data.py
|
| deleted file mode 100644
|
| index 54b99be9d090fa4f91933c26deba031571434d5c..0000000000000000000000000000000000000000
|
| --- a/tools/telemetry/telemetry/timeline/trace_data.py
|
| +++ /dev/null
|
| @@ -1,182 +0,0 @@
|
| -# Copyright 2014 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -import json
|
| -
|
| -class NonSerializableTraceData(Exception):
|
| - """Raised when raw trace data cannot be serialized to TraceData."""
|
| - pass
|
| -
|
| -
|
| -def _ValidateRawData(raw):
|
| - try:
|
| - json.dumps(raw)
|
| - except TypeError as e:
|
| - raise NonSerializableTraceData('TraceData is not serilizable: %s' % e)
|
| - except ValueError as e:
|
| - raise NonSerializableTraceData('TraceData is not serilizable: %s' % e)
|
| -
|
| -
|
| -class TraceDataPart(object):
|
| - """TraceData can have a variety of events.
|
| -
|
| - These are called "parts" and are accessed by the following fixed field names.
|
| - """
|
| - def __init__(self, raw_field_name):
|
| - self._raw_field_name = raw_field_name
|
| -
|
| - def __repr__(self):
|
| - return 'TraceDataPart("%s")' % self._raw_field_name
|
| -
|
| - @property
|
| - def raw_field_name(self):
|
| - return self._raw_field_name
|
| -
|
| -
|
| -CHROME_TRACE_PART = TraceDataPart('traceEvents')
|
| -INSPECTOR_TRACE_PART = TraceDataPart('inspectorTimelineEvents')
|
| -SURFACE_FLINGER_PART = TraceDataPart('surfaceFlinger')
|
| -TAB_ID_PART = TraceDataPart('tabIds')
|
| -
|
| -ALL_TRACE_PARTS = {CHROME_TRACE_PART,
|
| - INSPECTOR_TRACE_PART,
|
| - SURFACE_FLINGER_PART,
|
| - TAB_ID_PART}
|
| -
|
| -
|
| -def _HasEventsFor(part, raw):
|
| - assert isinstance(part, TraceDataPart)
|
| - if part.raw_field_name not in raw:
|
| - return False
|
| - return len(raw[part.raw_field_name]) > 0
|
| -
|
| -
|
| -class TraceData(object):
|
| - """Validates, parses, and serializes raw data.
|
| -
|
| - NOTE: raw data must only include primitive objects!
|
| - By design, TraceData must contain only data that is BOTH json-serializable
|
| - to a file, AND restorable once again from that file into TraceData without
|
| - assistance from other classes.
|
| -
|
| - Raw data can be one of three standard trace_event formats:
|
| - 1. Trace container format: a json-parseable dict.
|
| - 2. A json-parseable array: assumed to be chrome trace data.
|
| - 3. A json-parseable array missing the final ']': assumed to be chrome trace
|
| - data.
|
| - """
|
| - def __init__(self, raw_data=None):
|
| - """Creates TraceData from the given data."""
|
| - self._raw_data = {}
|
| - self._events_are_safely_mutable = False
|
| - if not raw_data:
|
| - return
|
| - _ValidateRawData(raw_data)
|
| -
|
| - if isinstance(raw_data, basestring):
|
| - if raw_data.startswith('[') and not raw_data.endswith(']'):
|
| - if raw_data.endswith(','):
|
| - raw_data = raw_data[:-1]
|
| - raw_data += ']'
|
| - json_data = json.loads(raw_data)
|
| - # The parsed data isn't shared with anyone else, so we mark this value
|
| - # as safely mutable.
|
| - self._events_are_safely_mutable = True
|
| - else:
|
| - json_data = raw_data
|
| -
|
| - if isinstance(json_data, dict):
|
| - self._raw_data = json_data
|
| - elif isinstance(json_data, list):
|
| - if len(json_data) == 0:
|
| - self._raw_data = {}
|
| - self._raw_data = {CHROME_TRACE_PART.raw_field_name: json_data}
|
| - else:
|
| - raise Exception('Unrecognized data format.')
|
| -
|
| - def _SetFromBuilder(self, d):
|
| - self._raw_data = d
|
| - self._events_are_safely_mutable = True
|
| -
|
| - @property
|
| - def events_are_safely_mutable(self):
|
| - """Returns true if the events in this value are completely sealed.
|
| -
|
| - Some importers want to take complex fields out of the TraceData and add
|
| - them to the model, changing them subtly as they do so. If the TraceData
|
| - was constructed with data that is shared with something outside the trace
|
| - data, for instance a test harness, then this mutation is unexpected. But,
|
| - if the values are sealed, then mutating the events is a lot faster.
|
| -
|
| - We know if events are sealed if the value came from a string, or if the
|
| - value came from a TraceDataBuilder.
|
| - """
|
| - return self._events_are_safely_mutable
|
| -
|
| - @property
|
| - def active_parts(self):
|
| - return {p for p in ALL_TRACE_PARTS if p.raw_field_name in self._raw_data}
|
| -
|
| - @property
|
| - def metadata_records(self):
|
| - part_field_names = {p.raw_field_name for p in ALL_TRACE_PARTS}
|
| - for k, v in self._raw_data.iteritems():
|
| - if k in part_field_names:
|
| - continue
|
| - yield {
|
| - 'name': k,
|
| - 'value': v
|
| - }
|
| -
|
| - def HasEventsFor(self, part):
|
| - return _HasEventsFor(part, self._raw_data)
|
| -
|
| - def GetEventsFor(self, part):
|
| - if not self.HasEventsFor(part):
|
| - return []
|
| - assert isinstance(part, TraceDataPart)
|
| - return self._raw_data[part.raw_field_name]
|
| -
|
| - def Serialize(self, f, gzip_result=False):
|
| - """Serializes the trace result to a file-like object.
|
| -
|
| - Always writes in the trace container format.
|
| - """
|
| - assert not gzip_result, 'Not implemented'
|
| - json.dump(self._raw_data, f)
|
| -
|
| -
|
| -class TraceDataBuilder(object):
|
| - """TraceDataBuilder helps build up a trace from multiple trace agents.
|
| -
|
| - TraceData is supposed to be immutable, but it is useful during recording to
|
| - have a mutable version. That is TraceDataBuilder.
|
| - """
|
| - def __init__(self):
|
| - self._raw_data = {}
|
| -
|
| - def AsData(self):
|
| - if self._raw_data == None:
|
| - raise Exception('Can only AsData once')
|
| -
|
| - data = TraceData()
|
| - data._SetFromBuilder(self._raw_data)
|
| - self._raw_data = None
|
| - return data
|
| -
|
| - def AddEventsTo(self, part, events):
|
| - """Note: this won't work when called from multiple browsers.
|
| -
|
| - Each browser's trace_event_impl zeros its timestamps when it writes them
|
| - out and doesn't write a timebase that can be used to re-sync them.
|
| - """
|
| - assert isinstance(part, TraceDataPart)
|
| - assert isinstance(events, list)
|
| - if self._raw_data == None:
|
| - raise Exception('Already called AsData() on this builder.')
|
| -
|
| - self._raw_data.setdefault(part.raw_field_name, []).extend(events)
|
| -
|
| - def HasEventsFor(self, part):
|
| - return _HasEventsFor(part, self._raw_data)
|
|
|