mirror of https://github.com/ivanch/tcc.git
173 lines
5.1 KiB
Python
173 lines
5.1 KiB
Python
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
from common import API_REQUESTS, FRAMEWORKS
|
|
from pylab import plot, show, savefig, xlim, figure, \
|
|
ylim, legend, boxplot, setp, axes
|
|
|
|
FRAMEWORKS_COLORS = [c for _, _, c in FRAMEWORKS]
|
|
FRAMEWORKS = [f for f, _, _ in FRAMEWORKS]
|
|
|
|
def setBoxColors(bp):
|
|
for i, box in enumerate(bp['boxes']):
|
|
box.set(color=FRAMEWORKS_COLORS[i])
|
|
for i, median in enumerate(bp['medians']):
|
|
# median.set(color=FRAMEWORKS_COLORS[i])
|
|
median.set(color='white')
|
|
|
|
for i in range(len(FRAMEWORKS)):
|
|
bp['whiskers'][i*2].set(color=FRAMEWORKS_COLORS[i])
|
|
bp['whiskers'][i*2 + 1].set(color=FRAMEWORKS_COLORS[i])
|
|
for i in range(len(FRAMEWORKS)):
|
|
bp['caps'][i*2].set(color=FRAMEWORKS_COLORS[i])
|
|
bp['caps'][i*2 + 1].set(color=FRAMEWORKS_COLORS[i])
|
|
|
|
|
|
def plot_graph(x_data, y_data, title, x_label, y_label, filename, y_lim = None):
|
|
old_x_data = x_data
|
|
old_y_data = y_data
|
|
|
|
x_data = []
|
|
y_data = []
|
|
|
|
for i in range(len(old_x_data)):
|
|
if old_x_data[i] not in x_data:
|
|
x_data.append(old_x_data[i])
|
|
y_data.append([])
|
|
for f in range(len(FRAMEWORKS)):
|
|
y_data[-1].append([])
|
|
|
|
for f in range(len(FRAMEWORKS)):
|
|
y_data[-1][f].append(old_y_data[f][i])
|
|
|
|
fig = figure()
|
|
ax = axes()
|
|
|
|
all_positions = []
|
|
|
|
print(filename)
|
|
# print(y_data)
|
|
for j in range(len(x_data)):
|
|
positions = [len(FRAMEWORKS)*j + i + 2*j for i in range(len(FRAMEWORKS))]
|
|
|
|
bp = boxplot(y_data[j], positions = positions, widths = 0.6, showfliers=False,
|
|
patch_artist=True)
|
|
all_positions.append(positions)
|
|
setBoxColors(bp)
|
|
|
|
for i in range(len(FRAMEWORKS)):
|
|
medians = []
|
|
for j in range(len(x_data)):
|
|
medians.append(np.median(y_data[j][i]))
|
|
|
|
positions = [all_positions[x][i] for x in range(len(x_data))]
|
|
plt.plot(positions, medians, color=FRAMEWORKS_COLORS[i], marker='.', linestyle='--', linewidth=0.3)
|
|
|
|
avg_positions = []
|
|
for positions in all_positions:
|
|
avg = np.average(positions)
|
|
avg_positions.append(avg)
|
|
|
|
ax.set_xticks(avg_positions)
|
|
ax.set_xticklabels([str(x) for x in x_data])
|
|
|
|
plt.title(title)
|
|
plt.xlabel(x_label)
|
|
plt.ylabel(y_label)
|
|
|
|
if y_lim:
|
|
plt.ylim(y_lim)
|
|
|
|
if filename.startswith('req'):
|
|
for i, framework in enumerate(FRAMEWORKS):
|
|
h, = plt.plot([], c=FRAMEWORKS_COLORS[i], label=framework, marker='.', linestyle='--')
|
|
# h.set_visible(False)
|
|
|
|
plt.legend()
|
|
|
|
plt.tight_layout()
|
|
plt.savefig(f'{filename}.png')
|
|
|
|
plt.clf()
|
|
plt.close('all')
|
|
|
|
def get_data(filename):
|
|
lines = []
|
|
with open(filename, 'r') as f:
|
|
lines = f.readlines()
|
|
|
|
x = []
|
|
y = []
|
|
for line in lines:
|
|
line = line.strip().split(',')
|
|
if line:
|
|
x.append(int(line[0]))
|
|
y.append(float(line[1]))
|
|
|
|
return x, y
|
|
|
|
def get_resource_data(filename):
|
|
lines = []
|
|
with open(filename, 'r') as f:
|
|
lines = f.readlines()
|
|
|
|
x = []
|
|
y = []
|
|
for line in lines:
|
|
line = line.strip().split(',')
|
|
if line:
|
|
r = [round(float(line[1])*100), round(float(line[2])*100)]
|
|
if r[0] > 100:
|
|
r[0] = 100
|
|
|
|
if r[1] > 100:
|
|
r[1] = 100
|
|
|
|
x.append(int(line[0])) # requests
|
|
y.append(r) # cpu, ram
|
|
|
|
return x, y
|
|
|
|
def generate_req_graph(filename, framework_name, endpoint_name):
|
|
x, _ = get_data(filename)
|
|
y = []
|
|
|
|
for f in FRAMEWORKS:
|
|
newfile = filename.replace(framework_name, f)
|
|
_, y_data = get_data(newfile)
|
|
|
|
y.append(y_data)
|
|
|
|
graph_file = f'req_{endpoint_name.replace("/", "").replace("?", "")}'
|
|
plot_graph(x, y, f'Requisições atendidas por segundo - {endpoint_name}', 'Número de requisições', 'Requisições/segundo', graph_file)
|
|
|
|
def generate_resource_graph(filename, framework_name, endpoint_name):
|
|
x, _ = get_resource_data(filename)
|
|
|
|
for resource_index, resource in enumerate(['cpu', 'ram']):
|
|
y = []
|
|
|
|
for f in FRAMEWORKS:
|
|
newfile = filename.replace(framework_name, f)
|
|
_, y_data = get_resource_data(newfile)
|
|
y.append([data[resource_index] for data in y_data])
|
|
|
|
graph_file = f'{resource}_{endpoint_name.replace("/", "").replace("?", "")}'
|
|
plot_graph(x, y, f'Uso de {resource.upper()} - {endpoint_name}', 'Número de requisições', f'Uso de {resource.upper()} (%)', graph_file)
|
|
|
|
if __name__ == '__main__':
|
|
endpoints = [config[0] for config in API_REQUESTS]
|
|
|
|
for endpoint_name in endpoints:
|
|
framework_name = 'ASP.NET'
|
|
endpoint_file = endpoint_name.replace('/', '')
|
|
|
|
endpoint_name = '/' + endpoint_name.split('/')[-1]
|
|
|
|
filename = f'data/resource_ASP.NET_{endpoint_file}.csv'
|
|
filename = filename.replace("?", "_")
|
|
generate_resource_graph(filename, framework_name, endpoint_name)
|
|
|
|
filename = f'data/req_ASP.NET_{endpoint_file}.csv'
|
|
filename = filename.replace("?", "_")
|
|
generate_req_graph(filename, framework_name, endpoint_name)
|