DSPS/Profiler/Converter/main.py

95 lines
3.5 KiB
Python
Raw Normal View History

2021-09-02 10:27:53 +00:00
import os
import json
import argparse
import plotly.express as px
from Converter.CallTreeBuilder import *
from Converter.ProfileBuilder import *
from Converter.GraphVis import *
def saveJSON(path, data):
with open(path, 'w') as profileF:
json.dump(data, profileF)
def gantPlotChild(root):
lst = []
for child in sorted(root.children, key=lambda x: x.start):
lst.append(dict(Task=child.id, Start=pd.to_datetime(child.start), Finish=pd.to_datetime(child.end)))
for child in sorted(child.children, key=lambda x: x.start):
lst.append(dict(Task=child.id, Start=pd.to_datetime(child.start), Finish=pd.to_datetime(child.end)))
for child in sorted(child.children, key=lambda x: x.start):
lst.append(dict(Task=child.id, Start=pd.to_datetime(child.start), Finish=pd.to_datetime(child.end)))
df = pd.DataFrame(lst)
fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task")
#fig.update_yaxes(autorange="reversed") # otherwise tasks are listed from the bottom up
fig.show()
def main():
# handle user input and build paths
parser = argparse.ArgumentParser(description='program name, path to util log, path to network log')
parser.add_argument('-cl', type=str, help='name of the programm running exp: java.exe', required=True)
parser.add_argument('-l', type=str, help='relativ path of input util log', required=True)
parser.add_argument('-n', type=str, help='relativ path of input network log', required=True)
parser.add_argument('-op', type=str, help='relativ path to output folder', default="./files")
parser.add_argument('-d', type=int, help='depth', default=3)
args = parser.parse_args()
callLogPath = os.path.join(os.path.dirname(__file__), args.cl)
utilLogPath = os.path.join(os.path.dirname(__file__), args.l)
netLogPath = os.path.join(os.path.dirname(__file__), args.n)
depth = args.d
profilePath = os.path.join(os.path.dirname(__file__), args.op + "/profile.json")
mappingPath = os.path.join(os.path.dirname(__file__), args.op + "/mapping.json")
servicePath = os.path.join(os.path.dirname(__file__), args.op + "/services.json")
# start actual work
print("Building Call Tree")
root = convert(callLogPath)
reduceRoots(root, callLogPath)
print("Truncating Tree to specified depth")
truncateTree(root, 0.1 * 1E9, steps=depth)
print("Merging async interactions")
mergeAsyncInteractions(root)
print("Validating Tree")
validateTree(root)
print("Creating Profile")
profile = createProfile(root, "name", utilLogPath, netLogPath)
print("Creating Default Mapping")
mapping = genMapping(profile, netLogPath)
print("Creating Default Service Definition")
services = genServices(netLogPath)
# save results
saveJSON(profilePath, profile)
saveJSON(mappingPath, mapping)
saveJSON(servicePath, services)
print("Interactions: ")
for i, child1 in enumerate(sorted(root.children, key=lambda x: x.start)):
print(i, child1.id, "\n ", pd.to_datetime(child1.end - child1.start, unit='ns'))
if child1.children:
total = 0
for child in child1.children:
total += child.end - child.start
print(" ",total, "\n", pd.to_datetime(max(child1.children, key=lambda x: x.end).end - min(child1.children, key=lambda x: x.start).start, unit='ns'))
else:
print("")
# plotting
markAsync(root)
print("Creating Tree Visualization")
draw(root)
gantPlotChild(root)
if __name__ == "__main__":
main()