aboutsummaryrefslogtreecommitdiffstats
path: root/resources/tools/presentation/generator_plots.py
diff options
context:
space:
mode:
authorTibor Frank <tifrank@cisco.com>2020-02-07 14:07:07 +0100
committerTibor Frank <tifrank@cisco.com>2020-02-10 11:50:49 +0100
commitc1335b81c08aeeb5d45af39d45ce02dc1a7d4235 (patch)
tree04c014b69fed9defb1362abb2556c074255da676 /resources/tools/presentation/generator_plots.py
parent8605f3f406468f57bb9b2eac12a4421f65965300 (diff)
PAL: Latency by percentile
Change-Id: I413271f4b1fad801463fb7f8f16112aedc0d058b Signed-off-by: Tibor Frank <tifrank@cisco.com>
Diffstat (limited to 'resources/tools/presentation/generator_plots.py')
-rw-r--r--resources/tools/presentation/generator_plots.py123
1 files changed, 61 insertions, 62 deletions
diff --git a/resources/tools/presentation/generator_plots.py b/resources/tools/presentation/generator_plots.py
index 729c2cc72c..285e7ab51d 100644
--- a/resources/tools/presentation/generator_plots.py
+++ b/resources/tools/presentation/generator_plots.py
@@ -40,7 +40,7 @@ COLORS = [u"SkyBlue", u"Olive", u"Purple", u"Coral", u"Indigo", u"Pink",
u"LightGreen", u"LightSeaGreen", u"LightSkyBlue", u"Maroon",
u"MediumSeaGreen", u"SeaGreen", u"LightSlateGrey"]
-REGEX_NIC = re.compile(r'\d*ge\dp\d\D*\d*-')
+REGEX_NIC = re.compile(r'(\d*ge\dp\d\D*\d*)-')
def generate_plots(spec, data):
@@ -199,9 +199,17 @@ def plot_hdrh_lat_by_percentile(plot, input_data):
f" Creating the data set for the {plot.get(u'type', u'')} "
f"{plot.get(u'title', u'')}."
)
- data = input_data.filter_tests_by_name(
- plot, params=[u"latency", u"throughput", u"parent", u"tags", u"type"])
- if data is None or len(data[0][0]) == 0:
+ if plot.get(u"include", None):
+ data = input_data.filter_tests_by_name(
+ plot,
+ params=[u"latency", u"throughput", u"parent", u"tags", u"type"]
+ )[0][0]
+ else:
+ job = list(plot[u"data"].keys())[0]
+ build = str(plot[u"data"][job][0])
+ data = input_data.tests(job, build)
+
+ if data is None or len(data) == 0:
logging.error(u"No data.")
return
@@ -209,64 +217,64 @@ def plot_hdrh_lat_by_percentile(plot, input_data):
u"LAT0",
u"PDR10",
u"PDR50",
- u"PDR90",
- u"NDR",
- u"PDR"
+ u"PDR90"
]
- for test in data[0][0]:
+ file_links = plot.get(u"output-file-links", None)
+ target_links = plot.get(u"target-links", None)
+
+ for test in data:
try:
if test[u"type"] not in (u"NDRPDR",):
logging.warning(f"Invalid test type: {test[u'type']}")
continue
name = re.sub(REGEX_NIC, u"", test[u"parent"].
replace(u'-ndrpdr', u'').replace(u'2n1l-', u''))
+ try:
+ nic = re.search(REGEX_NIC, test[u"parent"]).group(1)
+ except IndexError:
+ nic = u""
+ name_link = f"{nic}-{test[u'name']}"
- logging.info(f" Generating the graph: {name}")
-
- pdr = test[u"throughput"][u"PDR"][u"LOWER"]
- ndr = test[u"throughput"][u"NDR"][u"LOWER"]
+ logging.info(f" Generating the graph: {name_link}")
desc = {
- u"LAT0": u"No load",
- u"PDR10": f"10% PDR background traffic ({(pdr*1e-7):.2f}Mpps)",
- u"PDR50": f"50% PDR background traffic ({(pdr*5e-7):.2f}Mpps)",
- u"PDR90": f"90% PDR background traffic ({(pdr*9e-7):.2f}Mpps)",
- u"PDR": f"100% PDR background traffic ({(pdr*1e-6):.2f}Mpps)",
- u"NDR10": f"10% NDR background traffic ({(ndr*1e-7):.2f}Mpps)",
- u"NDR50": f"50% NDR background traffic ({(ndr*5e-7):.2f}Mpps)",
- u"NDR90": f"90% NDR background traffic ({(ndr*9e-7):.2f}Mpps)",
- u"NDR": f"100% NDR background traffic ({(ndr*1e-6):.2f}Mpps)"
+ u"LAT0": u"No-load.",
+ u"PDR10": u"Low-load, 10% PDR.",
+ u"PDR50": u"Mid-load, 50% PDR.",
+ u"PDR90": u"High-load, 90% PDR.",
+ u"PDR": u"Full-load, 100% PDR.",
+ u"NDR10": u"Low-load, 10% NDR.",
+ u"NDR50": u"Mid-load, 50% NDR.",
+ u"NDR90": u"High-load, 90% NDR.",
+ u"NDR": u"Full-load, 100% NDR."
}
- fig = make_subplots(
- rows=1,
- cols=2,
- column_widths=[0.5, 0.5],
- shared_xaxes=True,
- subplot_titles=(
- u"<b>Direction: W-E</b>",
- u"<b>Direction: E-W</b>"
- ),
- specs=[[{"type": "scatter"}, {"type": "scatter"}], ]
- )
+ fig = plgo.Figure()
layout = deepcopy(plot[u"layout"])
for color, graph in enumerate(graphs):
for idx, direction in enumerate((u"direction1", u"direction2")):
- xaxis = list()
- yaxis = list()
- hovertext = list()
+ xaxis = [0.0, ]
+ yaxis = [0.0, ]
+ hovertext = [
+ f"<b>{desc[graph]}</b><br>"
+ f"Direction: {(u'W-E', u'E-W')[idx % 2]}<br>"
+ f"Percentile: 0.0%<br>"
+ f"Latency: 0.0uSec"
+ ]
decoded = hdrh.histogram.HdrHistogram.decode(
test[u"latency"][graph][direction][u"hdrh"]
)
for item in decoded.get_recorded_iterator():
percentile = item.percentile_level_iterated_to
- xaxis.append((100.0 / (100.0 - percentile))
- if percentile != 100.0 else 1e6)
+ if percentile > 99.9:
+ continue
+ xaxis.append(percentile)
yaxis.append(item.value_iterated_to)
hovertext.append(
f"<b>{desc[graph]}</b><br>"
+ f"Direction: {(u'W-E', u'E-W')[idx % 2]}<br>"
f"Percentile: {percentile:.5f}%<br>"
f"Latency: {item.value_iterated_to}uSec"
)
@@ -279,46 +287,37 @@ def plot_hdrh_lat_by_percentile(plot, input_data):
legendgroup=desc[graph],
showlegend=bool(idx),
line=dict(
- color=COLORS[color]
+ color=COLORS[color],
+ dash=u"solid" if idx % 2 else u"dash"
),
hovertext=hovertext,
hoverinfo=u"text"
- ),
- row=1,
- col=idx + 1,
- )
- fig.update_xaxes(
- row=1,
- col=idx + 1,
- **layout[u"xaxis"]
- )
- fig.update_yaxes(
- row=1,
- col=idx + 1,
- **layout[u"yaxis"]
+ )
)
- try:
- del layout[u"xaxis"]
- except KeyError:
- pass
- try:
- del layout[u"yaxis"]
- except KeyError:
- pass
layout[u"title"][u"text"] = f"<b>Latency:</b> {name}"
fig.update_layout(layout)
# Create plot
- file_name = (f"{plot[u'output-file']}-"
- f"{name}"
- f"{plot.get(u'output-file-type', u'.html')}")
+ file_name = f"{plot[u'output-file']}-{name_link}.html"
logging.info(f" Writing file {file_name}")
try:
# Export Plot
ploff.plot(fig, show_link=False, auto_open=False,
filename=file_name)
+ # Add link to the file:
+ if file_links and target_links:
+ with open(file_links, u"a") as fw:
+ fw.write(
+ f"- `{name_link} "
+ f"<{target_links}/{file_name.split(u'/')[-1]}>`_\n"
+ )
+ except FileNotFoundError as err:
+ logging.error(
+ f"Not possible to write the link to the file "
+ f"{file_links}\n{err}"
+ )
except PlotlyError as err:
logging.error(f" Finished with error: {repr(err)}")