Exporting Spring Boot Actuator Metrics (& Dropwizard Metrics) to Statsd

spring-boot, spring-boot-actuator

Solution

I had the same problem and found a solution here: https://github.com/tzolov/export-metrics-example

Just add a `MetricsEndpointMetricReader` to your config and everything available at th e/metrics endpoint will be published to the `StatsdMetricWriter`.

Here is a complete example config for spring boot 1.3.x and dropwizard metrics-jvm 3.1.x:

import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.jvm.GarbageCollectorMetricSet;
import com.codahale.metrics.jvm.MemoryUsageGaugeSet;
import com.codahale.metrics.jvm.ThreadStatesGaugeSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.actuate.autoconfigure.ExportMetricWriter;
import org.springframework.boot.actuate.endpoint.MetricsEndpoint;
import org.springframework.boot.actuate.endpoint.MetricsEndpointMetricReader;
import org.springframework.boot.actuate.metrics.Metric;
import org.springframework.boot.actuate.metrics.statsd.StatsdMetricWriter;
import org.springframework.boot.actuate.metrics.writer.Delta;
import org.springframework.boot.actuate.metrics.writer.MetricWriter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MetricsConfiguration {

  @Bean
  public MetricRegistry metricRegistry() {
    final MetricRegistry metricRegistry = new MetricRegistry();

    metricRegistry.register("jvm.memory",new MemoryUsageGaugeSet());
    metricRegistry.register("jvm.thread-states",new ThreadStatesGaugeSet());
    metricRegistry.register("jvm.garbage-collector",new GarbageCollectorMetricSet());

    return metricRegistry;
  }

  /*
   * Reading all metrics that appear on the /metrics endpoint to expose them to metrics writer beans.
   */
  @Bean
  public MetricsEndpointMetricReader metricsEndpointMetricReader(final MetricsEndpoint metricsEndpoint) {
    return new MetricsEndpointMetricReader(metricsEndpoint);
  }

  @Bean
  @ConditionalOnProperty(prefix = "statsd", name = {"prefix", "host", "port"})
  @ExportMetricWriter
  public MetricWriter statsdMetricWriter(@Value("${statsd.prefix}") String statsdPrefix,
                                     @Value("${statsd.host}") String statsdHost,
                                     @Value("${statsd.port}") int statsdPort) {
    return new StatsdMetricWriter(statsdPrefix, statsdHost, statsdPort);
  }

}

Problem

I'm trying to export all of the metrics which are visible at the endpoint `/metrics` to a `StatsdMetricWriter`. I've got the following configuration class so far: ``` package com.tonyghita.metricsdriven.service.config; import com.codahale.metrics.MetricRegistry; import com.ryantenney.metrics.spring.config.annotation.EnableMetrics; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.actuate.autoconfigure.ExportMetricReader; import org.springframework.boot.actuate.autoconfigure.ExportMetricWriter; import org.springframework.boot.actuate.metrics.reader.MetricReader; import org.springframework.boot.actuate.metrics.reader.MetricRegistryMetricReader; import org.springframework.boot.actuate.metrics.statsd.StatsdMetricWriter; import org.springframework.boot.actuate.metrics.writer.MetricWriter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @EnableMetrics(proxyTargetClass = true) public class MetricsConfig { private static final Logger LOGGER = LoggerFactory.getLogger(MetricsConfig.class); @Value("${statsd.host:localhost}") private String host = "localhost"; @Value("${statsd.port:8125}") private int port; @Autowired private MetricRegistry metricRegistry; @Bean @ExportMetricReader public MetricReader metricReader() { return new MetricRegistryMetricReader(metricRegistry); } @Bean @ExportMetricWriter public MetricWriter metricWriter() { LOGGER.info("Configuring StatsdMetricWriter to export to {}:{}", host, port); return new StatsdMetricWriter(host, port); } } ``` Which writes all of the metrics which I've added to Statsd, but I'd like to also send the system/JVM metrics that are visible on the `/metrics` endpoint. What am I missing?

Original source