render plot with a single dataseriew
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
package org.lucares.recommind.logs;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class DataSeries {
|
||||
private final File dataFile;
|
||||
|
||||
private final String title;
|
||||
|
||||
private final GnuplotColor color;
|
||||
|
||||
private final Integer pointType;
|
||||
|
||||
public DataSeries(final File dataFile, final String title) {
|
||||
super();
|
||||
this.dataFile = dataFile;
|
||||
this.title = title;
|
||||
this.color = null;
|
||||
this.pointType = null;
|
||||
}
|
||||
|
||||
public DataSeries(final File dataFile, final String title, final GnuplotColor color, final Integer pointType) {
|
||||
super();
|
||||
this.dataFile = dataFile;
|
||||
this.title = title;
|
||||
this.color = color;
|
||||
this.pointType = pointType;
|
||||
}
|
||||
|
||||
public GnuplotColor getColor() {
|
||||
return color;
|
||||
}
|
||||
|
||||
public Integer getPointType() {
|
||||
return pointType;
|
||||
}
|
||||
|
||||
public File getDataFile() {
|
||||
return dataFile;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package org.lucares.recommind.logs;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Collection;
|
||||
|
||||
import com.google.common.io.Files;
|
||||
|
||||
public class Gnuplot {
|
||||
|
||||
private final Path tmpDirectory;
|
||||
|
||||
public Gnuplot(final Path tmpDirectory) {
|
||||
this.tmpDirectory = tmpDirectory;
|
||||
}
|
||||
|
||||
public void plot(final GnuplotSettings settings, final Collection<DataSeries> dataSeries)
|
||||
throws IOException, InterruptedException {
|
||||
|
||||
final GnuplotFileGenerator generator = new GnuplotFileGenerator();
|
||||
|
||||
final String gnuplotFileContent = generator.generate(settings, dataSeries);
|
||||
System.out.println(gnuplotFileContent);
|
||||
|
||||
final File gnuplotFile = File.createTempFile("gnuplot", ".dem", tmpDirectory.toFile());
|
||||
Files.write(gnuplotFileContent, gnuplotFile, StandardCharsets.UTF_8);
|
||||
|
||||
final ProcessBuilder processBuilder = new ProcessBuilder("gnuplot", gnuplotFile.getAbsolutePath());
|
||||
processBuilder.inheritIO();
|
||||
final Process start = processBuilder.start();
|
||||
start.waitFor();
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,296 @@
|
||||
package org.lucares.recommind.logs;
|
||||
|
||||
public enum GnuplotColor {
|
||||
|
||||
ALICEBLUE("aliceblue"),
|
||||
|
||||
ANTIQUEWHITE("antiquewhite"),
|
||||
|
||||
AQUA("aqua"),
|
||||
|
||||
AQUAMARINE("aquamarine"),
|
||||
|
||||
AZURE("azure"),
|
||||
|
||||
BEIGE("beige"),
|
||||
|
||||
BISQUE("bisque"),
|
||||
|
||||
BLACK("black"),
|
||||
|
||||
BLANCHEDALMOND("blanchedalmond"),
|
||||
|
||||
BLUE("blue"),
|
||||
|
||||
BLUEVIOLET("blueviolet"),
|
||||
|
||||
BROWN("brown"),
|
||||
|
||||
BURLYWOOD("burlywood"),
|
||||
|
||||
CADETBLUE("cadetblue"),
|
||||
|
||||
CHARTREUSE("chartreuse"),
|
||||
|
||||
CHOCOLATE("chocolate"),
|
||||
|
||||
CORAL("coral"),
|
||||
|
||||
CORNFLOWERBLUE("cornflowerblue"),
|
||||
|
||||
CORNSILK("cornsilk"),
|
||||
|
||||
CRIMSON("crimson"),
|
||||
|
||||
CYAN("cyan"),
|
||||
|
||||
DARKBLUE("darkblue"),
|
||||
|
||||
DARKCYAN("darkcyan"),
|
||||
|
||||
DARKGOLDENROD("darkgoldenrod"),
|
||||
|
||||
DARKGRAY("darkgray"),
|
||||
|
||||
DARKGREEN("darkgreen"),
|
||||
|
||||
DARKKHAKI("darkkhaki"),
|
||||
|
||||
DARKMAGENTA("darkmagenta"),
|
||||
|
||||
DARKOLIVEGREEN("darkolivegreen"),
|
||||
|
||||
DARKORANGE("darkorange"),
|
||||
|
||||
DARKORCHID("darkorchid"),
|
||||
|
||||
DARKRED("darkred"),
|
||||
|
||||
DARKSALMON("darksalmon"),
|
||||
|
||||
DARKSEAGREEN("darkseagreen"),
|
||||
|
||||
DARKSLATEBLUE("darkslateblue"),
|
||||
|
||||
DARKSLATEGRAY("darkslategray"),
|
||||
|
||||
DARKTURQUOISE("darkturquoise"),
|
||||
|
||||
DARKVIOLET("darkviolet"),
|
||||
|
||||
DEEPPINK("deeppink"),
|
||||
|
||||
DEEPSKYBLUE("deepskyblue"),
|
||||
|
||||
DIMGRAY("dimgray"),
|
||||
|
||||
DODGERBLUE("dodgerblue"),
|
||||
|
||||
FIREBRICK("firebrick"),
|
||||
|
||||
FLORALWHITE("floralwhite"),
|
||||
|
||||
FORESTGREEN("forestgreen"),
|
||||
|
||||
FUCHSIA("fuchsia"),
|
||||
|
||||
GAINSBORO("gainsboro"),
|
||||
|
||||
GHOSTWHITE("ghostwhite"),
|
||||
|
||||
GOLD("gold"),
|
||||
|
||||
GOLDENROD("goldenrod"),
|
||||
|
||||
GRAY("gray"),
|
||||
|
||||
GREEN("green"),
|
||||
|
||||
GREENYELLOW("greenyellow"),
|
||||
|
||||
HONEYDEW("honeydew"),
|
||||
|
||||
HOTPINK("hotpink"),
|
||||
|
||||
INDIANRED("indianred"),
|
||||
|
||||
INDIGO("indigo"),
|
||||
|
||||
IVORY("ivory"),
|
||||
|
||||
KHAKI("khaki"),
|
||||
|
||||
LAVENDER("lavender"),
|
||||
|
||||
LAVENDERBLUSH("lavenderblush"),
|
||||
|
||||
LAWNGREEN("lawngreen"),
|
||||
|
||||
LEMONCHIFFON("lemonchiffon"),
|
||||
|
||||
LIGHTBLUE("lightblue"),
|
||||
|
||||
LIGHTCORAL("lightcoral"),
|
||||
|
||||
LIGHTCYAN("lightcyan"),
|
||||
|
||||
LIGHTGOLDENRODYE("lightgoldenrodye"),
|
||||
|
||||
LIGHTGREEN("lightgreen"),
|
||||
|
||||
LIGHTGREY("lightgrey"),
|
||||
|
||||
LIGHTPINK("lightpink"),
|
||||
|
||||
LIGHTSALMON("lightsalmon"),
|
||||
|
||||
LIGHTSEAGREEN("lightseagreen"),
|
||||
|
||||
LIGHTSKYBLUE("lightskyblue"),
|
||||
|
||||
LIGHTSLATEGRAY("lightslategray"),
|
||||
|
||||
LIGHTSTEELBLUE("lightsteelblue"),
|
||||
|
||||
LIGHTYELLOW("lightyellow"),
|
||||
|
||||
LIME("lime"),
|
||||
|
||||
LIMEGREEN("limegreen"),
|
||||
|
||||
LINEN("linen"),
|
||||
|
||||
MAGENTA("magenta"),
|
||||
|
||||
MAROON("maroon"),
|
||||
|
||||
MEDIUMAQUAMARINE("mediumaquamarine"),
|
||||
|
||||
MEDIUMBLUE("mediumblue"),
|
||||
|
||||
MEDIUMORCHID("mediumorchid"),
|
||||
|
||||
MEDIUMPURPLE("mediumpurple"),
|
||||
|
||||
MEDIUMSEAGREEN("mediumseagreen"),
|
||||
|
||||
MEDIUMSLATEBLUE("mediumslateblue"),
|
||||
|
||||
MEDIUMSPRINGGREE("mediumspringgree"),
|
||||
|
||||
MEDIUMTURQUOISE("mediumturquoise"),
|
||||
|
||||
MEDIUMVIOLETRED("mediumvioletred"),
|
||||
|
||||
MIDNIGHTBLUE("midnightblue"),
|
||||
|
||||
MINTCREAM("mintcream"),
|
||||
|
||||
MISTYROSE("mistyrose"),
|
||||
|
||||
MOCCASIN("moccasin"),
|
||||
|
||||
NAVAJOWHITE("navajowhite"),
|
||||
|
||||
NAVY("navy"),
|
||||
|
||||
NAVYBLUE("navyblue"),
|
||||
|
||||
OLDLACE("oldlace"),
|
||||
|
||||
OLIVE("olive"),
|
||||
|
||||
OLIVEDRAB("olivedrab"),
|
||||
|
||||
ORANGE("orange"),
|
||||
|
||||
ORANGERED("orangered"),
|
||||
|
||||
ORCHID("orchid"),
|
||||
|
||||
PALEGOLDENROD("palegoldenrod"),
|
||||
|
||||
PALEGREEN("palegreen"),
|
||||
|
||||
PALETURQUOISE("paleturquoise"),
|
||||
|
||||
PALEVIOLETRED("palevioletred"),
|
||||
|
||||
PAPAYAWHIP("papayawhip"),
|
||||
|
||||
PEACHPUFF("peachpuff"),
|
||||
|
||||
PERU("peru"),
|
||||
|
||||
PINK("pink"),
|
||||
|
||||
PLUM("plum"),
|
||||
|
||||
POWDERBLUE("powderblue"),
|
||||
|
||||
PURPLE("purple"),
|
||||
|
||||
RED("red"),
|
||||
|
||||
ROSYBROWN("rosybrown"),
|
||||
|
||||
ROYALBLUE("royalblue"),
|
||||
|
||||
SADDLEBROWN("saddlebrown"),
|
||||
|
||||
SALMON("salmon"),
|
||||
|
||||
SANDYBROWN("sandybrown"),
|
||||
|
||||
SEAGREEN("seagreen"),
|
||||
|
||||
SEASHELL("seashell"),
|
||||
|
||||
SIENNA("sienna"),
|
||||
|
||||
SILVER("silver"),
|
||||
|
||||
SKYBLUE("skyblue"),
|
||||
|
||||
SLATEBLUE("slateblue"),
|
||||
|
||||
SLATEGRAY("slategray"),
|
||||
|
||||
SNOW("snow"),
|
||||
|
||||
SPRINGGREEN("springgreen"),
|
||||
|
||||
STEELBLUE("steelblue"),
|
||||
|
||||
TAN("tan"),
|
||||
|
||||
TEAL("teal"),
|
||||
|
||||
THISTLE("thistle"),
|
||||
|
||||
TOMATO("tomato"),
|
||||
|
||||
TURQUOISE("turquoise"),
|
||||
|
||||
VIOLET("violet"),
|
||||
|
||||
WHEAT("wheat"),
|
||||
|
||||
WHITE("white"),
|
||||
|
||||
WHITESMOKE("whitesmoke"),
|
||||
|
||||
YELLOW("yellow"),
|
||||
|
||||
YELLOWGREEN("yellowgreen");
|
||||
|
||||
private final String color;
|
||||
|
||||
private GnuplotColor(final String color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public String getColor() {
|
||||
return color;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package org.lucares.recommind.logs;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public class GnuplotFileGenerator {
|
||||
|
||||
public String generate(final GnuplotSettings settings, final Collection<DataSeries> dataSeries) {
|
||||
|
||||
final StringBuilder result = new StringBuilder();
|
||||
|
||||
appendfln(result, "set terminal %s size %d,%d", settings.getTerminal(), settings.getWidth(),
|
||||
settings.getHeight());
|
||||
|
||||
appendfln(result, "set datafile separator \"%s\"", settings.getDatafileSeparator());
|
||||
appendfln(result, "set timefmt '%s'", settings.getTimefmt());
|
||||
|
||||
appendfln(result, "set xdata time");
|
||||
appendfln(result, "set format x \"%s\"", settings.getFormatX());
|
||||
appendfln(result, "set xlabel \"%s\"", settings.getXlabel());
|
||||
appendfln(result, "set xtics rotate by %d", settings.getRotateXAxisLabel());
|
||||
|
||||
appendfln(result, "set ylabel \"%s\"", settings.getYlabel());
|
||||
|
||||
appendfln(result, "set output \"%s\"", settings.getOutput().getAbsolutePath());
|
||||
appendf(result, "plot ");
|
||||
|
||||
for (final DataSeries dataSerie : dataSeries) {
|
||||
appendfln(result, "'%s' using 1:2 title '%s' with points, \\", dataSerie.getDataFile(),
|
||||
dataSerie.getTitle());
|
||||
}
|
||||
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
private void appendfln(final StringBuilder builder, final String format, final Object... args) {
|
||||
builder.append(String.format(format + "\n", args));
|
||||
}
|
||||
|
||||
private void appendf(final StringBuilder builder, final String format, final Object... args) {
|
||||
builder.append(String.format(format, args));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
package org.lucares.recommind.logs;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class GnuplotSettings {
|
||||
private String terminal = "png";
|
||||
private int height = 1200;
|
||||
private int width = 1600;
|
||||
private String timefmt = "%Y-%m-%dT%H:%M:%S";
|
||||
|
||||
// set format x "%m-%d\n%H:%M"
|
||||
private String formatX = "%Y-%m-%d %H:%M:%S";
|
||||
|
||||
// set datafile separator ","
|
||||
private String datafileSeparator = ",";
|
||||
|
||||
// set xlabel "Time"
|
||||
private String xlabel = "Time";
|
||||
|
||||
// set ylabel "Traffic"
|
||||
private String ylabel = "Duration in ms";
|
||||
|
||||
// set output "datausage.png"
|
||||
private File output = new File("/tmp/out.png");
|
||||
|
||||
// set xtics rotate by 80
|
||||
private int rotateXAxisLabel = -80;
|
||||
|
||||
public GnuplotSettings(final File output) {
|
||||
this.output = output;
|
||||
}
|
||||
|
||||
public int getRotateXAxisLabel() {
|
||||
return rotateXAxisLabel;
|
||||
}
|
||||
|
||||
public void setRotateXAxisLabel(final int rotateXAxisLabel) {
|
||||
this.rotateXAxisLabel = rotateXAxisLabel;
|
||||
}
|
||||
|
||||
public String getTerminal() {
|
||||
return terminal;
|
||||
}
|
||||
|
||||
public void setTerminal(final String terminal) {
|
||||
this.terminal = terminal;
|
||||
}
|
||||
|
||||
public int getHeight() {
|
||||
return height;
|
||||
}
|
||||
|
||||
public void setHeight(final int height) {
|
||||
this.height = height;
|
||||
}
|
||||
|
||||
public int getWidth() {
|
||||
return width;
|
||||
}
|
||||
|
||||
public void setWidth(final int width) {
|
||||
this.width = width;
|
||||
}
|
||||
|
||||
public String getTimefmt() {
|
||||
return timefmt;
|
||||
}
|
||||
|
||||
public void setTimefmt(final String timefmt) {
|
||||
this.timefmt = timefmt;
|
||||
}
|
||||
|
||||
public String getFormatX() {
|
||||
return formatX;
|
||||
}
|
||||
|
||||
public void setFormatX(final String formatX) {
|
||||
this.formatX = formatX;
|
||||
}
|
||||
|
||||
public String getDatafileSeparator() {
|
||||
return datafileSeparator;
|
||||
}
|
||||
|
||||
public void setDatafileSeparator(final String datafileSeparator) {
|
||||
this.datafileSeparator = datafileSeparator;
|
||||
}
|
||||
|
||||
public String getXlabel() {
|
||||
return xlabel;
|
||||
}
|
||||
|
||||
public void setXlabel(final String xlabel) {
|
||||
this.xlabel = xlabel;
|
||||
}
|
||||
|
||||
public String getYlabel() {
|
||||
return ylabel;
|
||||
}
|
||||
|
||||
public void setYlabel(final String ylabel) {
|
||||
this.ylabel = ylabel;
|
||||
}
|
||||
|
||||
public File getOutput() {
|
||||
return output;
|
||||
}
|
||||
|
||||
public void setOutput(final File output) {
|
||||
this.output = output;
|
||||
}
|
||||
|
||||
// plot 'sample.txt' using 1:2 title 'Bytes' with linespoints 2
|
||||
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
package org.lucares.recommind.logs;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.lucares.performance.db.Entry;
|
||||
import org.lucares.performance.db.FileUtils;
|
||||
import org.lucares.performance.db.PerformanceDb;
|
||||
import org.lucares.tanga.svak.StreamSvWriter;
|
||||
import org.lucares.tanga.svak.StreamSvWriterSettings;
|
||||
import org.lucares.tanga.svak.StreamSvWriterSettings.Escaping;
|
||||
import org.lucares.tanga.svak.StreamSvWriterSettings.FieldQuoting;
|
||||
|
||||
public class Plotter {
|
||||
public static void main(final String[] args) throws Exception {
|
||||
final Path dataDirectory = Paths.get(args[0]);
|
||||
final Path outputDirectory = Paths.get(args[1]);
|
||||
final String query = args[2];
|
||||
final Path tmpBaseDir = Paths.get(args[0], "tmp");
|
||||
Files.createDirectories(tmpBaseDir);
|
||||
Files.createDirectories(outputDirectory);
|
||||
final Path tmpDirectory = Files.createTempDirectory(tmpBaseDir, "gnuplot");
|
||||
try {
|
||||
|
||||
final Collection<DataSeries> dataSeries = new ArrayList<>();
|
||||
|
||||
try (PerformanceDb db = new PerformanceDb(dataDirectory)) {
|
||||
final Stream<Entry> entries = db.get(query);
|
||||
|
||||
final File dataFile = File.createTempFile("data", ".dat", tmpDirectory.toFile());
|
||||
final DataSeries dataSerie = new DataSeries(dataFile, query);
|
||||
toCsv(entries, dataFile);
|
||||
|
||||
dataSeries.add(dataSerie);
|
||||
}
|
||||
|
||||
final File outputFile = File.createTempFile("out", ".png", outputDirectory.toFile());
|
||||
final Gnuplot gnuplot = new Gnuplot(tmpDirectory);
|
||||
final GnuplotSettings settings = new GnuplotSettings(outputFile);
|
||||
gnuplot.plot(settings, dataSeries);
|
||||
} finally {
|
||||
FileUtils.delete(tmpDirectory);
|
||||
}
|
||||
}
|
||||
|
||||
private static void toCsv(final Stream<Entry> entries, final File dataFile) throws IOException {
|
||||
|
||||
final StreamSvWriterSettings svSettings = new StreamSvWriterSettings(",", "'");
|
||||
svSettings.setFieldQuoting(FieldQuoting.IF_NEEDED);
|
||||
svSettings.setEscaping(Escaping.NONE);
|
||||
try (FileOutputStream output = new FileOutputStream(dataFile);
|
||||
StreamSvWriter writer = new StreamSvWriter(output, svSettings)) {
|
||||
|
||||
final Iterator<Entry> it = entries.iterator();
|
||||
while (it.hasNext()) {
|
||||
final Entry entry = it.next();
|
||||
|
||||
final String value = String.valueOf(entry.getValue());
|
||||
final String date = entry.getDate().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
|
||||
writer.writeLine(date, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user