package com.mycompany.cevent.config; import com.codahale.metrics.JmxReporter; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.graphite.Graphite; import com.codahale.metrics.graphite.GraphiteReporter; import com.codahale.metrics.health.HealthCheckRegistry; import com.codahale.metrics.jvm.*; import com.ryantenney.metrics.spring.config.annotation.EnableMetrics; import com.ryantenney.metrics.spring.config.annotation.MetricsConfigurerAdapter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import javax.annotation.PostConstruct; import javax.inject.Inject; import java.lang.management.ManagementFactory; import java.net.InetSocketAddress; import java.util.concurrent.TimeUnit; @Configuration @EnableMetrics(proxyTargetClass = true) public class MetricsConfiguration extends MetricsConfigurerAdapter implements EnvironmentAware { private static final Logger log = LoggerFactory.getLogger(MetricsConfiguration.class); private static final MetricRegistry METRIC_REGISTRY = new MetricRegistry(); private static final HealthCheckRegistry HEALTH_CHECK_REGISTRY = new HealthCheckRegistry(); private RelaxedPropertyResolver propertyResolver; @Override public void setEnvironment(Environment environment) { this.propertyResolver = new RelaxedPropertyResolver(environment, "metrics."); } @Override @Bean public MetricRegistry getMetricRegistry() { return METRIC_REGISTRY; } @Override @Bean public HealthCheckRegistry getHealthCheckRegistry() { return HEALTH_CHECK_REGISTRY; } @PostConstruct public void init() { log.debug("Registring JVM gauges"); METRIC_REGISTRY.register("jvm.memory", new MemoryUsageGaugeSet()); METRIC_REGISTRY.register("jvm.garbage", new GarbageCollectorMetricSet()); METRIC_REGISTRY.register("jvm.threads", new ThreadStatesGaugeSet()); METRIC_REGISTRY.register("jvm.files", new FileDescriptorRatioGauge()); METRIC_REGISTRY.register("jvm.buffers", new BufferPoolMetricSet(ManagementFactory.getPlatformMBeanServer())); if (propertyResolver.getProperty("jmx.enabled", Boolean.class, false)) { log.info("Initializing Metrics JMX reporting"); final JmxReporter jmxReporter = JmxReporter.forRegistry(METRIC_REGISTRY).build(); jmxReporter.start(); } } @Configuration @ConditionalOnClass(Graphite.class) public static class GraphiteRegistry implements EnvironmentAware { @Inject private MetricRegistry metricRegistry; private RelaxedPropertyResolver propertyResolver; @Override public void setEnvironment(Environment environment) { this.propertyResolver = new RelaxedPropertyResolver(environment, "metrics.graphite"); } @PostConstruct private void init() { Boolean graphiteEnabled = propertyResolver.getProperty("enabled", Boolean.class, false); if (graphiteEnabled) { log.info("Initializing Metrics Graphite reporting"); String graphiteHost = propertyResolver.getRequiredProperty("host"); Integer graphitePort = propertyResolver.getRequiredProperty("port", Integer.class); Graphite graphite = new Graphite(new InetSocketAddress(graphiteHost, graphitePort)); GraphiteReporter graphiteReporter = GraphiteReporter.forRegistry(metricRegistry) .convertRatesTo(TimeUnit.SECONDS) .convertDurationsTo(TimeUnit.MILLISECONDS) .build(graphite); graphiteReporter.start(1, TimeUnit.MINUTES); } } } }