| #!/usr/bin/env python3 | 
 | # Copyright (C) 2020 The Android Open Source Project | 
 | # | 
 | # Licensed under the Apache License, Version 2.0 (the "License"); | 
 | # you may not use this file except in compliance with the License. | 
 | # You may obtain a copy of the License at | 
 | # | 
 | #      http://www.apache.org/licenses/LICENSE-2.0 | 
 | # | 
 | # Unless required by applicable law or agreed to in writing, software | 
 | # distributed under the License is distributed on an "AS IS" BASIS, | 
 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | # See the License for the specific language governing permissions and | 
 | # limitations under the License. | 
 |  | 
 | import argparse | 
 |  | 
 | from perfetto.trace_processor import TraceProcessor | 
 |  | 
 |  | 
 | def main(): | 
 |   # Parse arguments passed from command line | 
 |   parser = argparse.ArgumentParser() | 
 |   parser.add_argument( | 
 |       "-a", | 
 |       "--address", | 
 |       help="Address at which trace_processor is being run, e.g. localhost:9001", | 
 |       type=str) | 
 |   parser.add_argument( | 
 |       "-b", | 
 |       "--binary", | 
 |       help="Absolute path to a trace processor binary", | 
 |       type=str) | 
 |   parser.add_argument("-f", "--file", help="Absolute path to trace", type=str) | 
 |   args = parser.parse_args() | 
 |  | 
 |   # Pass arguments into api to construct the trace processor and load the trace | 
 |   if args.address is None and args.file is None: | 
 |     raise Exception("You must specify an address or a file path to trace") | 
 |   elif args.address is None: | 
 |     tp = TraceProcessor(file_path=args.file, bin_path=args.binary) | 
 |   elif args.file is None: | 
 |     tp = TraceProcessor(addr=args.address) | 
 |   else: | 
 |     tp = TraceProcessor( | 
 |         addr=args.address, file_path=args.file, bin_path=args.binary) | 
 |  | 
 |   # Iterate through QueryResultIterator | 
 |   res_it = tp.query('select * from slice limit 10') | 
 |   for row in res_it: | 
 |     print(row.name) | 
 |  | 
 |   # Convert QueryResultIterator into a pandas dataframe + iterate. This yields | 
 |   # the same results as the function above. | 
 |   try: | 
 |     res_df = tp.query('select * from slice limit 10').as_pandas_dataframe() | 
 |     for index, row in res_df.iterrows(): | 
 |       print(row['name']) | 
 |   except Exception: | 
 |     pass | 
 |  | 
 |   # Call another function on the loaded trace | 
 |   am_metrics = tp.metric(['android_mem']) | 
 |   tp.close() | 
 |  | 
 |  | 
 | if __name__ == "__main__": | 
 |   main() |