diff options
Diffstat (limited to 'catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_proto_classes.py')
-rw-r--r-- | catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_proto_classes.py | 143 |
1 files changed, 126 insertions, 17 deletions
diff --git a/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_proto_classes.py b/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_proto_classes.py index 2da179be..5be4a8e1 100644 --- a/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_proto_classes.py +++ b/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_proto_classes.py @@ -21,15 +21,32 @@ import wire_format class TracePacket(object): def __init__(self): + self.clock_snapshot = None + self.timestamp = None + self.timestamp_clock_id = None self.interned_data = None self.thread_descriptor = None self.incremental_state_cleared = None + self.chrome_event = None self.track_event = None self.trusted_packet_sequence_id = None self.chrome_benchmark_metadata = None def encode(self): parts = [] + if self.chrome_event is not None: + tag = encoder.TagBytes(5, wire_format.WIRETYPE_LENGTH_DELIMITED) + data = self.chrome_event.encode() + length = encoder._VarintBytes(len(data)) + parts += [tag, length, data] + if self.clock_snapshot is not None: + tag = encoder.TagBytes(6, wire_format.WIRETYPE_LENGTH_DELIMITED) + data = self.clock_snapshot.encode() + length = encoder._VarintBytes(len(data)) + parts += [tag, length, data] + if self.timestamp is not None: + writer = encoder.UInt64Encoder(8, False, False) + writer(parts.append, self.timestamp) if self.trusted_packet_sequence_id is not None: writer = encoder.UInt32Encoder(10, False, False) writer(parts.append, self.trusted_packet_sequence_id) @@ -56,6 +73,9 @@ class TracePacket(object): data = self.chrome_benchmark_metadata.encode() length = encoder._VarintBytes(len(data)) parts += [tag, length, data] + if self.timestamp_clock_id is not None: + writer = encoder.UInt32Encoder(58, False, False) + writer(parts.append, self.timestamp_clock_id) return b"".join(parts) @@ -106,11 +126,9 @@ class ThreadDescriptor(object): def __init__(self): self.pid = None self.tid = None - self.reference_timestamp_us = None def encode(self): - if (self.pid is None or self.tid is None or - self.reference_timestamp_us is None): + if (self.pid is None or self.tid is None): raise RuntimeError("Missing mandatory fields.") parts = [] @@ -118,35 +136,46 @@ class ThreadDescriptor(object): writer(parts.append, self.pid) writer = encoder.UInt32Encoder(2, False, False) writer(parts.append, self.tid) - writer = encoder.Int64Encoder(6, False, False) - writer(parts.append, self.reference_timestamp_us) + + return b"".join(parts) + + +class ChromeEventBundle(object): + def __init__(self): + self.metadata = [] + + def encode(self): + parts = [] + for item in self.metadata: + tag = encoder.TagBytes(2, wire_format.WIRETYPE_LENGTH_DELIMITED) + data = item.encode() + length = encoder._VarintBytes(len(data)) + parts += [tag, length, data] return b"".join(parts) class TrackEvent(object): def __init__(self): - self.timestamp_absolute_us = None - self.timestamp_delta_us = None self.legacy_event = None self.category_iids = None + self.debug_annotations = [] def encode(self): parts = [] - if self.timestamp_delta_us is not None: - writer = encoder.Int64Encoder(1, False, False) - writer(parts.append, self.timestamp_delta_us) if self.category_iids is not None: writer = encoder.UInt32Encoder(3, is_repeated=True, is_packed=False) writer(parts.append, self.category_iids) + for annotation in self.debug_annotations: + tag = encoder.TagBytes(4, wire_format.WIRETYPE_LENGTH_DELIMITED) + data = annotation.encode() + length = encoder._VarintBytes(len(data)) + parts += [tag, length, data] if self.legacy_event is not None: tag = encoder.TagBytes(6, wire_format.WIRETYPE_LENGTH_DELIMITED) data = self.legacy_event.encode() length = encoder._VarintBytes(len(data)) parts += [tag, length, data] - if self.timestamp_absolute_us is not None: - writer = encoder.Int64Encoder(16, False, False) - writer(parts.append, self.timestamp_absolute_us) return b"".join(parts) @@ -178,7 +207,6 @@ class ChromeBenchmarkMetadata(object): self.story_tags = None self.story_run_index = None self.label = None - self.had_failures = None def encode(self): parts = [] @@ -206,9 +234,6 @@ class ChromeBenchmarkMetadata(object): if self.story_run_index is not None: writer = encoder.Int32Encoder(8, False, False) writer(parts.append, self.story_run_index) - if self.had_failures is not None: - writer = encoder.BoolEncoder(9, False, False) - writer(parts.append, self.had_failures) return b"".join(parts) @@ -220,3 +245,87 @@ def write_trace_packet(output, trace_packet): encoder._EncodeVarint(output.write, len(binary_data)) output.write(binary_data) + +class DebugAnnotation(object): + def __init__(self): + self.name = None + self.int_value = None + self.double_value = None + self.string_value = None + + def encode(self): + if self.name is None: + raise RuntimeError("DebugAnnotation must have a name.") + if ((self.string_value is not None) + + (self.int_value is not None) + + (self.double_value is not None)) != 1: + raise RuntimeError("DebugAnnotation must have exactly one value.") + + parts = [] + writer = encoder.StringEncoder(10, False, False) + writer(parts.append, self.name) + if self.int_value is not None: + writer = encoder.Int64Encoder(4, False, False) + writer(parts.append, self.int_value) + if self.double_value is not None: + writer = encoder.DoubleEncoder(5, False, False) + writer(parts.append, self.double_value) + if self.string_value is not None: + writer = encoder.StringEncoder(6, False, False) + writer(parts.append, self.string_value) + + return b"".join(parts) + + +class ChromeMetadata(object): + def __init__(self): + self.name = None + self.string_value = None + + def encode(self): + if self.name is None or self.string_value is None: + raise RuntimeError("ChromeMetadata must have a name and a value.") + + parts = [] + writer = encoder.StringEncoder(1, False, False) + writer(parts.append, self.name) + writer = encoder.StringEncoder(2, False, False) + writer(parts.append, self.string_value) + + return b"".join(parts) + + +class Clock(object): + def __init__(self): + self.clock_id = None + self.timestamp = None + + def encode(self): + if self.clock_id is None or self.timestamp is None: + raise RuntimeError("Clock must have a clock_id and a timestamp.") + + parts = [] + writer = encoder.UInt32Encoder(1, False, False) + writer(parts.append, self.clock_id) + writer = encoder.UInt64Encoder(2, False, False) + writer(parts.append, self.timestamp) + + return b"".join(parts) + + +class ClockSnapshot(object): + def __init__(self): + self.clocks = [] + + def encode(self): + if len(self.clocks) < 2: + raise RuntimeError("ClockSnapshot must have at least two clocks.") + + parts = [] + for clock in self.clocks: + tag = encoder.TagBytes(1, wire_format.WIRETYPE_LENGTH_DELIMITED) + data = clock.encode() + length = encoder._VarintBytes(len(data)) + parts += [tag, length, data] + + return b"".join(parts) |