首页 > 解决方案 > 使用 Spring Boot 2.0 时将指标导出到文件

问题描述

我正在寻找一种将 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-bootmetricsmicrometer

解决方案


您可以实现自定义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;
    }
}

Micrometer 1.1 存在一个问题,可提供开箱即用的LogMeterRegistry.


推荐阅读