package org.sef4j.ext.influxdb.series; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.influxdb.dto.Serie; import org.sef4j.callstack.stats.BasicTimeStatsSlotInfo; import org.sef4j.callstack.stats.PendingPerfCount; import org.sef4j.callstack.stats.PerfStats; /** * Mapper for PerfStats -> InfluxDB Serie */ public class PerfStatsToSerieMapper { private final boolean printPendings; private final boolean printElapsed; private final boolean printCpu; private final boolean printUser; private PendingPerfCountToSerieMapper pendingPerfCountMapper; private BasicTimeStatsLogHistogramToSerieMapper elapsedTimeStatsToSerieMapper; private BasicTimeStatsLogHistogramToSerieMapper userTimeStatsToSerieMapper; private BasicTimeStatsLogHistogramToSerieMapper cpuTimeStatsToSerieMapper; private final String[] columnNames; // ------------------------------------------------------------------------ public PerfStatsToSerieMapper(String prefix, String suffix, boolean printPendings, boolean printElapsed, boolean printCpu, boolean printUser) { this.printPendings = printPendings; this.printElapsed = printElapsed; this.printCpu = printCpu; this.printUser = printUser; List<String> tmpColNames = new ArrayList<String>(); if (printPendings) { pendingPerfCountMapper = new PendingPerfCountToSerieMapper(prefix, suffix); tmpColNames.addAll(Arrays.asList(pendingPerfCountMapper.getColumnNames())); } if (printElapsed) { elapsedTimeStatsToSerieMapper = new BasicTimeStatsLogHistogramToSerieMapper( SerieColNameUtil.prefixed(prefix, "elapsed"), suffix); tmpColNames.addAll(Arrays.asList(elapsedTimeStatsToSerieMapper.getColumnNames())); } if (printCpu) { cpuTimeStatsToSerieMapper = new BasicTimeStatsLogHistogramToSerieMapper( SerieColNameUtil.prefixed(prefix, "cpu"), suffix); tmpColNames.addAll(Arrays.asList(cpuTimeStatsToSerieMapper.getColumnNames())); } if (printUser) { userTimeStatsToSerieMapper = new BasicTimeStatsLogHistogramToSerieMapper( SerieColNameUtil.prefixed(prefix, "user"), suffix); tmpColNames.addAll(Arrays.asList(userTimeStatsToSerieMapper.getColumnNames())); } this.columnNames = tmpColNames.toArray(new String[tmpColNames.size()]); } // ------------------------------------------------------------------------ public void getColumns(List<String> dest) { dest.addAll(Arrays.asList(columnNames)); } public void getValues(List<Object> dest, PerfStats src) { if (printPendings) { PendingPerfCount pendingCounts = src.getPendingCounts(); pendingPerfCountMapper.getValues(dest, pendingCounts); } final BasicTimeStatsSlotInfo[] timeStatsInfo = src.getElapsedTimeStats().getSlotInfoCopy(); final BasicTimeStatsSlotInfo[] cpuStatsInfo = src.getThreadCpuTimeStats().getSlotInfoCopy(); final BasicTimeStatsSlotInfo[] userStatsInfo = src.getThreadUserTimeStats().getSlotInfoCopy(); if (printElapsed) { elapsedTimeStatsToSerieMapper.getValues(dest, timeStatsInfo); } if (printCpu) { cpuTimeStatsToSerieMapper.getValues(dest, cpuStatsInfo); } if (printUser) { userTimeStatsToSerieMapper.getValues(dest, userStatsInfo); } } public Serie map(PerfStats src, String serieName) { Serie.Builder dest = new Serie.Builder(serieName); dest.columns(columnNames); mapValues(dest, src); return dest.build(); } public void mapValues(Serie.Builder dest, PerfStats src) { List<Object> tmp = new ArrayList<Object>(columnNames.length); getValues(tmp, src); dest.values(tmp.toArray()); } }