如何用Grafana结合InfluxDB可视化Prometheus类型Summary指标
在Grafana+InfluxDB中可视化Prometheus风格Summary指标的平均响应时间
需求说明
需要计算指定时间间隔(如1分钟)内HTTP客户端的平均响应时间,逻辑为时间窗口内的总响应耗时(sum增量)除以请求总数(count增量),对应PromQL的rate(http_client_response_time_millis_sum[1m]) / rate(http_client_response_time_millis_count[1m])。
指标结构说明
导入InfluxDB后,数据结构如下:
- Measurement名称:
http_client_response_time_millis - 字段:
sum(累积总响应耗时,单位毫秒)、count(累积请求总数) - 标签:
http_client_method、http_client_url、http_client_response_status_code
InfluxQL查询语句
SELECT (derivative(last("sum"), 1m) / derivative(last("count"), 1m)) AS "avg_response_time_millis" FROM "http_client_response_time_millis" WHERE $timeFilter GROUP BY time(1m), "http_client_method", "http_client_url", "http_client_response_status_code"
查询逻辑解释
derivative(last("sum"), 1m):计算每个1分钟窗口内sum字段的增量(即该窗口内的总响应耗时),last()用于取窗口内累积值的最后一个点,保证增量计算的准确性。derivative(last("count"), 1m):同理,计算每个1分钟窗口内的请求总数增量。- 除法运算:将总耗时增量除以请求数增量,得到该窗口内的平均响应时间,别名
avg_response_time_millis便于Grafana展示。 - GROUP BY:按1分钟时间窗口和所有标签维度分组,保留请求方法、URL、状态码的维度信息。
$timeFilter:Grafana内置变量,自动适配面板选择的时间范围,无需手动指定时间区间。
自定义过滤示例
如果需要只展示GET请求、特定URL或状态码的平均响应时间,可在WHERE子句中添加过滤条件:
SELECT (derivative(last("sum"), 1m) / derivative(last("count"), 1m)) AS "avg_response_time_millis" FROM "http_client_response_time_millis" WHERE $timeFilter AND "http_client_method" = 'GET' AND "http_client_response_status_code" = '200' GROUP BY time(1m), "http_client_url"
内容的提问来源于stack exchange,提问作者oddbjorn
相关产品推荐
相关产品推荐

