这页只讲 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 取值 |