深入学习 Grafana Query 编辑器:掌握多数据源查询与动态变量
Grafana 的 Query 编辑器 是其核心功能之一,它允许你从不同数据源中提取数据,并将其转化为可视化图表。每个数据源的 Query 编辑器界面和能力各不相同,掌握它们的使用方法是构建高效、灵活仪表盘的关键。
本文将深入详解 Prometheus、MySQL 等数据源的 Query 编辑器用法,并重点讲解 变量(Variables) 如何实现动态仪表盘。
一、Query 编辑器概览
Query 编辑器位于面板(Panel)的 “Query” 标签页,主要功能包括:
- 选择数据源
- 编写查询语句(PromQL、SQL、LogQL 等)
- 配置查询选项(如格式化、别名)
- 实时预览查询结果
- 支持自动补全、语法高亮
✅ 所有查询结果最终都会被转换为 时间序列(Time series) 或 表格(Table) 格式用于可视化。
二、1. Prometheus Query 编辑器:使用 PromQL
2.1 基础操作
- 选择数据源:
Prometheus - 在查询框中输入 PromQL:
rate(node_cpu_seconds_total{mode!="idle"}[5m]) - 使用 自动完成功能:
- 输入
r→ 提示rate() - 输入
{→ 提示可用标签 - 输入
node_→ 提示指标名称
- 输入
✅ 自动补全大幅降低学习成本,建议多练习。
2.2 查询结果格式
Prometheus 查询返回 时间序列数据,结构如下:
| Time | Series 1 | Series 2 | … |
|---|---|---|---|
| t₀ | v₀₁ | v₀₂ | |
| t₁ | v₁₁ | v₁₂ |
- 每一行是一个时间点
- 每一列是一个时间序列(带标签)
2.3 常用 PromQL 练习
# CPU 使用率
1 - rate(node_cpu_seconds_total{mode="idle"}[5m])
# 内存使用率
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes
# HTTP 请求速率
rate(http_server_requests_seconds_count[5m])
# P95 延迟
histogram_quantile(0.95, sum(rate(http_server_requests_seconds_bucket[5m])) by (le))
三、2. MySQL Query 编辑器:使用 SQL
MySQL 返回的是表格数据,Grafana 需要将其转换为时间序列才能可视化。
3.1 SQL 查询要求
要使 MySQL 查询结果可被 Grafana 可视化,必须满足:
- 至少包含 一列时间(time)
- 至少包含 一列数值(metric)
- 可选:维度列(用于分组)
正确示例
-- 查询订单数量趋势
SELECT
created_at AS "time", -- 必须命名为 "time" 或使用别名
COUNT(*) AS "orders" -- 数值列
FROM orders
WHERE $__timeFilter(created_at) -- Grafana 自动替换时间范围
GROUP BY created_at
ORDER BY created_at
-- 多时间序列:按状态分组
SELECT
created_at AS "time",
status AS "metric", -- 作为 series 名称
COUNT(*) AS "value"
FROM orders
WHERE $__timeFilter(created_at)
GROUP BY created_at, status
ORDER BY created_at
✅
metric列的值会成为图例名称(如status=paid,status=failed)
3.2 $__timeFilter() 函数详解
这是 Grafana 提供的宏(Macro),用于自动注入时间过滤条件。
| 你在 SQL 中写 | Grafana 实际执行 |
|---|---|
$__timeFilter(created_at) | created_at BETWEEN '2023-01-01T00:00:00Z' AND '2023-01-02T00:00:00Z' |
✅ 必须使用,否则无法与仪表盘时间范围联动。
3.3 其他有用的宏
| 宏 | 说明 |
|---|---|
$__timeFrom() | 开始时间 |
$__timeTo() | 结束时间 |
$__interval | 自动计算的采样间隔(用于 GROUP BY time) |
示例:带采样间隔的查询
SELECT
UNIX_TIMESTAMP(created_at) DIV $__interval * $__interval AS time_sec,
COUNT(*) AS orders
FROM orders
WHERE $__timeFilter(created_at)
GROUP BY time_sec
ORDER BY time_sec
四、3. 变量(Variables):实现动态仪表盘
变量是 Grafana 实现交互式、可复用仪表盘的核心功能。它允许你通过下拉菜单动态切换查询条件。
4.1 创建变量
步骤:
- 进入 Dashboard 设置(齿轮图标)
- 选择 Variables → Add variable
- 配置变量
4.2 常用变量类型
(1)Query 变量:从数据源查询生成
场景:列出所有 Prometheus 实例
- Name:
instance - Type:
Query - Data source:
Prometheus - Query:
label_values(instance) - Refresh:
On Dashboard Load
✅
label_values(job)可获取所有 job 名称
(2)Query 变量:从 MySQL 查询生成
场景:列出所有服务名称
- Name:
service - Type:
Query - Data source:
MySQL - Query:
SELECT DISTINCT service_name FROM services - Refresh:
On Time Range Change
4.3 在查询中使用变量
示例 1:Prometheus 查询
rate(http_requests_total{instance="$instance"}[5m])
$instance会被替换为用户选择的值- 下拉菜单自动显示所有 instance
示例 2:MySQL 查询
SELECT
created_at AS "time",
COUNT(*) AS "orders"
FROM orders
WHERE service = '$service'
AND $__timeFilter(created_at)
GROUP BY created_at
4.4 变量高级用法
| 语法 | 说明 |
|---|---|
$var | 包含引号(如 "web-1") |
[[var]] | 无引号(如 web-1) |
${var:pipe} | 管道格式(如正则替换) |
${var:regex} | 正则匹配 |
示例:多选变量
- 允许用户选择多个 instance
- 查询变为:
rate(http_requests_total{instance=~"$instance"}[5m]) - 使用
=~正则匹配
五、Query 编辑器最佳实践
| 实践 | 说明 |
|---|---|
| ✅ 使用 自动补全 加速 PromQL 编写 | 减少拼写错误 |
✅ 为 SQL 查询添加 $__timeFilter() | 确保时间范围联动 |
| ✅ 使用 变量 替代硬编码 | 提升仪表盘复用性 |
| ✅ 合理使用 别名(Alias) | 改善图例可读性 |
| ✅ 预览查询结果 | 查看原始数据格式 |
| ✅ 使用 多个 Query(A/B/C) | 合并多条曲线 |
六、实战:构建动态主机监控仪表盘
目标
创建一个可切换主机实例的 CPU 监控面板。
步骤
-
创建变量:
- Name:
instance - Type:
Query - Query:
label_values(node_cpu_seconds_total, instance)
- Name:
-
创建 Panel:
- Data source:
Prometheus - Query:
1 - rate(node_cpu_seconds_total{instance="$instance", mode="idle"}[5m]) - Visualization: Time series
- Title:
CPU Usage on $instance
- Data source:
-
保存仪表盘
✅ 效果:用户可通过下拉菜单选择不同主机,实时查看其 CPU 使用率。
七、总结
Grafana Query 编辑器是连接数据与可视化的桥梁:
| 数据源 | 查询语言 | 关键要点 |
|---|---|---|
| Prometheus | PromQL | 使用自动补全,掌握 rate(), histogram_quantile() |
| MySQL/PostgreSQL | SQL | 必须包含 time 列和数值列,使用 $__timeFilter() |
| 通用 | —— | 使用 变量 实现动态查询 |
核心技能:
“写对查询,用好变量,预览结果,持续优化。”
通过深入掌握 Query 编辑器,你将能够:
- ✅ 灵活查询各类数据源
- ✅ 构建高度可交互的仪表盘
- ✅ 实现“一次配置,多处复用”的高效运维
这是从 Grafana 使用者进阶为可观测性工程师的关键一步。

被折叠的 条评论
为什么被折叠?



