深入学习 Grafana Query 编辑器:掌握多数据源查询与动态变量

深入学习 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 基础操作

  1. 选择数据源:Prometheus
  2. 在查询框中输入 PromQL:
    rate(node_cpu_seconds_total{mode!="idle"}[5m])
    
  3. 使用 自动完成功能
    • 输入 r → 提示 rate()
    • 输入 { → 提示可用标签
    • 输入 node_ → 提示指标名称

自动补全大幅降低学习成本,建议多练习。


2.2 查询结果格式

Prometheus 查询返回 时间序列数据,结构如下:

TimeSeries 1Series 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 创建变量

步骤:
  1. 进入 Dashboard 设置(齿轮图标)
  2. 选择 VariablesAdd variable
  3. 配置变量

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 监控面板。

步骤

  1. 创建变量

    • Name: instance
    • Type: Query
    • Query: label_values(node_cpu_seconds_total, instance)
  2. 创建 Panel

    • Data source: Prometheus
    • Query:
      1 - rate(node_cpu_seconds_total{instance="$instance", mode="idle"}[5m])
      
    • Visualization: Time series
    • Title: CPU Usage on $instance
  3. 保存仪表盘

✅ 效果:用户可通过下拉菜单选择不同主机,实时查看其 CPU 使用率。


七、总结

Grafana Query 编辑器是连接数据与可视化的桥梁:

数据源查询语言关键要点
PrometheusPromQL使用自动补全,掌握 rate(), histogram_quantile()
MySQL/PostgreSQLSQL必须包含 time 列和数值列,使用 $__timeFilter()
通用——使用 变量 实现动态查询

核心技能:

“写对查询,用好变量,预览结果,持续优化。”

通过深入掌握 Query 编辑器,你将能够:

  • ✅ 灵活查询各类数据源
  • ✅ 构建高度可交互的仪表盘
  • ✅ 实现“一次配置,多处复用”的高效运维

这是从 Grafana 使用者进阶为可观测性工程师的关键一步。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值