trace_profiler.py revision 33259e44c8229f70ffe0cf3bb5ca9375c4feb2f9
1# Copyright 2013 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import os
6import StringIO
7import zipfile
8
9from telemetry.internal.platform import profiler
10from telemetry.timeline import chrome_trace_category_filter
11from telemetry.timeline import trace_data as trace_data_module
12from telemetry.timeline import tracing_config
13
14
15class TraceProfiler(profiler.Profiler):
16
17  def __init__(self, browser_backend, platform_backend, output_path, state,
18               categories=None):
19    super(TraceProfiler, self).__init__(
20        browser_backend, platform_backend, output_path, state)
21    assert self._browser_backend.supports_tracing
22    # We always want flow events when tracing via telemetry.
23    categories_with_flow = 'disabled-by-default-toplevel.flow'
24    if categories:
25      categories_with_flow += ',%s' % categories
26    config = tracing_config.TracingConfig()
27    config.enable_chrome_trace = True
28    config.chrome_trace_config.SetCategoryFilter(
29        chrome_trace_category_filter.ChromeTraceCategoryFilter(
30            categories_with_flow))
31    self._browser_backend.StartTracing(config, timeout=10)
32
33  @classmethod
34  def name(cls):
35    return 'trace'
36
37  @classmethod
38  def is_supported(cls, browser_type):
39    return True
40
41  def CollectProfile(self):
42    print 'Processing trace...'
43
44    trace_result_builder = trace_data_module.TraceDataBuilder()
45    self._browser_backend.StopTracing()
46    self._browser_backend.CollectTracingData(trace_result_builder)
47    trace_result = trace_result_builder.AsData()
48
49    trace_file = '%s.zip' % self._output_path
50
51    with zipfile.ZipFile(trace_file, 'w', zipfile.ZIP_DEFLATED) as z:
52      trace_data = StringIO.StringIO()
53      trace_result.Serialize(trace_data)
54      trace_name = '%s.json' % os.path.basename(self._output_path)
55      z.writestr(trace_name, trace_data.getvalue())
56
57    print 'Trace saved as %s' % trace_file
58    print 'To view, open in chrome://tracing'
59
60    return [trace_file]
61
62
63class TraceDetailedProfiler(TraceProfiler):
64
65  def __init__(self, browser_backend, platform_backend, output_path, state):
66    super(TraceDetailedProfiler, self).__init__(
67        browser_backend, platform_backend, output_path, state,
68        categories='disabled-by-default-cc.debug*')
69
70  @classmethod
71  def name(cls):
72    return 'trace-detailed'
73
74
75class TraceAllProfiler(TraceProfiler):
76
77  def __init__(self, browser_backend, platform_backend, output_path, state):
78    super(TraceAllProfiler, self).__init__(
79        browser_backend, platform_backend, output_path, state,
80        categories='disabled-by-default-*')
81
82  @classmethod
83  def name(cls):
84    return 'trace-all'
85