package com.etsy.statsd.profiler; import com.etsy.statsd.profiler.reporter.Reporter; import com.google.common.base.Preconditions; import java.util.Map; import java.util.concurrent.TimeUnit; /** * Interface for profilers * * @author Andrew Johnson */ public abstract class Profiler { public static final Class<?>[] CONSTRUCTOR_PARAM_TYPES = new Class<?>[]{Reporter.class, Arguments.class}; private final Reporter<?> reporter; private long recordedStats = 0; public Profiler(Reporter reporter, Arguments arguments) { Preconditions.checkNotNull(reporter); this.reporter = reporter; handleArguments(arguments); } /** * Perform profiling */ public abstract void profile(); /** * Hook to flush any remaining data cached by the profiler at JVM shutdown */ public abstract void flushData(); /** * Get the period to use for this profiler in the ScheduledExecutorService * * @return The ScheduledExecutorThread period for this profiler */ public abstract long getPeriod(); /** * Get the unit of time that corresponds to the period for this profiler * * @return A TimeUnit corresponding the the period for this profiler */ public abstract TimeUnit getTimeUnit(); /** * CPUTracingProfiler can emit some metrics that indicate the upper and lower bound on the length of stack traces * This is helpful for querying this data for some backends (such as Graphite) that do not have rich query languages * Reporters can override this to disable these metrics * * @return true if the bounds metrics should be emitted, false otherwise */ protected boolean emitBounds() { return reporter.emitBounds(); } /** * Handle any additional arguments necessary for this profiler * * @param arguments The arguments given to the profiler */ protected abstract void handleArguments(Arguments arguments); /** * Record a gauge value * * @param key The key for the gauge * @param value The value of the gauge */ protected void recordGaugeValue(String key, long value) { recordedStats++; reporter.recordGaugeValue(key, value); } /** * @see #recordGaugeValue(String, long) */ protected void recordGaugeValue(String key, double value) { recordedStats++; reporter.recordGaugeValue(key, value); } /** * Record multiple gauge values * This is useful for reporters that can send points in batch * * @param gauges A map of gauge names to values */ protected void recordGaugeValues(Map<String, ? extends Number> gauges) { recordedStats++; reporter.recordGaugeValues(gauges); } public long getRecordedStats() { return recordedStats; } }