| 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)
|
|
|