//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.core.metrics; import java.io.File; import java.io.IOException; import java.util.Map; import java.util.concurrent.TimeUnit; import org.elasticsearch.metrics.ElasticsearchReporter; import org.slf4j.LoggerFactory; import uk.gov.dstl.baleen.exceptions.BaleenException; import com.codahale.metrics.ConsoleReporter; import com.codahale.metrics.CsvReporter; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.ScheduledReporter; import com.codahale.metrics.Slf4jReporter; /** * Helper utility class to capture the creation of the different reporter types. * See each {@link MetricsFactory} for configuration details and examples. * * * */ public class ReporterUtils { private ReporterUtils() { } /** * Create a new console reporter. * * @param metricRegistry * the registry to report on * @param config * the configuration map (see {@link MetricsFactory}) * @return the reporter instance */ public static ScheduledReporter createConsoleReporter(MetricRegistry metricRegistry, Map<String, Object> config) { return ConsoleReporter.forRegistry(metricRegistry).convertRatesTo(getRatesUnit(config)) .convertDurationsTo(getDurationUnit(config)).build(); } /** * Create a new CSV reporter. * * @param metricRegistry * the registry to report on * @param config * the configuration map (see {@link MetricsFactory}) * @return the reporter instance */ public static ScheduledReporter createCsvReporter(MetricRegistry metricRegistry, Map<String, Object> config) throws BaleenException{ String directoryPath = (String) config.getOrDefault("directory", "metrics"); File directory = new File(directoryPath); if (!directory.exists() && !directory.mkdirs()){ throw new BaleenException("Unable to create directories for CSV Reporter"); } return CsvReporter.forRegistry(metricRegistry).convertRatesTo(getRatesUnit(config)) .convertDurationsTo(getDurationUnit(config)).build(directory); } /** * Create a new CSV reporter. * * @param metricRegistry * the registry to report on * @param config * the configuration map (see {@link MetricsFactory}) * @return the reporter instance */ public static ScheduledReporter createSlf4jReporter(MetricRegistry metricRegistry, Map<String, Object> config) { String loggerName = (String) config.getOrDefault("logger", "metrics:reporter"); return Slf4jReporter.forRegistry(metricRegistry).convertRatesTo(getRatesUnit(config)) .convertDurationsTo(getDurationUnit(config)).outputTo(LoggerFactory.getLogger(loggerName)).build(); } /** * Create a new ElasticSearch reporter. * * @param metricRegistry * the registry to report on * @param config * the configuration map (see {@link MetricsFactory}) * @return the reporter instance */ public static ScheduledReporter createElasticSearchReporter(MetricRegistry metricRegistry, Map<String, Object> config) throws BaleenException { try { String server = (String) config.getOrDefault("server", "localhost:9200"); String index = (String) config.getOrDefault("index", "metrics"); int timeout = (int) config.getOrDefault("timeout", 1000); int bulkSize = (int) config.getOrDefault("bulkSize", 2500); return ElasticsearchReporter.forRegistry(metricRegistry).convertRatesTo(getRatesUnit(config)) .convertDurationsTo(getDurationUnit(config)).bulkSize(bulkSize).hosts(server).index(index) .timeout(timeout).build(); } catch (IOException e) { throw new BaleenException("Unable to create ElasticSearch reporter", e); } } private static TimeUnit getDurationUnit(Map<String, Object> config) { String durationUnit = (String) config.getOrDefault("durationUnit", TimeUnit.SECONDS.name()); return TimeUnit.valueOf(durationUnit.toUpperCase()); } private static TimeUnit getRatesUnit(Map<String, Object> config) { String rateUnit = (String) config.getOrDefault("rateUnit", TimeUnit.SECONDS.name()); return TimeUnit.valueOf(rateUnit.toUpperCase()); } }