エンドポイント/metrics
に表示されるすべてのメトリックをStatsdMetricWriter
にエクスポートしようとしています。
これまでに次の構成クラスがあります。
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);
}
}
これは、Statsdに追加したすべてのメトリックを書き込みますが、/metrics
エンドポイントに表示されるシステム/ JVMメトリックも送信したいと思います。
何が足りないのですか?
私は同じ問題を抱えていて、ここで解決策を見つけました: https://github.com/tzolov/export-metrics-example
設定にMetricsEndpointMetricReader
を追加するだけで、e/metricsエンドポイントで利用可能なすべてのものがStatsdMetricWriter
に公開されます。
これは、Spring Boot1.3.xおよびdropwizardメトリックの完全な設定例です-jvm3.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);
}
}
Spring-Bootコードで見たものから、CounterService
およびGaugeService
実装への呼び出しのみがdropwizardのMetricRegistry
に転送されます。
したがって、すでに観察したように、counter.*
エンドポイントからのgauge.*
および/metrics
メトリックのみがStatsd
になります。
システムおよびJVMメトリックは、カウンターまたはゲージサービスを使用しないカスタムSystemPublicMetrics
クラスを介して公開されます。
より簡単な解決策があるかどうかはわかりませんが(Springチームの誰かがコメントするかもしれません)、それを行う1つの方法(Spring-Boot固有ではありません)は、システム統計をMetricRegistry
に定期的に書き込むスケジュールされたタスクを使用することです。
JVMメトリックを登録するには、codehale.metrics.jvmライブラリによって提供されるJVM関連のMetricSetを使用できます。ゲージかカウンターかを指定せずに、セット全体を追加するだけです。
これは、jvm関連のメトリックを登録している私のサンプルコードです。
@Configuration
@EnableMetrics(proxyTargetClass = true)
public class MetricsConfig {
@Autowired
private StatsdProperties statsdProperties;
@Autowired
private MetricsEndpoint metricsEndpoint;
@Autowired
private DataSourcePublicMetrics dataSourcePublicMetrics;
@Bean
@ExportMetricReader
public MetricReader metricReader() {
return new MetricRegistryMetricReader(metricRegistry());
}
public MetricRegistry metricRegistry() {
final MetricRegistry metricRegistry = new MetricRegistry();
//jvm metrics
metricRegistry.register("jvm.gc",new GarbageCollectorMetricSet());
metricRegistry.register("jvm.mem",new MemoryUsageGaugeSet());
metricRegistry.register("jvm.thread-states",new ThreadStatesGaugeSet());
return metricRegistry;
}
@Bean
@ConditionalOnProperty(prefix = "metrics.writer.statsd", name = {"Host", "port"})
@ExportMetricWriter
public MetricWriter statsdMetricWriter() {
return new StatsdMetricWriter(
statsdProperties.getPrefix(),
statsdProperties.getHost(),
statsdProperties.getPort()
);
}
}
注:SpringBootバージョン1.3.0.M4を使用しています
楽しい! (dropwizardメトリックとしてコンソールにログインしたパブリックメトリックを参照してください)
@Configuration
@EnableMetrics
@EnableScheduling
public class MetricsReporter extends MetricsConfigurerAdapter {
@Autowired private SystemPublicMetrics systemPublicMetrics;
private MetricRegistry metricRegistry;
@Scheduled(fixedDelay = 5000)
void exportPublicMetrics() {
for (Metric<?> metric : systemPublicMetrics.metrics()) {
Counter counter = metricRegistry.counter(metric.getName());
counter.dec(counter.getCount());
counter.inc(Double.valueOf(metric.getValue().toString()).longValue());
}
}
@Override
public void configureReporters(MetricRegistry metricRegistry) {
this.metricRegistry = metricRegistry;
ConsoleReporter.forRegistry(metricRegistry).build().start(10, TimeUnit.SECONDS);
}
}