Spring Boot中如何让@Timed生成的Histogram buckets按指定标签聚合?
解决方案
有两种成熟方案可以实现你的需求,不需要修改全局WebMvcTagsProvider:
方案一:应用侧通过Micrometer MeterFilter实现
直接注入自定义MeterFilter,仅针对http_server_requests_seconds_bucket指标移除不需要的标签:
import io.micrometer.core.instrument.Meter; import io.micrometer.core.instrument.config.MeterFilter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MetricsConfig { @Bean public MeterFilter histogramBucketTagFilter() { return new MeterFilter() { @Override public Meter.Id map(Meter.Id id) { // 仅匹配http请求的直方图桶指标 boolean isHttpBucket = id.getName().equals("http.server.requests.seconds") && id.getTags().stream().anyMatch(tag -> tag.getKey().equals("le")); if (isHttpBucket) { return id.replaceTags(tag -> !tag.getKey().equals("exception") && !tag.getKey().equals("outcome") && !tag.getKey().equals("status") ); } return id; } }; } }
如果你的Micrometer版本低于1.9,调整判断逻辑,通过名称后缀匹配_bucket结尾的指标即可
方案二:Prometheus采集侧通过relabel规则实现
在Prometheus的采集任务配置中添加metricRelabelConfigs,仅针对http_server_requests_seconds_bucket指标移除不需要的标签:
scrape_configs: - job_name: 'spring-boot-app' metrics_path: '/actuator/prometheus' static_configs: - targets: ['你的应用地址:端口'] metric_relabel_configs: - source_labels: [__name__] regex: 'http_server_requests_seconds_bucket' action: labeldrop regex: '(exception|outcome|status)'
这个方案不需要修改应用代码,所有标签过滤逻辑在Prometheus侧执行,http_server_requests_seconds_count和http_server_requests_seconds_sum指标会保留全部原有标签。
注意事项
- 两种方案都不会影响原有全局标签逻辑,
http_server_requests_seconds_count、http_server_requests_seconds_sum会完整保留exception、outcome、status标签 - 直方图桶仅保留uri、method标签后,指标基数会大幅降低,不会影响
histogram_quantile函数的计算结果,只要你计算分位数时的分组标签仅用到uri、method即可
内容的提问来源于stack exchange,提问作者I.Brok
相关产品推荐
相关产品推荐

