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