使用 Spring Boot 2.0 时将指标导出到文件
Posted
技术标签:
【中文标题】使用 Spring Boot 2.0 时将指标导出到文件【英文标题】:Exporting Metrics to files when using Spring Boot 2.0 【发布时间】:2018-10-16 00:36:12 【问题描述】:我正在寻找一种将 Spring Boot 指标导出到 Spring Boot 2 中的文件的方法。
在 Spring Boot 1.5.10 中,我们使用了自定义 MetricsExporter 类,该类实现了 MetricWriter 并覆盖了 set 和 increment 方法来使用记录器写入指标。我们使用日志文件是因为我们有不同的机制来处理日志文件,以便稍后进行指标分析。
我们还使用了 MetricsConfig 类,它使用 bean MetricsEndpointMetricReader 从自定义配置类中的指标端点读取器读取指标。
但是,当我们升级到 Spring Boot 2.0.1 时,这些都不起作用,因为现有指标类发生了重大变化。
有人可以帮助我们在使用 Spring Boot 2.0 时如何导出指标并使用记录器编写它们吗?
@ExportMetricWriter
public class MetricsExporter implements MetricWriter
private static Logger LOGGER = LoggerFactory.getLogger("metrics");
@Override
public void set(Metric<?> value)
// Write the Gauge metrics to log file
LOGGER.info("timestamp=, name=, value=", value.getTimestamp(), value.getName(),value.getValue());
@Override
public void increment(Delta<?> delta)
//Write the Counter metrics to log file
LOGGER.info("timestamp=, name=, value=", delta.getTimestamp(), delta.getName(),delta.getValue());
@Override
public void reset(String metricName)
MetricsConfig类如下,
@Configuration
public class MetricsConfig
//Define the MetricsExporter bean to export metrics at regular interval to a log file
@Bean
public MetricsExporter metricsExporter()
return new MetricsExporter();
//Define the MetricsEndpointMetricReader bean to export both push(counters and gauges) and pull(public) metrics
@Bean
public MetricsEndpointMetricReader metricsEndpointMetricReader(MetricsEndpoint metricsEndpoint)
return new MetricsEndpointMetricReader(metricsEndpoint);
【问题讨论】:
我也在使用具有相同配置的 spring boot 1.5。您是否定期将其记录到某个文件中?LoggingMeterRegistry
不适用于 v1.5。您是如何做到这一点的?
【参考方案1】:
您可以实现自定义MeterRegistry
并将其连接为@Bean
。 MeterRegistry
实现的作用之一是定义特定监控系统(在您的情况下是日志)的展示格式。
这是一个开始:
public class LogMeterRegistry extends StepMeterRegistry
private final Logger logger = LoggerFactory.getLogger(LogMeterRegistry.class);
/**
* @param step Governs on what frequency metrics are logged
*/
public LogMeterRegistry(Duration step)
super(new StepRegistryConfig()
@Override
public String prefix()
return "log";
@Override
public String get(String key)
return null;
@Override
public Duration step()
return step;
, Clock.SYSTEM);
@Override
protected void publish()
for (Meter meter : getMeters())
logger.info(meter.getId().toString());
for (Measurement measurement : meter.measure())
logger.info(measurement.getStatistic().toString() + "=" + measurement.getValue());
@Override
protected TimeUnit getBaseTimeUnit()
return TimeUnit.SECONDS;
issue 对 Micrometer 1.1 开放,以提供开箱即用的 LogMeterRegistry
。
【讨论】:
【参考方案2】:如果您使用的是 Spring Boot 2.x,即 Micrometer >= 1.1.0 的版本,您可以简单地配置一个类似的 bean
@Bean
LoggingMeterRegistry loggingMeterRegistry()
return new LoggingMeterRegistry();//by default, it will log metrics every 1m
您还可以配置不同的周期周期,例如:
@Bean
LoggingMeterRegistry loggingMeterRegistry()
return new LoggingMeterRegistry(new LoggingRegistryConfig()
@Override
public Duration step()
return Duration.ofSeconds(10); // log every 10 seconds
@Override
public String get(String key)
return null;
, Clock.SYSTEM);
如果你没有使用足够高的 spring boot 版本,请尝试在你的 pom.xml 中声明 micrometer-core 的 1.1.x 版本
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
<version>1.1.3</version>
</dependency>
【讨论】:
以上是关于使用 Spring Boot 2.0 时将指标导出到文件的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 2.0 Prometheus 向后兼容
spring-boot 指标与 spring-cloud 指标
Spring Boot 2.0:Spring Boot 2.0尝鲜-动态 Banner