Chromium Code Reviews| Index: tools/telemetry/telemetry/web_perf/timeline_based_measurement.py |
| diff --git a/tools/telemetry/telemetry/web_perf/timeline_based_measurement.py b/tools/telemetry/telemetry/web_perf/timeline_based_measurement.py |
| index 03a90ad239a26c3e7f10723add0b54810d25d582..b09b1b25977b77313838ae19898b18f72304ec31 100644 |
| --- a/tools/telemetry/telemetry/web_perf/timeline_based_measurement.py |
| +++ b/tools/telemetry/telemetry/web_perf/timeline_based_measurement.py |
| @@ -35,13 +35,13 @@ class InvalidInteractions(Exception): |
| pass |
| -def _GetMetricFromMetricType(metric_type): |
| +def _GetMetricsFromMetricType(metric_type): |
| if metric_type == tir_module.IS_FAST: |
| - return fast_metric.FastMetric() |
| + return [fast_metric.FastMetric()] |
| if metric_type == tir_module.IS_SMOOTH: |
| - return smoothness.SmoothnessMetric() |
| + return [smoothness.SmoothnessMetric()] |
| if metric_type == tir_module.IS_RESPONSIVE: |
| - return responsiveness_metric.ResponsivenessMetric() |
| + return [responsiveness_metric.ResponsivenessMetric()] |
| raise Exception('Unrecognized metric type: %s' % metric_type) |
| @@ -84,12 +84,12 @@ def _GetRendererThreadsToInteractionRecordsMap(model): |
| class _TimelineBasedMetrics(object): |
| def __init__(self, model, renderer_thread, interaction_records, |
| - get_metric_from_metric_type_callback): |
| + get_metrics_from_metric_type_callback): |
| self._model = model |
| self._renderer_thread = renderer_thread |
| self._interaction_records = interaction_records |
| - self._get_metric_from_metric_type_callback = \ |
| - get_metric_from_metric_type_callback |
| + self._get_metrics_from_metric_type_callback = \ |
| + get_metrics_from_metric_type_callback |
| def AddResults(self, results): |
| interactions_by_label = defaultdict(list) |
| @@ -115,9 +115,10 @@ class _TimelineBasedMetrics(object): |
| if len(interactions_with_metric) != len(interactions): |
| raise InvalidInteractions('Interaction records with the same logical ' |
| 'name must have the same flags.') |
| - metric = self._get_metric_from_metric_type_callback(metric_type) |
| - metric.AddResults(self._model, self._renderer_thread, |
| - interactions, wrapped_results) |
| + metrics_list = self._get_metrics_from_metric_type_callback(metric_type) |
| + for metric in metrics_list: |
| + metric.AddResults(self._model, self._renderer_thread, |
| + interactions, wrapped_results) |
| class Options(object): |
| @@ -127,19 +128,29 @@ class Options(object): |
| Benchmark.CreateTimelineBasedMeasurementOptions. |
| """ |
| - def __init__(self, overhead_level=NO_OVERHEAD_LEVEL): |
| - """Save the overhead level. |
| - |
| - As the amount of instrumentation increases, so does the overhead. |
| + def __init__(self, overhead_level=NO_OVERHEAD_LEVEL, |
| + get_metrics_from_metric_type_callback=_GetMetricsFromMetricType): |
| + """As the amount of instrumentation increases, so does the overhead. |
| The user of the measurement chooses the overhead level that is appropriate, |
| and the tracing is filtered accordingly. |
| - overhead_level: one of NO_OVERHEAD_LEVEL, V8_OVERHEAD_LEVEL, |
| - MINIMAL_OVERHEAD_LEVEL, or DEBUG_OVERHEAD_LEVEL. |
| - The v8 overhead level is a temporary solution that may be removed. |
| + overhead_level: Can either be a custom TracingCategoryFilter object or |
| + one of NO_OVERHEAD_LEVEL, V8_OVERHEAD_LEVEL, MINIMAL_OVERHEAD_LEVEL, |
| + or DEBUG_OVERHEAD_LEVEL. The v8 overhead level is a temporary solution |
| + that may be removed. |
| + get_metrics_from_metric_type_callback: Callback function to create a metric |
|
nednguyen
2015/01/24 00:32:22
"return a list of metrics based on timeline intera
David Yen
2015/01/24 00:41:10
Done.
|
| + object. See the default _GetMetricsFromMetricType() as an example. |
| """ |
| self._overhead_level = overhead_level |
| + self._get_metric_from_metric_type = get_metrics_from_metric_type_callback |
| + @property |
| + def overhead_level(self): |
| + return self._overhead_level |
| + |
| + @property |
| + def get_metrics_from_metric_type_callback(self): |
| + return self._get_metric_from_metric_type |
| class TimelineBasedMeasurement(object): |
| """Collects multiple metrics based on their interaction records. |
| @@ -164,7 +175,7 @@ class TimelineBasedMeasurement(object): |
| perf.metrics.timeline_interaction_record module. |
| """ |
| def __init__(self, options): |
| - self._overhead_level = options._overhead_level |
| + self._tbm_options = options |
| def WillRunUserStory(self, tracing_controller, |
| synthetic_delay_categories=None): |
| @@ -179,18 +190,23 @@ class TimelineBasedMeasurement(object): |
| """ |
| if not tracing_controller.IsChromeTracingSupported(): |
| raise Exception('Not supported') |
| - assert self._overhead_level in ALL_OVERHEAD_LEVELS |
| - if self._overhead_level == NO_OVERHEAD_LEVEL: |
| - category_filter = tracing_category_filter.CreateNoOverheadFilter() |
| - # TODO(ernstm): Remove this overhead level when benchmark relevant v8 events |
| - # become available in the 'benchmark' category. |
| - elif self._overhead_level == V8_OVERHEAD_LEVEL: |
| - category_filter = tracing_category_filter.CreateNoOverheadFilter() |
| - category_filter.AddIncludedCategory('v8') |
| - elif self._overhead_level == MINIMAL_OVERHEAD_LEVEL: |
| - category_filter = tracing_category_filter.CreateMinimalOverheadFilter() |
| + |
| + if isinstance(self._tbm_options.overhead_level, |
| + tracing_category_filter.TracingCategoryFilter): |
| + category_filter = self._tbm_options.overhead_level |
| else: |
| - category_filter = tracing_category_filter.CreateDebugOverheadFilter() |
| + assert self._tbm_options.overhead_level in ALL_OVERHEAD_LEVELS |
| + if self._tbm_options.overhead_level == NO_OVERHEAD_LEVEL: |
| + category_filter = tracing_category_filter.CreateNoOverheadFilter() |
| + # TODO(ernstm): Remove this overhead level when benchmark relevant v8 |
| + # events become available in the 'benchmark' category. |
| + elif self._tbm_options.overhead_level == V8_OVERHEAD_LEVEL: |
| + category_filter = tracing_category_filter.CreateNoOverheadFilter() |
| + category_filter.AddIncludedCategory('v8') |
| + elif self._tbm_options.overhead_level == MINIMAL_OVERHEAD_LEVEL: |
| + category_filter = tracing_category_filter.CreateMinimalOverheadFilter() |
| + else: |
| + category_filter = tracing_category_filter.CreateDebugOverheadFilter() |
| # TODO(slamm): Move synthetic_delay_categories to the TBM options. |
| for delay in synthetic_delay_categories or []: |
| @@ -209,7 +225,8 @@ class TimelineBasedMeasurement(object): |
| for renderer_thread, interaction_records in ( |
| threads_to_records_map.iteritems()): |
| meta_metrics = _TimelineBasedMetrics( |
| - model, renderer_thread, interaction_records, _GetMetricFromMetricType) |
| + model, renderer_thread, interaction_records, |
| + self._tbm_options.get_metrics_from_metric_type_callback) |
| meta_metrics.AddResults(results) |
| def DidRunUserStory(self, tracing_controller): |