簡體   English   中英

使用 Spring Boot 2.0 時將指標導出到文件

[英]Exporting Metrics to files when using Spring Boot 2.0

我正在尋找一種將 spring 引導指標導出到 Spring 引導 2 中的文件的方法。

在 Spring Boot 1.5.10 中,我們使用了自定義MetricsExporter class,它實現了 MetricWriter並覆蓋了 set 和 increment 方法來使用記錄器寫入指標。 我們使用了日志文件,因為我們有不同的機制來處理日志文件,以便稍后進行度量分析。

我們還使用了 MetricsConfig class,它使用 bean MetricsEndpointMetricReader從自定義配置 class 中的指標端點讀取器讀取指標。

但是,當我們升級到 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 Class 如下:

@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);
    }
}

您可以實現自定義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

如果您使用的是 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> 

我想做一些類似於Jonathan建議的事情,但我想使用 Slf4j MDC 在一個日志行上發布所有指標。

我 output 我的日志為 json(在我的情況下為 AWS CloudWatch),因此我可以繪制查詢並可視化數據。

import io.micrometer.core.instrument.Clock;
import io.micrometer.core.instrument.step.StepMeterRegistry;
import io.micrometer.core.instrument.step.StepRegistryConfig;
import io.micrometer.core.instrument.util.NamedThreadFactory;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

import java.text.DecimalFormat;
import java.util.concurrent.TimeUnit;


public class LogMeterRegistry extends StepMeterRegistry {
    private static final Logger logger = LoggerFactory.getLogger(LogMeterRegistry.class);
    private final DecimalFormat df;
    public LogMeterRegistry(CustomRegistryConfig config, Clock clock) {
        super(config, clock);
        start(new NamedThreadFactory("log-meter-registry-publisher"));
        df = new DecimalFormat("0");
        df.setMaximumFractionDigits(3);
    }

    @Override
    protected void publish() {
        MDC.put("server", getHostName());
        getMeters().forEach(meter -> meter.measure().forEach(
                measurement -> MDC.put(meter.getId().getName(), df.format(measurement.getValue()))));
        logger.info("metrics");
        MDC.clear();
    }

    @Override
    protected TimeUnit getBaseTimeUnit() {
        return TimeUnit.MILLISECONDS;
    }
    public interface CustomRegistryConfig extends StepRegistryConfig {

        CustomRegistryConfig DEFAULT = k -> null;

        @Override
        default String prefix() {
            return "";
        }

    }
}

所以使用以下指標:

    new JvmHeapPressureMetrics().bindTo(meterRegistry);
    new JvmThreadMetrics().bindTo(meterRegistry);
    new UptimeMetrics().bindTo(meterRegistry);
    new ProcessorMetrics().bindTo(meterRegistry);

json output 如下所示:

{
    "@timestamp": "2022-xx-xxT11:03:00.027Z",
    "level": "INFO",
    "message": "metrics",
    "process.thread.name": "log-meter-registry-publisher",
    "log.logger": "MyClass",
    "jvm.gc.overhead": "0",
    "jvm.memory.usage.after.gc": "0.036",
    "jvm.threads.daemon": "46",
    "jvm.threads.live": "47",
    "jvm.threads.peak": "54",
    "jvm.threads.states": "23",
    "process.cpu.usage": "0.001",
    "process.start.time": "1663065827068",
    "process.uptime": "1152989",
    "server": "MyServer.localdomain",
    "system.cpu.count": "12",
    "system.cpu.usage": "0.051",
    "system.load.average.1m": "2.351"
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM