背景
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
1 <dependency> 2 <groupid>io.micrometer</groupid> 3 <artifactid>micrometer-registry-prometheus</artifactid> 4 </dependency>
其中prometheus的类库中为我们提供了很多的监控指标,可以访问下 http://localhost:8080/actuator/prometheus就可以看到已有监控看信息
但是默认这些监控指标并不是DistributionSummary,所以需要我们在初始化时替换配置并打开计数开关,如下:
1import io.micrometer.core.instrument.Meter; 2import io.micrometer.core.instrument.MeterRegistry; 3import io.micrometer.core.instrument.config.MeterFilter; 4import io.micrometer.core.instrument.distribution.DistributionStatisticConfig; 5import lombok.extern.slf4j.Slf4j; 6import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer; 7import org.springframework.context.annotation.Bean; 8import org.springframework.context.annotation.Configuration; 9 10import java.time.Duration; 11 12@Configuration 13@Slf4j 14public class MicrometerConfig { 15 16 @Bean 17 MeterRegistryCustomizer<meterregistry> metricsCommonTags() { 18 return registry -> { 19 registry.config().meterFilter( 20 new MeterFilter() { 21 @Override 22 public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) { 23 if (id.getType() == Meter.Type.TIMER&&id.getName().matches("^(http|hystrix){1}.*")) { 24 return DistributionStatisticConfig.builder() 25 .percentilesHistogram(true) 26 .percentiles(0.5, 0.90,0.95, 0.99) 27 .sla(Duration.ofMillis(50).toNanos(), 28 Duration.ofMillis(100).toNanos(), 29 Duration.ofMillis(200).toNanos(), 30 Duration.ofSeconds(1).toNanos(), 31 Duration.ofSeconds(5).toNanos(), 32 .minimumExpectedValue(Duration.ofMillis(1).toNanos()) 33 .maximumExpectedValue(Duration.ofSeconds(5).toNanos()) 34 .build() 35 .merge(config); 36 } else { 37 return config; 38 } 39 } 40 }); 41 }; 42 } 43} 44
以上代码根据需要来暴露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)
</meterregistry>