使用Spring Boot 2.0时将度量标准导出到文件

时间:2018-05-05 19:30:04

标签: spring-boot metrics micrometer

我正在寻找一种方法将Spring Boot指标导出到Spring Boot 2中的文件。

在Spring Boot 1.5.10中,我们使用了一个自定义 MetricsExporter 类来实现 MetricWriter ,并覆盖set和increment方法以使用记录器编写指标。我们使用了日志文件,因为我们有一种不同的机制可以在以后处理日志文件以进行度量分析。

我们还使用了MetricsConfig类,该类使用bean MetricsEndpointMetricReader 从自定义配置类中的metrics端点读取器读取指标。

但是,当我们升级到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);
    }
}

2 个答案:

答案 0 :(得分:4)

您可以实施自定义MeterRegistry并将其连接为@BeanMeterRegistry实现的作用之一是将展示格式定义到特定的监视系统(在您的情况下,是日志)。

这是一个开始:

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,issue处于打开状态,以提供开箱即用的LogMeterRegistry

答案 1 :(得分:0)

如果您使用的是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版本,请尝试在microm-core的pom.xml中声明1.1.x的版本

    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-core</artifactId>
        <version>1.1.3</version>
    </dependency>