使用Spring-Boot将系统指标发送到Graphite

时间:2015-06-15 18:55:02

标签: spring-boot graphite

Spring-Boot执行器在/metrics公开了许多有用的指标,例如正常运行时间,内存使用情况,GC计数。

使用Dropwizard指标集成时,只有其中一部分会发送到Graphite。具体而言,只有计数器和仪表

有没有办法让这些其他指标发布到石墨?

documentation表明它应该是可能的:

  

Dropwizard'Metrics'库的用户会发现Spring Boot指标会自动发布到com.codahale.metrics.MetricRegistry

2 个答案:

答案 0 :(得分:3)

Spring引导创建的系统度量标准不会自动报告,因为MetricsRegistry对这些度量标准一无所知。

您应该在应用程序启动时手动注册这些指标。

@Autowired
private SystemPublicMetrics systemPublicMetrics;

private void registerSystemMetrics(MetricRegistry metricRegistry) {
    systemPublicMetrics.metrics().forEach(m -> {
        Gauge<Long> metricGauge = () -> m.getValue().longValue();
        metricRegistry.register(m.getName(), metricGauge);   
    });
}

我已定义Gauge,并非所有系统指标都应添加为计量器。例如计数器应该用于捕获计数值。

如果您不想使用Spring启动。使用可以包括metrics-jvm开箱即用以捕获JVM级别指标。

答案 1 :(得分:1)

这是一个解决方案,可以更新关于Spring指标变化的DropWizard指标。它也可以在不打开@EnableScheduling的情况下执行此操作:

@EnableMetrics
@Configuration
public class ConsoleMetricsConfig extends MetricsConfigurerAdapter {

    @Autowired
    private SystemPublicMetrics systemPublicMetrics;

    @Override
    public void configureReporters(MetricRegistry metricRegistry) {

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

        metricRegistry.register("spring.boot", (MetricSet) () -> {
            final Map<String, Metric> gauges = new HashMap<String, Metric>();

            for (final org.springframework.boot.actuate.metrics.Metric<?> springMetric : 
                    systemPublicMetrics.metrics()) {

                gauges.put(springMetric.getName(), (Gauge<Object>) () -> {

                    return systemPublicMetrics.metrics().stream()
                        .filter(m -> StringUtils.equals(m.getName(), springMetric.getName()))
                        .map(m -> m.getValue())
                        .findFirst()
                        .orElse(null);

                });
            }
            return Collections.unmodifiableMap(gauges);
        });

        registerReporter(ConsoleReporter
            .forRegistry(metricRegistry)
            .convertRatesTo(TimeUnit.SECONDS)
            .convertDurationsTo(TimeUnit.MILLISECONDS)
            .build())
            .start(intervalSecs, TimeUnit.SECONDS);

    }
}

它使用com.ryantenney.metrics库来启用其他Spring注释支持和DropWizard记者:

    <dependency>
        <groupId>com.ryantenney.metrics</groupId>
        <artifactId>metrics-spring</artifactId>
        <version>3.1.3</version>
    </dependency>

但在这种特殊情况下实际上没有必要。