Grafana&Prometheus:如何合并重复路径标签后按标签分组计算平均延迟?
解决PromQL中路径标签合并计算平均延迟的问题
直接用PromQL的label_replace函数就能搞定,不需要依赖Grafana的转换或值映射功能——后者只是在展示层合并标签,底层计算还是分开的,会导致平均延迟结果不准确。
修改后的查询语句
sum by (normalized_path) ( label_replace(rate(http_server_latency_milliseconds_sum[$__rate_interval]), "normalized_path", "$1/", "path", "^(.*[^/])$") ) / sum by (normalized_path) ( label_replace(rate(http_server_latency_milliseconds_count[$__rate_interval]), "normalized_path", "$1/", "path", "^(.*[^/])$") )
逻辑说明
- 统一路径格式:
label_replace函数通过正则表达式^(.*[^/])$匹配所有不以/结尾的path标签,把它们替换成$1/($1是匹配到的路径主体部分,末尾补/);已经以/结尾的路径不会被匹配,保持原样。处理后生成统一的normalized_path标签。 - 聚合计算平均延迟:分别对处理后的
sum和count序列按normalized_path分组求和,再做除法得到各路径的平均延迟,这样就自动合并了"/users"和"/users/"这类实际相同的路径。
注意事项
- 如果你的应用存在空路径这类特殊场景,可以调整正则表达式适配,比如
^(.*[^/])?$(不过一般业务路径不会出现空值)。 - 这个方式是在计算
rate之后做标签替换再聚合,能保证每个时间窗口的速率计算准确,再合并同路径的统计值,结果比展示层合并更可靠。
内容的提问来源于stack exchange,提问作者Kresnik
相关产品推荐
相关产品推荐

