Spring boot 使用Spring Boot将系统度量发送到Graphite
Spring Boot actuator在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创建的系
/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 capturesystemPublicMetrics
。我也有同样的问题,请检查我对问题的回答。不想重复回答。
<dependency>
<groupId>com.ryantenney.metrics</groupId>
<artifactId>metrics-spring</artifactId>
<version>3.1.3</version>
</dependency>