package storm.applications.metrics; import com.codahale.metrics.ConsoleReporter; import com.codahale.metrics.CsvReporter; import com.codahale.metrics.JmxReporter; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.ScheduledReporter; import com.codahale.metrics.Slf4jReporter; import java.io.File; import java.util.Locale; import java.util.concurrent.TimeUnit; import org.slf4j.LoggerFactory; import storm.applications.util.config.Configuration; import static storm.applications.util.config.Configuration.*; /** * * @author mayconbordin */ public class MetricsFactory { public static final String CONSOLE_REPORTER = "console"; public static final String CSV_REPORTER = "csv"; public static final String SLF4J_REPORTER = "slf4j"; public static MetricRegistry createRegistry(Configuration config) { if (!config.getBoolean(METRICS_ENABLED, false)) return null; MetricRegistry registry = new MetricRegistry(); String reporterType = config.getString(METRICS_REPORTER, CONSOLE_REPORTER); ScheduledReporter reporter; switch (reporterType) { case SLF4J_REPORTER: reporter = Slf4jReporter.forRegistry(registry) .outputTo(LoggerFactory.getLogger("storm.applications.metrics")) .convertRatesTo(TimeUnit.SECONDS) .convertDurationsTo(TimeUnit.MILLISECONDS) .build(); break; case CSV_REPORTER: String outDir = config.getString(METRICS_OUTPUT, "/tmp"); reporter = CsvReporter.forRegistry(registry) .formatFor(Locale.US) .convertRatesTo(TimeUnit.SECONDS) .convertDurationsTo(TimeUnit.MILLISECONDS) .build(new File(outDir)); break; default: reporter = ConsoleReporter.forRegistry(registry) .convertRatesTo(TimeUnit.SECONDS) .convertDurationsTo(TimeUnit.MILLISECONDS) .build(); break; } int interval = config.getInt(METRICS_INTERVAL_VALUE, 5); TimeUnit unit = TimeUnit.valueOf(config.getString(METRICS_INTERVAL_UNIT, "SECONDS").toUpperCase()); reporter.start(interval, unit); return registry; } }