Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Side by Side Diff: tools/telemetry/telemetry/web_perf/timeline_based_measurement.py

Issue 789363002: TimelineBasedMeasurement(object) instead of TimelineBasedMeasurement(page_test.PageTest) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update docs. Add PageTest guards. Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # Copyright 2014 The Chromium Authors. All rights reserved. 1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 from collections import defaultdict 5 from collections import defaultdict
6 6
7 from telemetry.core.platform import tracing_category_filter 7 from telemetry.core.platform import tracing_category_filter
8 from telemetry.core.platform import tracing_options 8 from telemetry.core.platform import tracing_options
9 from telemetry.page import page_test 9 from telemetry.page import page_test
10 from telemetry.timeline import model as model_module 10 from telemetry.timeline import model as model_module
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 if not interactions_with_metric: 104 if not interactions_with_metric:
105 continue 105 continue
106 if len(interactions_with_metric) != len(interactions): 106 if len(interactions_with_metric) != len(interactions):
107 raise InvalidInteractions('Interaction records with the same logical ' 107 raise InvalidInteractions('Interaction records with the same logical '
108 'name must have the same flags.') 108 'name must have the same flags.')
109 metric = self._get_metric_from_metric_type_callback(metric_type) 109 metric = self._get_metric_from_metric_type_callback(metric_type)
110 metric.AddResults(self._model, self._renderer_thread, 110 metric.AddResults(self._model, self._renderer_thread,
111 interactions, wrapped_results) 111 interactions, wrapped_results)
112 112
113 113
114 class TimelineBasedMeasurement(page_test.PageTest): 114 class Options(object):
115 """Collects multiple metrics pages based on their interaction records. 115 """A class to be used to configure TimelineBasedMeasurement.
116 116
117 A timeline measurement shifts the burden of what metrics to collect onto the 117 This is created and returned by
118 page under test, or the pageset running that page. Instead of the measurement 118 Benchmark.CreateTimelineBasedMeasurementOptions.
119 having a fixed set of values it collects about the page, the page being tested 119 """
120
121 def __init__(self, overhead_level=NO_OVERHEAD_LEVEL):
122 """Save the overhead level.
123
124 As the amount of instrumentation increases, so does the overhead.
125 The user of the measurement chooses the overhead level that is appropriate,
126 and the tracing is filtered accordingly.
127
128 overhead_level: one of NO_OVERHEAD_LEVEL, V8_OVERHEAD_LEVEL,
129 MINIMAL_OVERHEAD_LEVEL, or DEBUG_OVERHEAD_LEVEL.
130 The v8 overhead level is a temporary solution that may be removed.
131 """
132 self._overhead_level = overhead_level
133
134
135 class TimelineBasedMeasurement(object):
136 """Collects multiple metrics based on their interaction records.
137
138 A timeline based measurement shifts the burden of what metrics to collect onto
139 the user story under test. Instead of the measurement
140 having a fixed set of values it collects, the user story being tested
120 issues (via javascript) an Interaction record into the user timing API that 141 issues (via javascript) an Interaction record into the user timing API that
121 describing what the page is doing at that time, as well as a standardized set 142 describing what is happening at that time, as well as a standardized set
122 of flags describing the semantics of the work being done. The 143 of flags describing the semantics of the work being done. The
123 TimelineBasedMeasurement object collects a trace that includes both these 144 TimelineBasedMeasurement object collects a trace that includes both these
124 interaction recorsd, and a user-chosen amount of performance data using 145 interaction records, and a user-chosen amount of performance data using
125 Telemetry's various timeline-producing APIs, tracing especially. 146 Telemetry's various timeline-producing APIs, tracing especially.
126 147
127 It then passes the recorded timeline to different TimelineBasedMetrics based 148 It then passes the recorded timeline to different TimelineBasedMetrics based
128 on those flags. This allows a single run through a page to produce load timing 149 on those flags. As an example, this allows a single user story run to produce
129 data, smoothness data, critical jank information and overall cpu usage 150 load timing data, smoothness data, critical jank information and overall cpu
130 information. 151 usage information.
131 152
132 For information on how to mark up a page to work with 153 For information on how to mark up a page to work with
133 TimelineBasedMeasurement, refer to the 154 TimelineBasedMeasurement, refer to the
134 perf.metrics.timeline_interaction_record module. 155 perf.metrics.timeline_interaction_record module.
156 """
157 def __init__(self, options):
158 self._overhead_level = options._overhead_level
135 159
136 """ 160 def StartTracing(self, app, synthetic_delay_categories=None):
nednguyen 2014/12/19 01:16:21 s/StartTracing/WillRunTest also s/StopTracing/DidR
slamm 2015/01/02 23:47:20 Done.
137 def __init__(self, overhead_level=NO_OVERHEAD_LEVEL): 161 """Configure and start tracing.
138 super(TimelineBasedMeasurement, self).__init__('RunPageInteractions')
139 self._overhead_level = overhead_level
140 162
141 def WillNavigateToPage(self, page, tab): 163 Args:
142 if not tab.browser.platform.tracing_controller.IsChromeTracingSupported( 164 app: an app.App subclass instance.
143 tab.browser): 165 synthetic_delay_categories: iterable of delays. For example:
166 ['DELAY(cc.BeginMainFrame;0.014;alternating)']
167 where 'cc.BeginMainFrame' is a timeline event, 0.014 is the delay,
168 and 'alternating' is the mode.
169 """
170 if not app.platform.tracing_controller.IsChromeTracingSupported(app):
144 raise Exception('Not supported') 171 raise Exception('Not supported')
145 172
146 assert self._overhead_level in ALL_OVERHEAD_LEVELS 173 assert self._overhead_level in ALL_OVERHEAD_LEVELS
147 if self._overhead_level == NO_OVERHEAD_LEVEL: 174 if self._overhead_level == NO_OVERHEAD_LEVEL:
148 category_filter = tracing_category_filter.CreateNoOverheadFilter() 175 category_filter = tracing_category_filter.CreateNoOverheadFilter()
149 # TODO(ernstm): Remove this overhead level when benchmark relevant v8 events 176 # TODO(ernstm): Remove this overhead level when benchmark relevant v8 events
150 # become available in the 'benchmark' category. 177 # become available in the 'benchmark' category.
151 elif self._overhead_level == V8_OVERHEAD_LEVEL: 178 elif self._overhead_level == V8_OVERHEAD_LEVEL:
152 category_filter = tracing_category_filter.CreateNoOverheadFilter() 179 category_filter = tracing_category_filter.CreateNoOverheadFilter()
153 category_filter.AddIncludedCategory('v8') 180 category_filter.AddIncludedCategory('v8')
154 elif self._overhead_level == MINIMAL_OVERHEAD_LEVEL: 181 elif self._overhead_level == MINIMAL_OVERHEAD_LEVEL:
155 category_filter = tracing_category_filter.CreateMinimalOverheadFilter() 182 category_filter = tracing_category_filter.CreateMinimalOverheadFilter()
156 else: 183 else:
157 category_filter = tracing_category_filter.CreateDebugOverheadFilter() 184 category_filter = tracing_category_filter.CreateDebugOverheadFilter()
158 185
159 for delay in page.GetSyntheticDelayCategories(): 186 # TODO(slamm): Move synthetic_delay_categories to the TBM options.
187 for delay in synthetic_delay_categories or []:
160 category_filter.AddSyntheticDelay(delay) 188 category_filter.AddSyntheticDelay(delay)
161 options = tracing_options.TracingOptions() 189 options = tracing_options.TracingOptions()
162 options.enable_chrome_trace = True 190 options.enable_chrome_trace = True
163 tab.browser.platform.tracing_controller.Start(options, category_filter) 191 app.platform.tracing_controller.Start(options, category_filter)
164 192
165 def ValidateAndMeasurePage(self, page, tab, results): 193 def Measure(self, app, renderer_thread_tab_id, results):
166 """ Collect all possible metrics and added them to results. """ 194 """Collect all possible metrics and added them to results."""
167 trace_result = tab.browser.platform.tracing_controller.Stop() 195 trace_result = app.platform.tracing_controller.Stop()
168 results.AddValue(trace.TraceValue(results.current_page, trace_result)) 196 results.AddValue(trace.TraceValue(results.current_page, trace_result))
169 model = model_module.TimelineModel(trace_result) 197 model = model_module.TimelineModel(trace_result)
170 renderer_thread = model.GetRendererThreadFromTabId(tab.id) 198 renderer_thread = model.GetRendererThreadFromTabId(renderer_thread_tab_id)
171 meta_metrics = _TimelineBasedMetrics( 199 meta_metrics = _TimelineBasedMetrics(
172 model, renderer_thread, _GetMetricFromMetricType) 200 model, renderer_thread, _GetMetricFromMetricType)
173 meta_metrics.AddResults(results) 201 meta_metrics.AddResults(results)
174 202
203 def StopTracing(self, app):
204 if app.platform.tracing_controller.is_tracing_running:
205 app.platform.tracing_controller.Stop()
206
207
208 class TimelineBasedPageTest(page_test.PageTest):
209 """Page test that collects metrics with TimelineBasedMeasurement."""
210 def __init__(self, tbm):
211 super(TimelineBasedPageTest, self).__init__('RunPageInteractions')
212 self._measurement = tbm
213
214 @property
215 def measurement(self):
216 return self._measurement
217
218 def WillNavigateToPage(self, page, tab):
219 self._measurement.StartTracing(
220 tab.browser, page.GetSyntheticDelayCategories())
221
222 def ValidateAndMeasurePage(self, page, tab, results):
223 """Collect all possible metrics and added them to results."""
224 self._measurement.Measure(tab.browser, tab.id, results)
175 225
176 def CleanUpAfterPage(self, page, tab): 226 def CleanUpAfterPage(self, page, tab):
177 if tab.browser.platform.tracing_controller.is_tracing_running: 227 self._measurement.StopTracing(tab.browser)
178 tab.browser.platform.tracing_controller.Stop()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698