You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:01:24