xref: /aosp_15_r20/external/perfetto/python/example.py (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2020 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
16*6dbdd20aSAndroid Build Coastguard Workerimport argparse
17*6dbdd20aSAndroid Build Coastguard Worker
18*6dbdd20aSAndroid Build Coastguard Workerfrom perfetto.trace_processor import TraceProcessor, TraceProcessorConfig
19*6dbdd20aSAndroid Build Coastguard Worker
20*6dbdd20aSAndroid Build Coastguard Worker
21*6dbdd20aSAndroid Build Coastguard Workerdef main():
22*6dbdd20aSAndroid Build Coastguard Worker  # Parse arguments passed from command line
23*6dbdd20aSAndroid Build Coastguard Worker  parser = argparse.ArgumentParser()
24*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument(
25*6dbdd20aSAndroid Build Coastguard Worker      "-a",
26*6dbdd20aSAndroid Build Coastguard Worker      "--address",
27*6dbdd20aSAndroid Build Coastguard Worker      help="Address at which trace_processor is being run, e.g. localhost:9001",
28*6dbdd20aSAndroid Build Coastguard Worker      type=str)
29*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument(
30*6dbdd20aSAndroid Build Coastguard Worker      "-b",
31*6dbdd20aSAndroid Build Coastguard Worker      "--binary",
32*6dbdd20aSAndroid Build Coastguard Worker      help="Absolute path to a trace processor binary",
33*6dbdd20aSAndroid Build Coastguard Worker      type=str)
34*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument("-f", "--file", help="Absolute path to trace", type=str)
35*6dbdd20aSAndroid Build Coastguard Worker  args = parser.parse_args()
36*6dbdd20aSAndroid Build Coastguard Worker
37*6dbdd20aSAndroid Build Coastguard Worker  config = TraceProcessorConfig(bin_path=args.binary)
38*6dbdd20aSAndroid Build Coastguard Worker
39*6dbdd20aSAndroid Build Coastguard Worker  # Pass arguments into api to construct the trace processor and load the trace
40*6dbdd20aSAndroid Build Coastguard Worker  if args.address is None and args.file is None:
41*6dbdd20aSAndroid Build Coastguard Worker    raise Exception("You must specify an address or a file path to trace")
42*6dbdd20aSAndroid Build Coastguard Worker  elif args.address is None:
43*6dbdd20aSAndroid Build Coastguard Worker    tp = TraceProcessor(trace=args.file, config=config)
44*6dbdd20aSAndroid Build Coastguard Worker  elif args.file is None:
45*6dbdd20aSAndroid Build Coastguard Worker    tp = TraceProcessor(addr=args.address, config=config)
46*6dbdd20aSAndroid Build Coastguard Worker  else:
47*6dbdd20aSAndroid Build Coastguard Worker    tp = TraceProcessor(trace=args.file, addr=args.address, config=config)
48*6dbdd20aSAndroid Build Coastguard Worker
49*6dbdd20aSAndroid Build Coastguard Worker  # Iterate through QueryResultIterator
50*6dbdd20aSAndroid Build Coastguard Worker  res_it = tp.query('select * from slice limit 10')
51*6dbdd20aSAndroid Build Coastguard Worker  for row in res_it:
52*6dbdd20aSAndroid Build Coastguard Worker    print(row.name)
53*6dbdd20aSAndroid Build Coastguard Worker
54*6dbdd20aSAndroid Build Coastguard Worker  # Convert QueryResultIterator into a pandas dataframe + iterate. This yields
55*6dbdd20aSAndroid Build Coastguard Worker  # the same results as the function above.
56*6dbdd20aSAndroid Build Coastguard Worker  try:
57*6dbdd20aSAndroid Build Coastguard Worker    res_df = tp.query('select * from slice limit 10').as_pandas_dataframe()
58*6dbdd20aSAndroid Build Coastguard Worker    for index, row in res_df.iterrows():
59*6dbdd20aSAndroid Build Coastguard Worker      print(row['name'])
60*6dbdd20aSAndroid Build Coastguard Worker  except Exception:
61*6dbdd20aSAndroid Build Coastguard Worker    pass
62*6dbdd20aSAndroid Build Coastguard Worker
63*6dbdd20aSAndroid Build Coastguard Worker  # Call another function on the loaded trace
64*6dbdd20aSAndroid Build Coastguard Worker  am_metrics = tp.metric(['android_mem'])
65*6dbdd20aSAndroid Build Coastguard Worker  tp.close()
66*6dbdd20aSAndroid Build Coastguard Worker
67*6dbdd20aSAndroid Build Coastguard Worker
68*6dbdd20aSAndroid Build Coastguard Workerif __name__ == "__main__":
69*6dbdd20aSAndroid Build Coastguard Worker  main()
70