Dashboard PromQL Reference


这页只讲 Grafana dashboard 里最常见的 PromQL 语法点,不按具体监控项展开。

1. Label Filter#

写法:

metric_name{environment=~"$environment",dimension_ServiceName=~"$dimension_ServiceName"}

作用:

先把不相关的数据筛掉
通常用于 environment、service、instance、queue、table 这类维度过滤

例子:

aws_ecs_memory_utilization_average{environment=~"$environment",dimension_ServiceName=~"$dimension_ServiceName"}

exact matcher and regex matcher#

常见 label matcher:

=
    精确匹配

!=
    精确不匹配

=~
    正则匹配

!~
    正则不匹配

例子:

up{job="node"}
up{job=~"node|node-exporter"}
aws_applicationelb_target_response_time_p95{
  dimension_TargetGroup=~".+"
}

=~".+" 的意思是:

这个 label 必须存在
并且值至少有 1 个字符

它常用于这种场景:

某些 metric 既有 ALB 级序列
也有 TargetGroup 级序列

如果你只想保留真正带 TargetGroup label 的时序
可以写:
    dimension_TargetGroup=~".+"

2. avg by (…)#

写法:

avg by (label1, label2) (metric_name{...})

作用:

按指定维度分组后求平均
常用于 utilization、latency、connection 这类 gauge 指标
解决“同一类对象有多条序列,需要按维度聚合看平均值”的问题

例子:

avg by (environment, dimension_ClusterName, dimension_ServiceName) (
  aws_ecs_memory_utilization_average{environment=~"$environment",dimension_ServiceName=~"$dimension_ServiceName"}
)

3. sum by (…)#

写法:

sum by (label1, label2) (metric_name{...})

作用:

按指定维度分组后求总和
常用于 request count、bytes、errors、hits、misses 这类可累加指标
解决“多个序列要合并成总量”的问题

例子:

sum by (dimension_LoadBalancer) (
  aws_applicationelb_request_count_sum{environment=~"$environment",dimension_LoadBalancer=~"$dimension_LoadBalancer"}
)

4. min by (…) / max by (…)#

写法:

min by (label1) (metric_name{...})
max by (label1) (metric_name{...})

作用:

看一组对象里的最小值或最大值
常用于 host health、replica lag、message age、error spike
解决“我更关心最差值或峰值”的问题

例子:

max by (distribution_id) (
  aws_cloudfront_5xx_error_rate_average{distribution_id=~"$distribution_id"}
)

5. rate(…)#

写法:

rate(metric_name[5m])

作用:

把持续增长的 counter 转成“每秒变化速度”
常用于 CPU seconds、network bytes、disk bytes、request counters
解决“累计值本身不断变大,没法直接看当前速度”的问题

例子:

rate(node_network_receive_bytes_total{job=~"$node_job",instance=~"$node_instance"}[5m])

6. avg_over_time(…)#

写法:

avg_over_time(metric_name[1h])

作用:

对一个时间窗口里的值求平均
常用于 trend、rolling average
解决“原始点值波动太大,想看长期平均水位”的问题

例子:

avg_over_time(aws_ecs_cpuutilization_average{environment=~"$environment",dimension_ServiceName=~"$dimension_ServiceName"}[1h])

7. sum_over_time(…)#

写法:

sum_over_time(metric_name[1h])

作用:

对一个时间窗口里的值求总和
常用于 rolling sum、最近 1 小时总请求量、总流量、总错误数
解决“想看这段时间累计发生了多少”的问题

例子:

sum_over_time(aws_applicationelb_request_count_sum{environment=~"$environment",dimension_LoadBalancer=~"$dimension_LoadBalancer"}[1h])

8. 数学运算#

写法:

metric_a - metric_b
metric_a / metric_b
100 * (...)
1 - (...)

作用:

把基础指标组合成更直接的业务含义
常用于使用率、gap、比例、近似耗尽时间
解决“原始 metric 存在,但真正想看的量需要计算”的问题

例子:

aws_ecs_containerinsights_desired_task_count_average{environment=~"$environment",dimension_ServiceName=~"$dimension_ServiceName"}
-
aws_ecs_containerinsights_running_task_count_average{environment=~"$environment",dimension_ServiceName=~"$dimension_ServiceName"}

9. clamp_min(…)#

写法:

clamp_min(metric_expr, 1)

作用:

给表达式设一个最小下限
常用于避免除以 0
解决“分母可能是 0,导致结果无穷大或报错”的问题

例子:

sum(aws_sqs_approximate_number_of_messages_visible_average{dimension_QueueName=~"$queue_name", environment=~"$environment"})
/ clamp_min(sum(aws_sqs_number_of_messages_deleted_sum{dimension_QueueName=~"$queue_name", environment=~"$environment"}), 1)

10. label_values(…)#

写法:

label_values(metric_name, label_name)
label_values(metric_name{...}, label_name)

作用:

给 Grafana variable 提供可选值
常用于 environment、service name、queue name、cluster id
解决“页面顶部下拉框从哪里拿值”的问题

例子:

label_values(aws_ecs_cpuutilization_average{environment=~"$environment"}, dimension_ServiceName)

11. by (…) 里的 label#

by (...) 不是固定语法糖,它决定了结果按什么维度保留。

例如:

sum by (dimension_LoadBalancer) (...)

表示:

最终结果按 load balancer 分开保留
同一个 load balancer 下的其他 label 会被聚合掉

如果改成:

sum by (dimension_LoadBalancer, dimension_TargetGroup) (...)

表示:

结果会细到 load balancer + target group 这一层

12. Quick Mapping#

Syntax Usually Solves
{...} 过滤数据
avg by (...) 看平均水位
sum by (...) 看总量
min by (...) 看最低值
max by (...) 看峰值
rate(...) 看每秒变化速度
avg_over_time(...) 看 rolling average
sum_over_time(...) 看 rolling sum
a - b 看 gap
a / b 看比例
clamp_min(...) 防止分母为 0
label_values(...) 给 Grafana variable 取值