背景
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展示爲一條時間序列,會得到類似下面的圖。
percentile(quantile),百分位數,聚合指標,包含percentile標籤用於區分不同的百分位,例如web.response.size.percentile{p=90) = 512,表示90%的響應大小都小於512。一般有多個percentile,如p50,p75,p90,p99。
每個百分位展示爲一條時間序列,會得到類似下面的圖。
Timer
Timer是DistributionSummary的特化,專門用於計時類的指標,可以對記錄的時間值(duration)進行單位換算。
暴露histogram
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
其中prometheus的類庫中爲我們提供了很多的監控指標,可以訪問下
http://localhost:8080/actuator/prometheus就可以看到已有監控看信息
但是默認這些監控指標並不是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,如果有需要可以不增加過濾條件。
打開後可以看到多了很多監控信息:
配置到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)