xref: /aosp_15_r20/external/perfetto/python/tools/slice_breakdown.py (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2021 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker#
4*6dbdd20aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker# You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker#
8*6dbdd20aSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker#
10*6dbdd20aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker# limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker""" Given a trace file, gives the self-time of userspace slices broken
16*6dbdd20aSAndroid Build Coastguard Workerdown by process, thread and thread state.
17*6dbdd20aSAndroid Build Coastguard Worker"""
18*6dbdd20aSAndroid Build Coastguard Worker
19*6dbdd20aSAndroid Build Coastguard Workerimport argparse
20*6dbdd20aSAndroid Build Coastguard Workerimport sys
21*6dbdd20aSAndroid Build Coastguard Workerimport os
22*6dbdd20aSAndroid Build Coastguard Worker
23*6dbdd20aSAndroid Build Coastguard WorkerPYTHON_DIR = os.path.join(
24*6dbdd20aSAndroid Build Coastguard Worker    os.path.dirname(
25*6dbdd20aSAndroid Build Coastguard Worker        os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), "python")
26*6dbdd20aSAndroid Build Coastguard Workersys.path.append(os.path.join(PYTHON_DIR))
27*6dbdd20aSAndroid Build Coastguard Worker
28*6dbdd20aSAndroid Build Coastguard Workerfrom perfetto.experimental.slice_breakdown import compute_breakdown
29*6dbdd20aSAndroid Build Coastguard Workerfrom perfetto.experimental.slice_breakdown import compute_breakdown_for_startup
30*6dbdd20aSAndroid Build Coastguard Workerfrom perfetto.trace_processor import TraceProcessor
31*6dbdd20aSAndroid Build Coastguard Workerfrom perfetto.trace_processor import TraceProcessorConfig
32*6dbdd20aSAndroid Build Coastguard Worker
33*6dbdd20aSAndroid Build Coastguard Worker
34*6dbdd20aSAndroid Build Coastguard Workerdef compute_breakdown_wrapper(args):
35*6dbdd20aSAndroid Build Coastguard Worker  config = TraceProcessorConfig(bin_path=args.shell_path, verbose=args.verbose)
36*6dbdd20aSAndroid Build Coastguard Worker  with TraceProcessor(trace=args.file, config=config) as tp:
37*6dbdd20aSAndroid Build Coastguard Worker    if args.startup_bounds:
38*6dbdd20aSAndroid Build Coastguard Worker      breakdown = compute_breakdown_for_startup(tp, args.startup_package,
39*6dbdd20aSAndroid Build Coastguard Worker                                                args.process_name)
40*6dbdd20aSAndroid Build Coastguard Worker    else:
41*6dbdd20aSAndroid Build Coastguard Worker      breakdown = compute_breakdown(tp, args.start_ts, args.end_ts,
42*6dbdd20aSAndroid Build Coastguard Worker                                    args.process_name)
43*6dbdd20aSAndroid Build Coastguard Worker  return breakdown
44*6dbdd20aSAndroid Build Coastguard Worker
45*6dbdd20aSAndroid Build Coastguard Worker
46*6dbdd20aSAndroid Build Coastguard Workerdef main():
47*6dbdd20aSAndroid Build Coastguard Worker  parser = argparse.ArgumentParser()
48*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--file', required=True)
49*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--shell-path', default=None)
50*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--start-ts', default=None)
51*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--end-ts', default=None)
52*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--startup-bounds', action='store_true', default=False)
53*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--startup-package', default=None)
54*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--process-name', default=None)
55*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--verbose', action='store_true', default=False)
56*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--out-csv', required=True)
57*6dbdd20aSAndroid Build Coastguard Worker  args = parser.parse_args()
58*6dbdd20aSAndroid Build Coastguard Worker
59*6dbdd20aSAndroid Build Coastguard Worker  if (args.start_ts or args.end_ts) and args.startup_bounds:
60*6dbdd20aSAndroid Build Coastguard Worker    print("Cannot specify --start-ts or --end-ts and --startup-bounds")
61*6dbdd20aSAndroid Build Coastguard Worker    return 1
62*6dbdd20aSAndroid Build Coastguard Worker
63*6dbdd20aSAndroid Build Coastguard Worker  if args.startup_package and not args.startup_bounds:
64*6dbdd20aSAndroid Build Coastguard Worker    print("Must specify --startup-bounds if --startup-package is specified")
65*6dbdd20aSAndroid Build Coastguard Worker    return 1
66*6dbdd20aSAndroid Build Coastguard Worker
67*6dbdd20aSAndroid Build Coastguard Worker  breakdown = compute_breakdown_wrapper(args)
68*6dbdd20aSAndroid Build Coastguard Worker
69*6dbdd20aSAndroid Build Coastguard Worker  if args.out_csv:
70*6dbdd20aSAndroid Build Coastguard Worker    diff_csv = breakdown.to_csv(index=False)
71*6dbdd20aSAndroid Build Coastguard Worker    if args.out_csv == '-':
72*6dbdd20aSAndroid Build Coastguard Worker      sys.stdout.write(diff_csv)
73*6dbdd20aSAndroid Build Coastguard Worker    else:
74*6dbdd20aSAndroid Build Coastguard Worker      with open(args.out_csv, 'w') as out:
75*6dbdd20aSAndroid Build Coastguard Worker        out.write(diff_csv)
76*6dbdd20aSAndroid Build Coastguard Worker
77*6dbdd20aSAndroid Build Coastguard Worker  return 0
78*6dbdd20aSAndroid Build Coastguard Worker
79*6dbdd20aSAndroid Build Coastguard Worker
80*6dbdd20aSAndroid Build Coastguard Workerif __name__ == '__main__':
81*6dbdd20aSAndroid Build Coastguard Worker  exit(main())
82