MetricsConfiguration.java 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package rocks.zipcode.io.config;
  2. import io.github.jhipster.config.JHipsterProperties;
  3. import com.codahale.metrics.JmxReporter;
  4. import com.codahale.metrics.JvmAttributeGaugeSet;
  5. import com.codahale.metrics.MetricRegistry;
  6. import com.codahale.metrics.Slf4jReporter;
  7. import com.codahale.metrics.health.HealthCheckRegistry;
  8. import com.codahale.metrics.jvm.*;
  9. import com.ryantenney.metrics.spring.config.annotation.EnableMetrics;
  10. import com.ryantenney.metrics.spring.config.annotation.MetricsConfigurerAdapter;
  11. import com.zaxxer.hikari.HikariDataSource;
  12. import io.prometheus.client.CollectorRegistry;
  13. import io.prometheus.client.dropwizard.DropwizardExports;
  14. import io.prometheus.client.exporter.MetricsServlet;
  15. import org.slf4j.Logger;
  16. import org.slf4j.LoggerFactory;
  17. import org.slf4j.Marker;
  18. import org.slf4j.MarkerFactory;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.boot.web.servlet.ServletContextInitializer;
  21. import org.springframework.context.annotation.*;
  22. import javax.annotation.PostConstruct;
  23. import javax.servlet.ServletContext;
  24. import java.lang.management.ManagementFactory;
  25. import java.util.concurrent.TimeUnit;
  26. @Configuration
  27. @EnableMetrics(proxyTargetClass = true)
  28. public class MetricsConfiguration extends MetricsConfigurerAdapter implements ServletContextInitializer {
  29. private static final String PROP_METRIC_REG_JVM_MEMORY = "jvm.memory";
  30. private static final String PROP_METRIC_REG_JVM_GARBAGE = "jvm.garbage";
  31. private static final String PROP_METRIC_REG_JVM_THREADS = "jvm.threads";
  32. private static final String PROP_METRIC_REG_JVM_FILES = "jvm.files";
  33. private static final String PROP_METRIC_REG_JVM_BUFFERS = "jvm.buffers";
  34. private static final String PROP_METRIC_REG_JVM_ATTRIBUTE_SET = "jvm.attributes";
  35. private final Logger log = LoggerFactory.getLogger(MetricsConfiguration.class);
  36. private MetricRegistry metricRegistry = new MetricRegistry();
  37. private HealthCheckRegistry healthCheckRegistry = new HealthCheckRegistry();
  38. private final JHipsterProperties jHipsterProperties;
  39. private HikariDataSource hikariDataSource;
  40. public MetricsConfiguration(JHipsterProperties jHipsterProperties) {
  41. this.jHipsterProperties = jHipsterProperties;
  42. }
  43. @Autowired(required = false)
  44. public void setHikariDataSource(HikariDataSource hikariDataSource) {
  45. this.hikariDataSource = hikariDataSource;
  46. }
  47. @Override
  48. @Bean
  49. public MetricRegistry getMetricRegistry() {
  50. return metricRegistry;
  51. }
  52. @Override
  53. @Bean
  54. public HealthCheckRegistry getHealthCheckRegistry() {
  55. return healthCheckRegistry;
  56. }
  57. @PostConstruct
  58. public void init() {
  59. log.debug("Registering JVM gauges");
  60. metricRegistry.register(PROP_METRIC_REG_JVM_MEMORY, new MemoryUsageGaugeSet());
  61. metricRegistry.register(PROP_METRIC_REG_JVM_GARBAGE, new GarbageCollectorMetricSet());
  62. metricRegistry.register(PROP_METRIC_REG_JVM_THREADS, new ThreadStatesGaugeSet());
  63. metricRegistry.register(PROP_METRIC_REG_JVM_FILES, new FileDescriptorRatioGauge());
  64. metricRegistry.register(PROP_METRIC_REG_JVM_BUFFERS, new BufferPoolMetricSet(ManagementFactory.getPlatformMBeanServer()));
  65. metricRegistry.register(PROP_METRIC_REG_JVM_ATTRIBUTE_SET, new JvmAttributeGaugeSet());
  66. if (hikariDataSource != null) {
  67. log.debug("Monitoring the datasource");
  68. // remove the factory created by HikariDataSourceMetricsPostProcessor until JHipster migrate to Micrometer
  69. hikariDataSource.setMetricsTrackerFactory(null);
  70. hikariDataSource.setMetricRegistry(metricRegistry);
  71. }
  72. if (jHipsterProperties.getMetrics().getJmx().isEnabled()) {
  73. log.debug("Initializing Metrics JMX reporting");
  74. JmxReporter jmxReporter = JmxReporter.forRegistry(metricRegistry).build();
  75. jmxReporter.start();
  76. }
  77. if (jHipsterProperties.getMetrics().getLogs().isEnabled()) {
  78. log.info("Initializing Metrics Log reporting");
  79. Marker metricsMarker = MarkerFactory.getMarker("metrics");
  80. final Slf4jReporter reporter = Slf4jReporter.forRegistry(metricRegistry)
  81. .outputTo(LoggerFactory.getLogger("metrics"))
  82. .markWith(metricsMarker)
  83. .convertRatesTo(TimeUnit.SECONDS)
  84. .convertDurationsTo(TimeUnit.MILLISECONDS)
  85. .build();
  86. reporter.start(jHipsterProperties.getMetrics().getLogs().getReportFrequency(), TimeUnit.SECONDS);
  87. }
  88. }
  89. @Override
  90. public void onStartup(ServletContext servletContext) {
  91. if (jHipsterProperties.getMetrics().getPrometheus().isEnabled()) {
  92. String endpoint = jHipsterProperties.getMetrics().getPrometheus().getEndpoint();
  93. log.debug("Initializing prometheus metrics exporting via {}", endpoint);
  94. CollectorRegistry.defaultRegistry.register(new DropwizardExports(metricRegistry));
  95. servletContext
  96. .addServlet("prometheusMetrics", new MetricsServlet(CollectorRegistry.defaultRegistry))
  97. .addMapping(endpoint);
  98. }
  99. }
  100. }