content: package alien4cloud.webconfiguration;
  
  import java.lang.management.ManagementFactory;
  
  import javax.annotation.PostConstruct;
  import javax.annotation.PreDestroy;
  
  import lombok.extern.slf4j.Slf4j;
  
  import org.springframework.boot.bind.RelaxedPropertyResolver;
  import org.springframework.boot.web.servlet.FilterRegistrationBean;
  import org.springframework.boot.web.servlet.ServletRegistrationBean;
  import org.springframework.context.EnvironmentAware;
  import org.springframework.context.annotation.Bean;
  import org.springframework.context.annotation.Configuration;
  import org.springframework.core.env.Environment;
  
  import com.codahale.metrics.JmxReporter;
  import com.codahale.metrics.MetricRegistry;
  import com.codahale.metrics.health.HealthCheckRegistry;
  import com.codahale.metrics.jvm.BufferPoolMetricSet;
  import com.codahale.metrics.jvm.FileDescriptorRatioGauge;
  import com.codahale.metrics.jvm.GarbageCollectorMetricSet;
  import com.codahale.metrics.jvm.MemoryUsageGaugeSet;
  import com.codahale.metrics.jvm.ThreadStatesGaugeSet;
  import com.codahale.metrics.servlets.MetricsServlet;
  import com.ryantenney.metrics.spring.config.annotation.EnableMetrics;
  import com.ryantenney.metrics.spring.config.annotation.MetricsConfigurerAdapter;
  
  @Slf4j
  @Configuration
  @EnableMetrics(proxyTargetClass = true)
  public class MetricsConfiguration extends MetricsConfigurerAdapter implements EnvironmentAware {
      private static final String ENV_METRICS = "metrics.";
      private static final String PROP_JMX_ENABLED = "jmx.enabled";
      private static final String PROP_METRIC_REG_JVM_MEMORY = "jvm.memory";
      private static final String PROP_METRIC_REG_JVM_GARBAGE = "jvm.garbage";
      private static final String PROP_METRIC_REG_JVM_THREADS = "jvm.threads";
      private static final String PROP_METRIC_REG_JVM_FILES = "jvm.files";
      private static final String PROP_METRIC_REG_JVM_BUFFERS = "jvm.buffers";
      private static final MetricRegistry METRIC_REGISTRY = new MetricRegistry();
      private static final HealthCheckRegistry HEALTH_CHECK_REGISTRY = new HealthCheckRegistry();
      private RelaxedPropertyResolver propertyResolver;
      private JmxReporter jmxReporter;
  
      @Override
      public void setEnvironment(Environment environment) {
          this.propertyResolver = new RelaxedPropertyResolver(environment, ENV_METRICS);
      }
  
      @PostConstruct
      public void init() {
          log.info("Registering JVM gauges");
          METRIC_REGISTRY.register(PROP_METRIC_REG_JVM_MEMORY, new MemoryUsageGaugeSet());
          METRIC_REGISTRY.register(PROP_METRIC_REG_JVM_GARBAGE, new GarbageCollectorMetricSet());
          METRIC_REGISTRY.register(PROP_METRIC_REG_JVM_THREADS, new ThreadStatesGaugeSet());
          METRIC_REGISTRY.register(PROP_METRIC_REG_JVM_FILES, new FileDescriptorRatioGauge());
          METRIC_REGISTRY.register(PROP_METRIC_REG_JVM_BUFFERS, new BufferPoolMetricSet(ManagementFactory.getPlatformMBeanServer()));
          if (propertyResolver.getProperty(PROP_JMX_ENABLED, Boolean.class, false)) {
              log.info("Initializing Metrics JMX reporting");
              jmxReporter = JmxReporter.forRegistry(METRIC_REGISTRY).build();
              jmxReporter.start();
          }
      }
  
      @PreDestroy
      public void destoy() {
          for (String name : METRIC_REGISTRY.getNames()) {
              METRIC_REGISTRY.remove(name);
          }
          if (jmxReporter != null) {
              jmxReporter.stop();
          }
      }
  
      @Override
      @Bean
      public MetricRegistry getMetricRegistry() {
          return METRIC_REGISTRY;
      }
  
      @Override
      @Bean
      public HealthCheckRegistry getHealthCheckRegistry() {
          return HEALTH_CHECK_REGISTRY;
      }
  
      @Bean
      public MetricsServlet metricsServlet(MetricRegistry metricRegistry) {
          return new MetricsServlet(metricRegistry);
      }
  
      @Bean
      public FilterRegistrationBean metricsFilterRegistration(MetricRegistry metricRegistry) {
          log.info("Registering Metrics filter.");
          return new FilterRegistrationBean(new MetricsFilter(METRIC_REGISTRY));
      }
  
      @Bean
      public ServletRegistrationBean metricsRegistration(MetricsServlet metricsServlet) {
          ServletRegistrationBean registration = new ServletRegistrationBean(metricsServlet);
          registration.addUrlMappings("/rest/admin/metrics/metrics/*");
          return registration;
      }
  }