xref: /aosp_15_r20/system/extras/perf_tools/parse_timing.py (revision 288bf5226967eb3dac5cce6c939ccc2a7f2b4fe5)
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