天天看點

springboot如何內建Prometheus如何暴露Histogram來擷取P99等監控名額背景Micrometer

背景

springboot如何內建Prometheus我這裡不做較長的描述,要想了解內建過程,可以參考一下部落格:Spring Boot 使用 Micrometer 內建 Prometheus 監控 Java 應用性能,

這裡我講一下如果我們j需要擷取到某些監控名額的p99、p90等度量資料,比如說http請求的響應時長p99等,

Micrometer

根據名額監控的對象個數、監視目的和含義的不同,Micrometer名額類型大體可以分為Gauge、Counter、DistributionSummary、Timer四種。

這裡我重點說一下DistributionSummary。

DistributionSummary

DistributionSummary是用于跟蹤事件的分布情況,有多個名額組成:

  • count,事件的個數,聚合名額,如響應的個數
  • sum,綜合,聚合名額,如響應大小的綜合
  • histogram,分布,聚合名額,包含le标簽用于區分bucket,例如web.response.size.historgram{le=512} = 99,表示響應大小不超過512(Byte)的響應個數是99個。一般有多個bucket,如le=128,le=256,le=512,le=1024,le=+Inf等。

    每個bucket展示為一條時間序列,會得到類似下面的圖。

    springboot如何內建Prometheus如何暴露Histogram來擷取P99等監控名額背景Micrometer

    percentile(quantile),百分位數,聚合名額,包含percentile标簽用于區分不同的百分位,例如web.response.size.percentile{p=90) = 512,表示90%的響應大小都小于512。一般有多個percentile,如p50,p75,p90,p99。

    每個百分位展示為一條時間序列,會得到類似下面的圖。

    springboot如何內建Prometheus如何暴露Histogram來擷取P99等監控名額背景Micrometer

    Timer

    Timer是DistributionSummary的特化,專門用于計時類的名額,可以對記錄的時間值(duration)進行機關換算。

暴露histogram

<dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
        </dependency>
           

其中prometheus的類庫中為我們提供了很多的監控名額,可以通路下

http://localhost:8080/actuator/prometheus就可以看到已有監控看資訊

springboot如何內建Prometheus如何暴露Histogram來擷取P99等監控名額背景Micrometer

但是預設這些監控名額并不是DistributionSummary,是以需要我們在初始化時替換配置并打開計數開關,如下:

import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.config.MeterFilter;
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.Duration;

@Configuration
@Slf4j
public class MicrometerConfig {

    @Bean
    MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
        return registry -> {
            registry.config().meterFilter(
                    new MeterFilter() {
                        @Override
                        public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {
                            if (id.getType() == Meter.Type.TIMER&&id.getName().matches("^(http|hystrix){1}.*")) {
                                return DistributionStatisticConfig.builder()
                                        .percentilesHistogram(true)
                                        .percentiles(0.5, 0.90,0.95, 0.99)
                                        .sla(Duration.ofMillis(50).toNanos(),
                                                Duration.ofMillis(100).toNanos(),
                                                Duration.ofMillis(200).toNanos(),
                                                Duration.ofSeconds(1).toNanos(),
                                                Duration.ofSeconds(5).toNanos())
                                        .minimumExpectedValue(Duration.ofMillis(1).toNanos())
                                        .maximumExpectedValue(Duration.ofSeconds(5).toNanos())
                                        .build()
                                        .merge(config);
                            } else {
                                return config;
                            }
                        }
                    });
        };
    }
}

           

以上代碼根據需要來暴露histogram資訊,這裡是選擇http響應時長以及hystrix響應監控暴露histogram,如果有需要可以不增加過濾條件。

打開後可以看到多了很多監控資訊:

springboot如何內建Prometheus如何暴露Histogram來擷取P99等監控名額背景Micrometer

配置到grafana

avg(http_server_requests_seconds{service=~"$service" ,quantile =~ "0.9|0.5|0.99", uri !~ "/actuator.*|/health|/prometheus|root"}*1000 > 0) by (uri,quantile)
           
springboot如何內建Prometheus如何暴露Histogram來擷取P99等監控名額背景Micrometer

繼續閱讀