package org.sef4j.callstack.export.influxdb.jsonprinters; import java.io.PrintWriter; import org.sef4j.callstack.stats.BasicTimeStatsLogHistogram; import org.sef4j.callstack.stats.BasicTimeStatsSlotInfo; import org.sef4j.callstack.stats.PendingPerfCount; import org.sef4j.callstack.stats.PerfStats; import org.sef4j.core.helpers.ext.influxdb.AbstractInfluxDBValuePrinter; /** * InfluxDB serie json formater for PerfStats * */ public class PerfStatsInfluxDBPrinter extends AbstractInfluxDBValuePrinter<PerfStats> { public static final PerfStatsInfluxDBPrinter ELAPSED_INSTANCE = new PerfStatsInfluxDBPrinter(true, false, true, false, false, false); public static final PerfStatsInfluxDBPrinter DETAILED_ELAPSED_INSTANCE = new PerfStatsInfluxDBPrinter(true, true, true, true, true, false); public static final PerfStatsInfluxDBPrinter DEFAULT_INSTANCE = ELAPSED_INSTANCE; private final boolean printPendings; private final boolean printElapsed; private final boolean printCpu; private final boolean printUser; private final boolean printInterleavedSlots; // ------------------------------------------------------------------------ public PerfStatsInfluxDBPrinter(boolean printIndented, boolean printPendings, boolean printElapsed, boolean printCpu, boolean printUser, boolean printInterleavedSlots) { super(printIndented); this.printPendings = printPendings; this.printElapsed = printElapsed; this.printCpu = printCpu; this.printUser = printUser; this.printInterleavedSlots = printInterleavedSlots; } // ------------------------------------------------------------------------ @Override public void printColumnNames(PrintWriter output) { if (printPendings) { PendingPerfCountInfluxDBPrinter.INSTANCE.printColumnNames(output); printSep(output); } final int lastPrintType = (printUser)? 2: (printCpu? 1 : (printElapsed? 0 : -1)); final int lenMinus1 = BasicTimeStatsLogHistogram.SLOT_LEN - 1; // until len-1 to avoid trailing ", " .. then extra step if (printInterleavedSlots) { for (int i = 0; i < lenMinus1; i++) { if (printElapsed) { printNthElapsedColNames(output, i); printSep(output); } if (printCpu) { printNthCpuColNames(output, i); printSep(output); } if (printUser) { printNthUserColNames(output, i); printSep(output); } } // last loop, with trailing ", " if (printElapsed) { printNthElapsedColNames(output, lenMinus1); printSepIfNotEq(0, lastPrintType, output); } if (printCpu) { printNthCpuColNames(output, lenMinus1); printSepIfNotEq(1, lastPrintType, output); } if (printUser) { printNthUserColNames(output, lenMinus1); printSepIfNotEq(2, lastPrintType, output); } } else { if (printElapsed) { for (int i = 0; i < lenMinus1; i++) { printNthElapsedColNames(output, i); printSep(output); } printNthElapsedColNames(output, lenMinus1); printSepIfNotEq(0, lastPrintType, output); } if (printCpu) { for (int i = 0; i < lenMinus1; i++) { printNthCpuColNames(output, i); printSep(output); } printNthCpuColNames(output, lenMinus1); printSepIfNotEq(1, lastPrintType, output); } if (printUser) { for (int i = 0; i < lenMinus1; i++) { printNthUserColNames(output, i); printSep(output); } printNthUserColNames(output, lenMinus1); printSepIfNotEq(2, lastPrintType, output); } } } @Override public void printPointValues(PrintWriter output, PerfStats point) { if (printPendings) { PendingPerfCount pendingCounts = point.getPendingCounts(); PendingPerfCountInfluxDBPrinter.INSTANCE.printPointValues(output, pendingCounts); printSep(output); } final BasicTimeStatsSlotInfo[] timeStatsInfo = point.getElapsedTimeStats().getSlotInfoCopy(); final BasicTimeStatsSlotInfo[] cpuStatsInfo = point.getThreadCpuTimeStats().getSlotInfoCopy(); final BasicTimeStatsSlotInfo[] userStatsInfo = point.getThreadUserTimeStats().getSlotInfoCopy(); final int lastPrintType = (printUser)? 2: (printCpu? 1 : (printElapsed? 0 : -1)); final int lenMinus1 = BasicTimeStatsLogHistogram.SLOT_LEN - 1; // until len-1 to avoid trailing ", " .. then extra step if (printInterleavedSlots) { for (int i = 0; i < lenMinus1; i++) { if (printElapsed) { printNth(output, timeStatsInfo[i]); printSep(output); } if (printCpu) { printNth(output, cpuStatsInfo[i]); printSep(output); } if (printUser) { printNth(output, userStatsInfo[i]); printSep(output); } } // last loop, with trailing ", " if (printElapsed) { printNth(output, timeStatsInfo[lenMinus1]); printSepIfNotEq(0, lastPrintType, output); } if (printCpu) { printNth(output, cpuStatsInfo[lenMinus1]); printSepIfNotEq(1, lastPrintType, output); } if (printUser) { printNth(output, userStatsInfo[lenMinus1]); printSepIfNotEq(2, lastPrintType, output); } } else { if (printElapsed) { for (int i = 0; i < lenMinus1; i++) { printNth(output, timeStatsInfo[i]); printSep(output); } printNth(output, timeStatsInfo[lenMinus1]); printSepIfNotEq(0, lastPrintType, output); } if (printCpu) { for (int i = 0; i < lenMinus1; i++) { printNth(output, cpuStatsInfo[i]); printSep(output); } printNth(output, cpuStatsInfo[lenMinus1]); printSepIfNotEq(1, lastPrintType, output); } if (printUser) { for (int i = 0; i < lenMinus1; i++) { printNth(output, userStatsInfo[i]); printSep(output); } printNth(output, userStatsInfo[lenMinus1]); printSepIfNotEq(2, lastPrintType, output); } } } private static void printSep(PrintWriter output) { output.print(", "); } private static void printSepIfNotEq(int expected, int actual, PrintWriter output) { if (expected != actual) { output.print(", "); } } private static void printNthElapsedColNames(PrintWriter output, int i) { BasicTimeStatsLogHistogramInfluxDBPrinter.printNthColumnNames(output, i, "count", "sum"); } private static void printNthUserColNames(PrintWriter output, int i) { BasicTimeStatsLogHistogramInfluxDBPrinter.printNthColumnNames(output, i, "userCount", "userSum"); } private static void printNthCpuColNames(PrintWriter output, int i) { BasicTimeStatsLogHistogramInfluxDBPrinter.printNthColumnNames(output, i, "cpuCount", "cpuSum"); } private static void printNth(PrintWriter output, BasicTimeStatsSlotInfo slot) { BasicTimeStatsLogHistogramInfluxDBPrinter.printNthValue(output, slot); } }