Django项目中如何通过Prometheus获取函数调用的最大延迟?
解决Prometheus Histogram最大延迟查询及其他数据获取方法
关于method_latency_seconds无数据的原因
你用的是Prometheus的Histogram类型指标,这类指标不会生成原始的method_latency_seconds时间序列,而是自动生成三个衍生指标:
method_latency_seconds_bucket:每个延迟分桶的请求计数method_latency_seconds_sum:所有请求的总耗时method_latency_seconds_count:请求总次数
所以直接查method_latency_seconds肯定没数据。
获取最大延迟的两种方法
1. 基于Histogram分桶的近似最大值
Histogram通过预定义分桶来统计延迟分布,你可以通过查询最大的非空分桶的上限值,得到近似的最大延迟。用下面的PromQL:
# 获取最近1分钟内的最大分桶上限 max_over_time(method_latency_seconds_bucket{app='my_app', metric_name='my_metric'}[1m])
或者更精准地定位最大桶:
# 筛选出计数非零的最大le值 sort_desc(method_latency_seconds_bucket{app='my_app', metric_name='my_metric'})[1:]
注意:如果实际请求延迟超过了Histogram的最大分桶上限,这个结果会不准确,因为超过上限的请求都会被计入le="+Inf"的桶里。
2. 改用Summary类型获取精确最大值
如果需要精确的最大延迟,建议把Histogram换成Summary指标类型。Summary可以直接配置统计分位数(包括1.0分位数,也就是最大值),修改你的Django代码:
PROMETHEUS_TIME = Summary( name="method_latency_seconds", documentation='total time', labelnames=('component', 'container', 'tenant', 'app', 'metric_name'), objectives={0.5: 0.05, 0.9: 0.01, 1.0: 0.001} # 定义分位数和允许的误差 )
之后用这条PromQL就能查到精确最大值:
method_latency_seconds{app='my_app', metric_name='my_metric', quantile="1.0"}
除Grafana外的数据获取方式
- Prometheus HTTP API:直接调用API接口查询,示例:
curl 'http://你的Prometheus地址:9090/api/v1/query' --data-urlencode 'query=method_latency_seconds_sum{app="my_app", metric_name="my_metric"}' - Prometheus命令行工具
promtool:用官方工具查询,示例:promtool query instant http://你的Prometheus地址:9090 'method_latency_seconds_count{app="my_app", metric_name="my_metric"}' - Prometheus Web UI:直接访问Prometheus的默认Web界面(http://你的Prometheus地址:9090),在查询框输入PromQL就能看到结果。
内容的提问来源于stack exchange,提问作者HodA
相关产品推荐
相关产品推荐

