Grafana无原生“Query Exclusions”功能,实际需在查询层用PromQL逻辑运算(and/unless/clamp_max)、Ad hoc变量过滤或Transform后处理排除异常值,优先推荐查询层过滤。

Grafana 本身没有名为 “Query Exclusions” 的原生机制。这个说法容易引起误解——它不是 Grafana 查询语言(如 PromQL、LogQL 或 SQL)的标准功能,也不是变量或面板设置中的独立选项。实际中,用户想解决的“过滤极端离群刺针噪点”,本质是**在查询阶段主动排除异常值,避免其干扰图表渲染和视觉判断**,尤其在高基数或存在瞬时尖峰(如短时 1000% CPU、-1 值、超大延迟抖动)的场景下。
用 PromQL 的逻辑运算与函数做数值过滤
如果你使用 Prometheus 数据源,最直接有效的方式是在查询语句中嵌入条件过滤,而不是依赖后处理或 UI 层屏蔽:
-
用
and排除超限值:例如只保留 CPU 使用率在 0–100% 之间的样本:100 * (node_cpu_seconds_total{mode!="idle"} / ON(instance) GROUP_LEFT() count by(instance)(node_cpu_seconds_total)) and (node_cpu_seconds_total > 0)→ 再加一层:... and (100 * (...) <= 100) -
用
unless踢出已知噪点标签组合:比如某个 exporter 因崩溃上报了大量instance="down"或job="broken"的错误指标,可写:your_metric unless on(instance) label_values(your_metric{job="broken"}, instance) -
用
clamp_min/clamp_max截断极值(Prometheus v2.35+):clamp_max(100 * rate(node_network_receive_bytes_total[5m]), 1e6)把网络接收速率上限卡在 1MB/s,避免单次毛刺拉伸 Y 轴
用 Grafana 变量 + 即时过滤器(Ad hoc filters)做维度级排除
当噪点来自特定实例、服务或标签组合(如某台老旧设备持续上报负值),可用 Ad hoc filter 统一控制多个 Panel:
- 在 Dashboard Settings → Variables → Add variable → Type 选 Ad hoc filter
- 指定 Data source(如 Prometheus),并设置 Key 为
instance、job或自定义标签名 - 保存后,顶部会出现一个「+ Add filter」按钮,点击可手动添加
instance !~ "web-server-07|db-backup-03"这类正则排除规则 - 所有启用了该数据源的 Panel 会自动应用此过滤,无需逐个改 Query
用 Transform 功能在前端做样本清洗(适用于任意数据源)
如果查询层无法修改(如对接 MySQL 或 Elasticsearch),可在 Panel 的 Transform 标签页中做后置处理:
- 添加 Filter data by values:选择字段(如
value),设置条件为value > -10 AND value < 500 - 或使用 Organize fields 配合 Reduce 操作,先按时间窗口聚合(如取每分钟 median),再过滤聚合结果
- 注意:Transform 是客户端计算,大数据量时可能卡顿;优先推荐在查询层过滤
规避刺针的显示策略(非过滤但实用)
有些“刺针”其实是真实业务信号(如秒级任务完成触发的瞬时 1),不建议删除,而应降低其干扰度:
- 在 Panel Options → Display → Fill opacity 设为 0,关闭面积填充,只留线条,刺针更不显眼
- 启用 Connect nulls,让缺失值前后点不连线,避免噪点连成虚假趋势
- 勾选 Hide series with 0/NaN values,自动隐藏全空或无效序列


















