Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 使用Spring Boot将系统度量发送到Graphite_Spring Boot_Graphite - Fatal编程技术网

Spring boot 使用Spring Boot将系统度量发送到Graphite

Spring boot 使用Spring Boot将系统度量发送到Graphite,spring-boot,graphite,Spring Boot,Graphite,Spring Boot actuator在/metrics中公开了许多有用的指标,例如正常运行时间、内存使用率、GC计数 使用Dropwizard Metrics集成时,只有其中的一个子集被发送到Graphite。具体而言,只有计数器和仪表 有没有办法将这些其他指标发布到graphite 报告建议,应该有可能: Dropwizard“Metrics”库的用户会发现Spring引导指标会自动发布到com.codahale.Metrics.MetricRegistry Spring boot创建的系

Spring Boot actuator在
/metrics
中公开了许多有用的指标,例如正常运行时间、内存使用率、GC计数

使用Dropwizard Metrics集成时,只有其中的一个子集被发送到Graphite。具体而言,只有计数器和仪表

有没有办法将这些其他指标发布到graphite

报告建议,应该有可能:

Dropwizard“Metrics”库的用户会发现Spring引导指标会自动发布到com.codahale.Metrics.MetricRegistry


Spring boot创建的系统度量不会自动报告,因为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);   
    });
}
@Autowired
私有系统PublicMetrics系统PublicMetrics;
专用无效注册表系统(MetricRegistry MetricRegistry){
systemPublicMetrics.metrics().forEach(m->{
仪表测量仪表=()->m.getValue().longValue();
register(m.getName(),metricGauge);
});
}
我已经定义了
Gauge
,并不是所有的系统指标都应该添加为Gauge。e、 g.计数器应用于捕获计数值


如果你不想使用弹簧靴。使用jvm可以包括
metrics-jvm
开箱即用,以捕获jvm级别的指标。

这里有一个解决方案,可以在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);

    }
}

但在这种特殊情况下,它实际上是不必要的。

这不会重复发送相同的初始值吗?不会,
systemPublicMetrics
在后台更新,reporter将根据报告间隔获得不同的值。我还没有测试过这个。你可以测试和确认。非常确定这确实一遍又一遍地记录相同的值
systemPublicMetrics.metrics()
不返回指向更改值的指针列表,它返回指标当前状态的快照,因此lambda仅捕获初始值。您需要有lambda capture
systemPublicMetrics
。我也有同样的问题,请检查我对问题的回答。不想重复回答。
    <dependency>
        <groupId>com.ryantenney.metrics</groupId>
        <artifactId>metrics-spring</artifactId>
        <version>3.1.3</version>
    </dependency>