198 lines
5.8 KiB
Python
198 lines
5.8 KiB
Python
|
|
import sys
|
||
|
|
import os
|
||
|
|
from datetime import datetime
|
||
|
|
|
||
|
|
# Usage:
|
||
|
|
# python3 parse_timing.py logcat.txt "08-23 23:10:32.555" 10 200
|
||
|
|
#
|
||
|
|
# Description: extract events and timing in the log that start from timestamp "08-23 23:10:32.555"
|
||
|
|
# till 10 seconds
|
||
|
|
#
|
||
|
|
# Usage:
|
||
|
|
# python3 parse_timing.py logcat1.txt logcat2.txt 10 ts1 ts1 200
|
||
|
|
#
|
||
|
|
# Description: report the timing that the differences are bigger than 200
|
||
|
|
#
|
||
|
|
# Example:
|
||
|
|
# python3 log_processing/parse_timing.py 8976224/logcat.txt 8879724/logcat.txt
|
||
|
|
# "08-23 23:10:32.555" "07-29 06:39:06.254" 200
|
||
|
|
def main():
|
||
|
|
if len(sys.argv) == 5:
|
||
|
|
process_one_log()
|
||
|
|
elif len(sys.argv) == 6:
|
||
|
|
compair_two_log()
|
||
|
|
else:
|
||
|
|
print("wrong number of arguments")
|
||
|
|
|
||
|
|
def compair_two_log():
|
||
|
|
filepath1 = sys.argv[1]
|
||
|
|
print(filepath1)
|
||
|
|
if not os.path.isfile(filepath1):
|
||
|
|
print("File path {} does not exist. Exiting...".format(filepath1))
|
||
|
|
sys.exit()
|
||
|
|
|
||
|
|
filepath2 = sys.argv[2]
|
||
|
|
print(filepath2)
|
||
|
|
if not os.path.isfile(filepath2):
|
||
|
|
print("File path {} does not exist. Exiting...".format(filepath2))
|
||
|
|
sys.exit()
|
||
|
|
|
||
|
|
ts1 = datetime.strptime(sys.argv[3], '%m-%d %H:%M:%S.%f')
|
||
|
|
ts2 = datetime.strptime(sys.argv[4], '%m-%d %H:%M:%S.%f')
|
||
|
|
duration = float(sys.argv[5])*1000
|
||
|
|
|
||
|
|
# 1: took to complete 1000ms
|
||
|
|
# 2: took 33ms
|
||
|
|
# 3: took 33 ms or took 0.3 seconds
|
||
|
|
file1_events = [{}, {}, {}]
|
||
|
|
file2_events = [{}, {}, {}]
|
||
|
|
|
||
|
|
extract_events(filepath1, file1_events, ts1, duration)
|
||
|
|
extract_events(filepath2, file2_events, ts2, duration)
|
||
|
|
|
||
|
|
|
||
|
|
sum_events_timing(file1_events)
|
||
|
|
sum_events_timing(file2_events)
|
||
|
|
|
||
|
|
sum_all_events_timing_diff(file1_events, file2_events)
|
||
|
|
|
||
|
|
sys.exit()
|
||
|
|
|
||
|
|
|
||
|
|
def process_one_log():
|
||
|
|
filepath = sys.argv[1]
|
||
|
|
print(filepath)
|
||
|
|
if not os.path.isfile(filepath):
|
||
|
|
print("File path {} does not exist. Exiting...".format(filepath))
|
||
|
|
sys.exit()
|
||
|
|
|
||
|
|
# 1: took to complete 1000ms
|
||
|
|
# 2: took 33ms
|
||
|
|
# 3: took 33 ms or took 0.3 seconds
|
||
|
|
events = [{}, {}, {}]
|
||
|
|
ts = datetime.strptime(sys.argv[2], '%m-%d %H:%M:%S.%f')
|
||
|
|
duration = float(sys.argv[3])*1000
|
||
|
|
extract_events(filepath, events, ts, duration)
|
||
|
|
|
||
|
|
timing = float(sys.argv[3])
|
||
|
|
print_sorted_all_events(events, timing)
|
||
|
|
|
||
|
|
sys.exit()
|
||
|
|
|
||
|
|
def print_sorted_all_events(file_events, timing):
|
||
|
|
for i in range(len(file_events)):
|
||
|
|
print_sorted_events(file_events[i], timing)
|
||
|
|
|
||
|
|
def print_sorted_events(events, timing):
|
||
|
|
for word in sorted(events, key=events.get, reverse=True):
|
||
|
|
if (events[word]) > timing:
|
||
|
|
print("event:{} \ttiming:{} ".format(word, events[word]))
|
||
|
|
|
||
|
|
def sum_events_timing(events):
|
||
|
|
total_sum = 0;
|
||
|
|
for i in range(len(events)):
|
||
|
|
sum = 0
|
||
|
|
print("start summary for type {}".format(i))
|
||
|
|
for event in events[i]:
|
||
|
|
sum += events[i][event]
|
||
|
|
#print("event {} timing {} ".format(event, events[i][event]))
|
||
|
|
print("sum events type {} {} : timing {}".format(i, len(events), sum))
|
||
|
|
total_sum += sum
|
||
|
|
print("sum all type events timing {}\n".format(total_sum))
|
||
|
|
|
||
|
|
def sum_events_timing_diff(type, file1_events, file2_events):
|
||
|
|
sum_diff = 0
|
||
|
|
max_diff = 0
|
||
|
|
regression_events = {}
|
||
|
|
print("start summary for type {}".format(type))
|
||
|
|
for event in file1_events:
|
||
|
|
val = file2_events.get(event)
|
||
|
|
if val != None:
|
||
|
|
diff = file1_events[event] - val
|
||
|
|
if diff > 100 and val > 100:
|
||
|
|
# print("regression event {} \t{}: {} \t{}: {} \tdiff: {}"
|
||
|
|
# .format(event, "case1", file1_events[event], "case2", val, diff))
|
||
|
|
regression_events[event] = diff
|
||
|
|
sum_diff += diff
|
||
|
|
max_diff = max(max_diff, diff)
|
||
|
|
print("\nsummary for timing type {} sum_diff {} max_diff {}".format(type, sum_diff, max_diff))
|
||
|
|
print_events(regression_events, file1_events, file2_events)
|
||
|
|
|
||
|
|
def sum_all_events_timing_diff(file1_events, file2_events):
|
||
|
|
for i in range(len(file1_events)):
|
||
|
|
sum_events_timing_diff(i, file1_events[i], file2_events[i])
|
||
|
|
|
||
|
|
def print_events(events, file1_events, file2_events):
|
||
|
|
for word in sorted(events, key=events.get, reverse=True):
|
||
|
|
if (events[word]) > 10:
|
||
|
|
print("{} \tdiff {} \t{} \t{}".format(word, events[word],file1_events[word], file2_events[word]))
|
||
|
|
|
||
|
|
def find_took(words):
|
||
|
|
for i in range(len(words)):
|
||
|
|
if words[i] == 'took' or words[i] == "took:":
|
||
|
|
return i
|
||
|
|
|
||
|
|
def extract_time(line, events):
|
||
|
|
if not "took" in line:
|
||
|
|
return
|
||
|
|
|
||
|
|
# 1: took to complete 1000ms
|
||
|
|
# 2: took 33ms
|
||
|
|
# 3: took 33 ms or took 0.3 seconds
|
||
|
|
words = line.strip().split(' ')
|
||
|
|
i = find_took(words)
|
||
|
|
index = 0;
|
||
|
|
str1 = " "
|
||
|
|
key = str1.join(words[8:i])
|
||
|
|
|
||
|
|
if words[i+1] == 'to' and words[i+2] == 'complete:':
|
||
|
|
index = 0;
|
||
|
|
val = float(words[i+3][:-2]);
|
||
|
|
elif words[i+1][-2:] == 'ms':
|
||
|
|
index = 1
|
||
|
|
val = float(words[i+1][:-2]);
|
||
|
|
elif len(words) > i+2:
|
||
|
|
index = 2
|
||
|
|
if words[i+2] == 'seconds':
|
||
|
|
val = float(words[i+1])*1000;
|
||
|
|
elif words[i+2] == 'ms':
|
||
|
|
val = float(words[i+1])
|
||
|
|
else:
|
||
|
|
return True
|
||
|
|
|
||
|
|
# print("index: {} key: {} val: {}".format(index, key, val));
|
||
|
|
|
||
|
|
if events[index].get(key) == None:
|
||
|
|
events[index][key] = val
|
||
|
|
return True
|
||
|
|
else:
|
||
|
|
# print("duplicate key: " + key + " line: " + line)
|
||
|
|
return True
|
||
|
|
|
||
|
|
def check_time_range(line, ts, duration):
|
||
|
|
index = line.find(" ", 6)
|
||
|
|
if index <= 0:
|
||
|
|
return False
|
||
|
|
|
||
|
|
try:
|
||
|
|
current_time = datetime.strptime(line[:index], '%m-%d %H:%M:%S.%f')
|
||
|
|
except ValueError:
|
||
|
|
return False
|
||
|
|
|
||
|
|
deltatime = current_time - ts
|
||
|
|
if deltatime.total_seconds()*1000 < 0 or deltatime.total_seconds() > duration:
|
||
|
|
return False
|
||
|
|
return True
|
||
|
|
|
||
|
|
def extract_events(filepath, events, ts, duration):
|
||
|
|
with open(filepath, errors='ignore') as fp:
|
||
|
|
for line in fp:
|
||
|
|
if check_time_range(line, ts, duration) == False:
|
||
|
|
continue
|
||
|
|
if extract_time(line, events) == False:
|
||
|
|
return
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == '__main__':
|
||
|
|
main()
|