mirror of
https://github.com/aljazceru/kata-containers.git
synced 2025-12-17 22:34:25 +01:00
This PR adds the metrics report R files. Signed-off-by: Gabriela Cervantes <gabriela.cervantes.tellez@intel.com>
143 lines
4.0 KiB
R
143 lines
4.0 KiB
R
#!/usr/bin/env Rscript
|
|
# Copyright (c) 2018-2023 Intel Corporation
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
# Analyse the runtime component memory footprint data.
|
|
|
|
library(ggplot2) # ability to plot nicely.
|
|
# So we can plot multiple graphs
|
|
library(gridExtra) # together.
|
|
suppressMessages(suppressWarnings(library(ggpubr))) # for ggtexttable.
|
|
suppressMessages(library(jsonlite)) # to load the data.
|
|
|
|
testnames=c(
|
|
"memory-footprint-inside-container"
|
|
)
|
|
|
|
data=c()
|
|
rstats=c()
|
|
rstats_rows=c()
|
|
rstats_cols=c()
|
|
|
|
# For each set of results
|
|
for (currentdir in resultdirs) {
|
|
dirstats=c()
|
|
# For the two different types of memory footprint measures
|
|
for (testname in testnames) {
|
|
# R seems not to like double path slashes '//' ?
|
|
fname=paste(inputdir, currentdir, testname, '.json', sep="")
|
|
if ( !file.exists(fname)) {
|
|
warning(paste("Skipping non-existent file: ", fname))
|
|
next
|
|
}
|
|
|
|
# Derive the name from the test result dirname
|
|
datasetname=basename(currentdir)
|
|
|
|
# Import the data
|
|
fdata=fromJSON(fname)
|
|
fdata=fdata[[testname]]
|
|
# Copy the average result into a shorter, more accesible name
|
|
fdata$requested=fdata$Results$memrequest$Result
|
|
fdata$total=fdata$Results$memtotal$Result
|
|
fdata$free=fdata$Results$memfree$Result
|
|
fdata$avail=fdata$Results$memavailable$Result
|
|
|
|
# And lets work out what % we have 'lost' between the amount requested
|
|
# and the total the container actually sees.
|
|
fdata$lost=fdata$requested - fdata$total
|
|
fdata$pctotal= 100 * (fdata$lost/ fdata$requested)
|
|
|
|
fdata$Runtime=rep(datasetname, length(fdata$Result) )
|
|
|
|
# Store away the bits we need
|
|
data=rbind(data, data.frame(
|
|
Result=fdata$requested,
|
|
Type="requested",
|
|
Runtime=fdata$Runtime ))
|
|
|
|
data=rbind(data, data.frame(
|
|
Result=fdata$total,
|
|
Type="total",
|
|
Runtime=fdata$Runtime ))
|
|
|
|
data=rbind(data, data.frame(
|
|
Result=fdata$free,
|
|
Type="free",
|
|
Runtime=fdata$Runtime ))
|
|
|
|
data=rbind(data, data.frame(
|
|
Result=fdata$avail,
|
|
Type="avail",
|
|
Runtime=fdata$Runtime ))
|
|
|
|
data=rbind(data, data.frame(
|
|
Result=fdata$lost,
|
|
Type="lost",
|
|
Runtime=fdata$Runtime ))
|
|
|
|
data=rbind(data, data.frame(
|
|
Result=fdata$pctotal,
|
|
Type="% consumed",
|
|
Runtime=fdata$Runtime ))
|
|
|
|
# Store away some stats for the text table
|
|
dirstats=rbind(dirstats, round(fdata$requested, digits=2) )
|
|
dirstats=rbind(dirstats, round(fdata$total, digits=2) )
|
|
dirstats=rbind(dirstats, round(fdata$free, digits=2) )
|
|
dirstats=rbind(dirstats, round(fdata$avail, digits=2) )
|
|
dirstats=rbind(dirstats, round(fdata$lost, digits=2) )
|
|
dirstats=rbind(dirstats, round(fdata$pctotal, digits=2) )
|
|
}
|
|
rstats=cbind(rstats, dirstats)
|
|
rstats_cols=append(rstats_cols, datasetname)
|
|
}
|
|
|
|
rstats_rows=c("Requested", "Total", "Free", "Avail", "Consumed", "% Consumed")
|
|
|
|
unts=c("Kb", "Kb", "Kb", "Kb", "Kb", "%")
|
|
rstats=cbind(rstats, unts)
|
|
rstats_cols=append(rstats_cols, "Units")
|
|
|
|
# If we have only 2 sets of results, then we can do some more
|
|
# stats math for the text table
|
|
if (length(resultdirs) == 2) {
|
|
# This is a touch hard wired - but we *know* we only have two
|
|
# datasets...
|
|
diff=c()
|
|
# Just the first three entries - meaningless for the pctotal entry
|
|
for (n in 1:5) {
|
|
difference = (as.double(rstats[n,2]) - as.double(rstats[n,1]))
|
|
val = 100 * (difference/as.double(rstats[n,1]))
|
|
diff=rbind(diff, round(val, digits=2))
|
|
}
|
|
|
|
# Add a blank entry for the other entries
|
|
diff=rbind(diff, "")
|
|
rstats=cbind(rstats, diff)
|
|
rstats_cols=append(rstats_cols, "Diff %")
|
|
}
|
|
|
|
# Build us a text table of numerical results
|
|
stats_plot = suppressWarnings(ggtexttable(data.frame(rstats),
|
|
theme=ttheme(base_size=10),
|
|
rows=rstats_rows, cols=rstats_cols
|
|
))
|
|
|
|
bardata <- subset(data, Type %in% c("requested", "total", "free", "avail"))
|
|
# plot how samples varioed over 'time'
|
|
barplot <- ggplot() +
|
|
geom_bar(data=bardata, aes(Type, Result, fill=Runtime), stat="identity", position="dodge") +
|
|
xlab("Measure") +
|
|
ylab("Size (Kb)") +
|
|
ggtitle("In-container memory statistics") +
|
|
ylim(0, NA) +
|
|
theme(axis.text.x=element_text(angle=90))
|
|
|
|
master_plot = grid.arrange(
|
|
barplot,
|
|
stats_plot,
|
|
nrow=2,
|
|
ncol=1 )
|