package org.sef4j.core.helpers.ext.influxdb; import java.io.ByteArrayOutputStream; import java.io.PrintWriter; import java.util.Iterator; import java.util.List; import org.sef4j.core.helpers.proptree.printers.ValuePrinter; /** * abstract helper class for InfluxDB serie json formater * * see sub-classes for concrete series per type: * - PerfStats => PerfStatsInfluxDBPrinter * - PendingPerfCount => PendingPerfCountInfluxDBPrinter * - BasicTimeStatsLogHistogram => BasicTimeStatsLogHistogramInfluxDBPrinter * * * <PRE> +-------------+ * printValue(serieName, value) | | JSon text * ----------------------------> | | ----------> "{ "name": "<<metricName>>", * +-------------+ "columns": [ "<<col1>>", ...<<columnNames>> ], * ^ "points": [ { <<points1>> }, ....{ <<points>> } ] * | }" * PerfStats +----------+----------+ * PendingPerfCount | | | * BasicTimeStatsLogHistogram +-----+ +-----+ +-----+ * | | | | | | * +-----+ +-----+ +-----+ * </PRE> * * Example of JSon formatting * <PRE> * { * "name": "metric1", * "columns": [ "count0", "sum0", "count1", "sum1" .... "count9", "sum9" ], * "points": [ * [ 12, 3456, 123, 4563, ... 123, 456546 ] * ] * }</PRE> * */ public abstract class AbstractInfluxDBValuePrinter<T> implements ValuePrinter<T> { private boolean printIndented; // ------------------------------------------------------------------------ public AbstractInfluxDBValuePrinter(boolean printIndented) { this.printIndented = printIndented; } // ------------------------------------------------------------------------ /** helper for printValues(PrintWriter output, ...) */ public String printValues(String metricName, List<T> values) { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); PrintWriter out = new PrintWriter(buffer); printValues(out, metricName, values); out.flush(); return buffer.toString(); } /** helper for printValue(PrintWriter output, ...) */ public String printValue(String metricName, T value) { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); PrintWriter out = new PrintWriter(buffer); printValue(out, metricName, value); out.flush(); return buffer.toString(); } @Override public final void printValues(PrintWriter output, String metricName, List<T> values) { printMetricHeader(output, metricName); for(Iterator<T> iter = values.iterator(); iter.hasNext(); ) { T value = iter.next(); output.print("[ "); printPointValues(output, value); output.print(" ]"); if (iter.hasNext()) { output.print(", "); } optPrintln(output); } printMetricFooter(output); } @Override public final void printValue(PrintWriter output, String metricName, T value) { printMetricHeader(output, metricName); output.print("[ "); printPointValues(output, value); output.print(" ]"); printMetricFooter(output); } private void printMetricHeader(PrintWriter output, String metricName) { output.print("{ \"name\":\""); output.print(metricName); output.print("\","); optPrintln(output); output.print("\"columns\":["); printColumnNames(output); output.print("],"); optPrintln(output); output.print("\"points\":["); optPrintln(output); } private void printMetricFooter(PrintWriter output) { optPrintln(output); output.print("]"); // optPrintln(output); output.print("}"); } protected void optPrintln(PrintWriter output) { if (printIndented) { output.print("\n"); } else { output.print(" "); } } public abstract void printColumnNames(PrintWriter output); public abstract void printPointValues(PrintWriter output, T point); }