Экспорт показателей в файлы при использовании Spring Boot 2.0

Я ищу способ экспортировать показатели загрузки Spring в файл в Spring Boot 2.

В Spring Boot 1.5.10 мы использовали класс Custom MetricsExporter, который реализует MetricWriter и переопределяет методы набора и увеличения для записи показателей с помощью средств ведения журнала. Мы использовали файл журнала, потому что у нас есть другой механизм для обработки файла журнала позже для анализа показателей.

Мы также использовали класс 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);
    }
}

person Chuck Bartoski    schedule 05.05.2018    source источник
comment
Я также использую Spring boot 1.5 с такой же конфигурацией. Вы периодически записываете это в какой-нибудь файл? LoggingMeterRegistry недоступен в версии 1.5. Как ты этого добился?   -  person San    schedule 08.08.2020


Ответы (2)


Вы можете реализовать собственный 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.

person jkschneider    schedule 16.05.2018

Если вы используете 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);
}

Если вы не используете более высокую версию весенней загрузки, попробуйте объявить версию 1.1.x из в микрометрическом ядре вашего pom.xml

    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-core</artifactId>
        <version>1.1.3</version>
    </dependency> 
person JaskeyLam    schedule 23.09.2019