1*288bf522SAndroid Build Coastguard Workerimport sys 2*288bf522SAndroid Build Coastguard Workerimport os 3*288bf522SAndroid Build Coastguard Workerfrom datetime import datetime 4*288bf522SAndroid Build Coastguard Worker 5*288bf522SAndroid Build Coastguard Worker# Usage: 6*288bf522SAndroid Build Coastguard Worker# python3 parse_timing.py logcat.txt "08-23 23:10:32.555" 10 200 7*288bf522SAndroid Build Coastguard Worker# 8*288bf522SAndroid Build Coastguard Worker# Description: extract events and timing in the log that start from timestamp "08-23 23:10:32.555" 9*288bf522SAndroid Build Coastguard Worker# till 10 seconds 10*288bf522SAndroid Build Coastguard Worker# 11*288bf522SAndroid Build Coastguard Worker# Usage: 12*288bf522SAndroid Build Coastguard Worker# python3 parse_timing.py logcat1.txt logcat2.txt 10 ts1 ts1 200 13*288bf522SAndroid Build Coastguard Worker# 14*288bf522SAndroid Build Coastguard Worker# Description: report the timing that the differences are bigger than 200 15*288bf522SAndroid Build Coastguard Worker# 16*288bf522SAndroid Build Coastguard Worker# Example: 17*288bf522SAndroid Build Coastguard Worker# python3 log_processing/parse_timing.py 8976224/logcat.txt 8879724/logcat.txt 18*288bf522SAndroid Build Coastguard Worker# "08-23 23:10:32.555" "07-29 06:39:06.254" 200 19*288bf522SAndroid Build Coastguard Workerdef main(): 20*288bf522SAndroid Build Coastguard Worker if len(sys.argv) == 5: 21*288bf522SAndroid Build Coastguard Worker process_one_log() 22*288bf522SAndroid Build Coastguard Worker elif len(sys.argv) == 6: 23*288bf522SAndroid Build Coastguard Worker compair_two_log() 24*288bf522SAndroid Build Coastguard Worker else: 25*288bf522SAndroid Build Coastguard Worker print("wrong number of arguments") 26*288bf522SAndroid Build Coastguard Worker 27*288bf522SAndroid Build Coastguard Workerdef compair_two_log(): 28*288bf522SAndroid Build Coastguard Worker filepath1 = sys.argv[1] 29*288bf522SAndroid Build Coastguard Worker print(filepath1) 30*288bf522SAndroid Build Coastguard Worker if not os.path.isfile(filepath1): 31*288bf522SAndroid Build Coastguard Worker print("File path {} does not exist. Exiting...".format(filepath1)) 32*288bf522SAndroid Build Coastguard Worker sys.exit() 33*288bf522SAndroid Build Coastguard Worker 34*288bf522SAndroid Build Coastguard Worker filepath2 = sys.argv[2] 35*288bf522SAndroid Build Coastguard Worker print(filepath2) 36*288bf522SAndroid Build Coastguard Worker if not os.path.isfile(filepath2): 37*288bf522SAndroid Build Coastguard Worker print("File path {} does not exist. Exiting...".format(filepath2)) 38*288bf522SAndroid Build Coastguard Worker sys.exit() 39*288bf522SAndroid Build Coastguard Worker 40*288bf522SAndroid Build Coastguard Worker ts1 = datetime.strptime(sys.argv[3], '%m-%d %H:%M:%S.%f') 41*288bf522SAndroid Build Coastguard Worker ts2 = datetime.strptime(sys.argv[4], '%m-%d %H:%M:%S.%f') 42*288bf522SAndroid Build Coastguard Worker duration = float(sys.argv[5])*1000 43*288bf522SAndroid Build Coastguard Worker 44*288bf522SAndroid Build Coastguard Worker # 1: took to complete 1000ms 45*288bf522SAndroid Build Coastguard Worker # 2: took 33ms 46*288bf522SAndroid Build Coastguard Worker # 3: took 33 ms or took 0.3 seconds 47*288bf522SAndroid Build Coastguard Worker file1_events = [{}, {}, {}] 48*288bf522SAndroid Build Coastguard Worker file2_events = [{}, {}, {}] 49*288bf522SAndroid Build Coastguard Worker 50*288bf522SAndroid Build Coastguard Worker extract_events(filepath1, file1_events, ts1, duration) 51*288bf522SAndroid Build Coastguard Worker extract_events(filepath2, file2_events, ts2, duration) 52*288bf522SAndroid Build Coastguard Worker 53*288bf522SAndroid Build Coastguard Worker 54*288bf522SAndroid Build Coastguard Worker sum_events_timing(file1_events) 55*288bf522SAndroid Build Coastguard Worker sum_events_timing(file2_events) 56*288bf522SAndroid Build Coastguard Worker 57*288bf522SAndroid Build Coastguard Worker sum_all_events_timing_diff(file1_events, file2_events) 58*288bf522SAndroid Build Coastguard Worker 59*288bf522SAndroid Build Coastguard Worker sys.exit() 60*288bf522SAndroid Build Coastguard Worker 61*288bf522SAndroid Build Coastguard Worker 62*288bf522SAndroid Build Coastguard Workerdef process_one_log(): 63*288bf522SAndroid Build Coastguard Worker filepath = sys.argv[1] 64*288bf522SAndroid Build Coastguard Worker print(filepath) 65*288bf522SAndroid Build Coastguard Worker if not os.path.isfile(filepath): 66*288bf522SAndroid Build Coastguard Worker print("File path {} does not exist. Exiting...".format(filepath)) 67*288bf522SAndroid Build Coastguard Worker sys.exit() 68*288bf522SAndroid Build Coastguard Worker 69*288bf522SAndroid Build Coastguard Worker # 1: took to complete 1000ms 70*288bf522SAndroid Build Coastguard Worker # 2: took 33ms 71*288bf522SAndroid Build Coastguard Worker # 3: took 33 ms or took 0.3 seconds 72*288bf522SAndroid Build Coastguard Worker events = [{}, {}, {}] 73*288bf522SAndroid Build Coastguard Worker ts = datetime.strptime(sys.argv[2], '%m-%d %H:%M:%S.%f') 74*288bf522SAndroid Build Coastguard Worker duration = float(sys.argv[3])*1000 75*288bf522SAndroid Build Coastguard Worker extract_events(filepath, events, ts, duration) 76*288bf522SAndroid Build Coastguard Worker 77*288bf522SAndroid Build Coastguard Worker timing = float(sys.argv[3]) 78*288bf522SAndroid Build Coastguard Worker print_sorted_all_events(events, timing) 79*288bf522SAndroid Build Coastguard Worker 80*288bf522SAndroid Build Coastguard Worker sys.exit() 81*288bf522SAndroid Build Coastguard Worker 82*288bf522SAndroid Build Coastguard Workerdef print_sorted_all_events(file_events, timing): 83*288bf522SAndroid Build Coastguard Worker for i in range(len(file_events)): 84*288bf522SAndroid Build Coastguard Worker print_sorted_events(file_events[i], timing) 85*288bf522SAndroid Build Coastguard Worker 86*288bf522SAndroid Build Coastguard Workerdef print_sorted_events(events, timing): 87*288bf522SAndroid Build Coastguard Worker for word in sorted(events, key=events.get, reverse=True): 88*288bf522SAndroid Build Coastguard Worker if (events[word]) > timing: 89*288bf522SAndroid Build Coastguard Worker print("event:{} \ttiming:{} ".format(word, events[word])) 90*288bf522SAndroid Build Coastguard Worker 91*288bf522SAndroid Build Coastguard Workerdef sum_events_timing(events): 92*288bf522SAndroid Build Coastguard Worker total_sum = 0; 93*288bf522SAndroid Build Coastguard Worker for i in range(len(events)): 94*288bf522SAndroid Build Coastguard Worker sum = 0 95*288bf522SAndroid Build Coastguard Worker print("start summary for type {}".format(i)) 96*288bf522SAndroid Build Coastguard Worker for event in events[i]: 97*288bf522SAndroid Build Coastguard Worker sum += events[i][event] 98*288bf522SAndroid Build Coastguard Worker #print("event {} timing {} ".format(event, events[i][event])) 99*288bf522SAndroid Build Coastguard Worker print("sum events type {} {} : timing {}".format(i, len(events), sum)) 100*288bf522SAndroid Build Coastguard Worker total_sum += sum 101*288bf522SAndroid Build Coastguard Worker print("sum all type events timing {}\n".format(total_sum)) 102*288bf522SAndroid Build Coastguard Worker 103*288bf522SAndroid Build Coastguard Workerdef sum_events_timing_diff(type, file1_events, file2_events): 104*288bf522SAndroid Build Coastguard Worker sum_diff = 0 105*288bf522SAndroid Build Coastguard Worker max_diff = 0 106*288bf522SAndroid Build Coastguard Worker regression_events = {} 107*288bf522SAndroid Build Coastguard Worker print("start summary for type {}".format(type)) 108*288bf522SAndroid Build Coastguard Worker for event in file1_events: 109*288bf522SAndroid Build Coastguard Worker val = file2_events.get(event) 110*288bf522SAndroid Build Coastguard Worker if val != None: 111*288bf522SAndroid Build Coastguard Worker diff = file1_events[event] - val 112*288bf522SAndroid Build Coastguard Worker if diff > 100 and val > 100: 113*288bf522SAndroid Build Coastguard Worker # print("regression event {} \t{}: {} \t{}: {} \tdiff: {}" 114*288bf522SAndroid Build Coastguard Worker # .format(event, "case1", file1_events[event], "case2", val, diff)) 115*288bf522SAndroid Build Coastguard Worker regression_events[event] = diff 116*288bf522SAndroid Build Coastguard Worker sum_diff += diff 117*288bf522SAndroid Build Coastguard Worker max_diff = max(max_diff, diff) 118*288bf522SAndroid Build Coastguard Worker print("\nsummary for timing type {} sum_diff {} max_diff {}".format(type, sum_diff, max_diff)) 119*288bf522SAndroid Build Coastguard Worker print_events(regression_events, file1_events, file2_events) 120*288bf522SAndroid Build Coastguard Worker 121*288bf522SAndroid Build Coastguard Workerdef sum_all_events_timing_diff(file1_events, file2_events): 122*288bf522SAndroid Build Coastguard Worker for i in range(len(file1_events)): 123*288bf522SAndroid Build Coastguard Worker sum_events_timing_diff(i, file1_events[i], file2_events[i]) 124*288bf522SAndroid Build Coastguard Worker 125*288bf522SAndroid Build Coastguard Workerdef print_events(events, file1_events, file2_events): 126*288bf522SAndroid Build Coastguard Worker for word in sorted(events, key=events.get, reverse=True): 127*288bf522SAndroid Build Coastguard Worker if (events[word]) > 10: 128*288bf522SAndroid Build Coastguard Worker print("{} \tdiff {} \t{} \t{}".format(word, events[word],file1_events[word], file2_events[word])) 129*288bf522SAndroid Build Coastguard Worker 130*288bf522SAndroid Build Coastguard Workerdef find_took(words): 131*288bf522SAndroid Build Coastguard Worker for i in range(len(words)): 132*288bf522SAndroid Build Coastguard Worker if words[i] == 'took' or words[i] == "took:": 133*288bf522SAndroid Build Coastguard Worker return i 134*288bf522SAndroid Build Coastguard Worker 135*288bf522SAndroid Build Coastguard Workerdef extract_time(line, events): 136*288bf522SAndroid Build Coastguard Worker if not "took" in line: 137*288bf522SAndroid Build Coastguard Worker return 138*288bf522SAndroid Build Coastguard Worker 139*288bf522SAndroid Build Coastguard Worker # 1: took to complete 1000ms 140*288bf522SAndroid Build Coastguard Worker # 2: took 33ms 141*288bf522SAndroid Build Coastguard Worker # 3: took 33 ms or took 0.3 seconds 142*288bf522SAndroid Build Coastguard Worker words = line.strip().split(' ') 143*288bf522SAndroid Build Coastguard Worker i = find_took(words) 144*288bf522SAndroid Build Coastguard Worker index = 0; 145*288bf522SAndroid Build Coastguard Worker str1 = " " 146*288bf522SAndroid Build Coastguard Worker key = str1.join(words[8:i]) 147*288bf522SAndroid Build Coastguard Worker 148*288bf522SAndroid Build Coastguard Worker if words[i+1] == 'to' and words[i+2] == 'complete:': 149*288bf522SAndroid Build Coastguard Worker index = 0; 150*288bf522SAndroid Build Coastguard Worker val = float(words[i+3][:-2]); 151*288bf522SAndroid Build Coastguard Worker elif words[i+1][-2:] == 'ms': 152*288bf522SAndroid Build Coastguard Worker index = 1 153*288bf522SAndroid Build Coastguard Worker val = float(words[i+1][:-2]); 154*288bf522SAndroid Build Coastguard Worker elif len(words) > i+2: 155*288bf522SAndroid Build Coastguard Worker index = 2 156*288bf522SAndroid Build Coastguard Worker if words[i+2] == 'seconds': 157*288bf522SAndroid Build Coastguard Worker val = float(words[i+1])*1000; 158*288bf522SAndroid Build Coastguard Worker elif words[i+2] == 'ms': 159*288bf522SAndroid Build Coastguard Worker val = float(words[i+1]) 160*288bf522SAndroid Build Coastguard Worker else: 161*288bf522SAndroid Build Coastguard Worker return True 162*288bf522SAndroid Build Coastguard Worker 163*288bf522SAndroid Build Coastguard Worker # print("index: {} key: {} val: {}".format(index, key, val)); 164*288bf522SAndroid Build Coastguard Worker 165*288bf522SAndroid Build Coastguard Worker if events[index].get(key) == None: 166*288bf522SAndroid Build Coastguard Worker events[index][key] = val 167*288bf522SAndroid Build Coastguard Worker return True 168*288bf522SAndroid Build Coastguard Worker else: 169*288bf522SAndroid Build Coastguard Worker # print("duplicate key: " + key + " line: " + line) 170*288bf522SAndroid Build Coastguard Worker return True 171*288bf522SAndroid Build Coastguard Worker 172*288bf522SAndroid Build Coastguard Workerdef check_time_range(line, ts, duration): 173*288bf522SAndroid Build Coastguard Worker index = line.find(" ", 6) 174*288bf522SAndroid Build Coastguard Worker if index <= 0: 175*288bf522SAndroid Build Coastguard Worker return False 176*288bf522SAndroid Build Coastguard Worker 177*288bf522SAndroid Build Coastguard Worker try: 178*288bf522SAndroid Build Coastguard Worker current_time = datetime.strptime(line[:index], '%m-%d %H:%M:%S.%f') 179*288bf522SAndroid Build Coastguard Worker except ValueError: 180*288bf522SAndroid Build Coastguard Worker return False 181*288bf522SAndroid Build Coastguard Worker 182*288bf522SAndroid Build Coastguard Worker deltatime = current_time - ts 183*288bf522SAndroid Build Coastguard Worker if deltatime.total_seconds()*1000 < 0 or deltatime.total_seconds() > duration: 184*288bf522SAndroid Build Coastguard Worker return False 185*288bf522SAndroid Build Coastguard Worker return True 186*288bf522SAndroid Build Coastguard Worker 187*288bf522SAndroid Build Coastguard Workerdef extract_events(filepath, events, ts, duration): 188*288bf522SAndroid Build Coastguard Worker with open(filepath, errors='ignore') as fp: 189*288bf522SAndroid Build Coastguard Worker for line in fp: 190*288bf522SAndroid Build Coastguard Worker if check_time_range(line, ts, duration) == False: 191*288bf522SAndroid Build Coastguard Worker continue 192*288bf522SAndroid Build Coastguard Worker if extract_time(line, events) == False: 193*288bf522SAndroid Build Coastguard Worker return 194*288bf522SAndroid Build Coastguard Worker 195*288bf522SAndroid Build Coastguard Worker 196*288bf522SAndroid Build Coastguard Workerif __name__ == '__main__': 197*288bf522SAndroid Build Coastguard Worker main() 198