Index: tools/telemetry/telemetry/web_perf/trace_mappers_based_measurement.py |
diff --git a/tools/telemetry/telemetry/web_perf/trace_mappers_based_measurement.py b/tools/telemetry/telemetry/web_perf/trace_mappers_based_measurement.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0c5439edf8e864097730b9ecafaf2f4db5c1b792 |
--- /dev/null |
+++ b/tools/telemetry/telemetry/web_perf/trace_mappers_based_measurement.py |
@@ -0,0 +1,88 @@ |
+# Copyright 2015 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 os |
+import tempfile |
+import shutil |
+ |
+from telemetry.web_perf import tracing_based_measurement |
+from perf_insights import map_single_trace |
+from perf_insights import map_function_handle as map_function_handle_module |
+from perf_insights import results as pi_results_module |
+from perf_insights.value import run_info as run_info_module |
+from perf_insights import local_file_trace_handle |
+ |
+ |
+class TraceMapperHandler(object): |
+ """ A trace mapper handler hold the reference to a mapper function & define |
+ how the results output by the trace mapper should be translated to telemetry's |
+ results. |
+ |
+ """ |
+ def __init__(self, trace_mapper_path): |
+ assert os.path.isfile(trace_mapper_path) |
+ self._trace_mapper_path = trace_mapper_path |
+ |
+ |
+ @property |
+ def trace_mapper_path(self): |
+ return self._trace_mapper_path |
+ |
+ def AddResults(self, pi_results, page, results): |
+ """ Override to add values to |results| based on |pi_results|'s values.""" |
+ raise NotImplementedError |
+ |
+ |
+class Options(tracing_based_measurement.Options): |
+ """A class to be used to configure TraceMapperBasedMeasurement. |
+ |
+ This is created and returned by |
+ Benchmark.CreateTimelineBasedMeasurementOptions. |
+ |
+ """ |
+ |
+ def __init__(self, |
+ overhead_level=tracing_based_measurement.NO_OVERHEAD_LEVEL): |
+ super(Options, self).__init__(overhead_level) |
+ self._trace_mapper_handlers = [] |
+ |
+ def AddTraceMapperHandlers(self, handler): |
+ assert isinstance(handler, TraceMapperHandler) |
+ self._trace_mapper_handlers.append(handler) |
+ |
+ @property |
+ def trace_mapper_handlers(self): |
+ return self._trace_mapper_handlers |
+ |
+ |
+class TraceMapperBasedMeasurement( |
+ tracing_based_measurement.TracingBasedMeasurement): |
+ def __init__(self, options): |
+ super(TraceMapperBasedMeasurement, self).__init__(options) |
+ assert isinstance(options, Options) |
+ assert self._options.trace_mapper_handlers, ( |
+ 'Must specify at least a trace mapper') |
+ |
+ def ComputeMetricsForTrace(self, trace_result, results): |
+ """Collect all possible metrics and added them to results.""" |
+ temp_dir = tempfile.mkdtemp() |
+ trace_file_path = os.path.join(temp_dir, 'trace.json') |
+ try: |
+ with open(trace_file_path, 'w') as f: |
+ trace_result.Serialize(f) |
+ for mapper_handler in self._options.trace_mapper_handlers: |
+ MapTrace(trace_file_path, mapper_handler, results) |
+ finally: |
+ shutil.rmtree(temp_dir) |
+ |
+ |
+def MapTrace(trace_file_path, trace_mapper_handler, results): |
+ run_info = run_info_module.RunInfo( |
+ results.current_page.url) |
+ map_function_handle = map_function_handle_module.MapFunctionHandle( |
+ filename=trace_mapper_handler.trace_mapper_path) |
+ trace_handle = local_file_trace_handle.LocalFileTraceHandle( |
+ run_info, trace_file_path) |
+ pi_results = pi_results_module.Results() |
+ map_single_trace.MapSingleTrace(pi_results, trace_handle, map_function_handle) |
+ trace_mapper_handler.AddResults(pi_results, results.current_page, results) |