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