v1 与 v2:先分清你在接哪一代
InfluxDB v2 重做了认证与 API,并引入了函数式的查询语言 Flux,但保留了 v1 的兼容接口。接数据源前先把版本对齐:
| 维度 | v1 | v2 |
|---|---|---|
| 认证 | 用户名/密码(按 database 授权) | API Token,配合 org |
| 数据组织 | database + retention policy | org + bucket |
| 查询语言 | InfluxQL(类 SQL) | Flux(管道式函数语言) |
| 端口 | 8086 | 8086,兼容 v1 的 /query 接口 |
Grafana 的 InfluxDB 数据源同时支持两代:添加时选择对应的 InfluxDB API 版本,再填各自的连接字段。给 v2 环境配 v1 模式是「连上了却没有数据」的经典原因。
添加数据源
以 v2 为例:
- 打开 Connections → Data sources → Add data source,选择 InfluxDB。
- URL 填
http://localhost:8086(以 Grafana 服务器可达为准)。 - 查询方式选择 Flux,填 Org 与默认 Bucket。
- 在 API Token 填入具读权限的令牌,点击 Save & test。
v1 模式则填 Database 加用户名/密码;细节以配置界面实际字段为准。
Flux 还是 InfluxQL
- Flux:v2 的正统选择。管道式语法适合多流拼接、透视等复杂处理,能引用 Grafana 注入的内置变量(时间范围、步长)。
- InfluxQL:类 SQL、上手快,老仪表盘资产大多用它;v2 也可通过兼容 API 继续执行 InfluxQL。
同一实例里可以各建一个数据源分别指向两种查询方式,逐步迁移。
示例
Flux 查询——取某 bucket 里 CPU 使用率并按面板步长聚合,这是时间序列面板的标准骨架:
from(bucket: "metrics")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "cpu")
|> filter(fn: (r) => r["_field"] == "usage_user")
|> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
|> yield(name: "mean")
InfluxQL 的对应写法,注意 $timeFilter、$__interval 是 Grafana 在执行前展开的宏:
SELECT mean("usage_user") FROM "cpu"
WHERE "host" =~ /^$host$/ AND $timeFilter
GROUP BY time($__interval), "host" fill(null)
提示:
v.timeRangeStart与v.windowPeriod只在 Grafana 的查询环境里存在;把 Flux 复制回 InfluxDB 自己的 UI 执行时,要自行导入时间范围变量。
常见坑
- 图表空白但查询无报错:
_field与 tag 混淆——度量值存在 field 里,维度才是 tag;过滤条件写错列名时结果就是空流。 - 曲线出现断点或补零:
aggregateWindow的createEmpty与fill策略不一致,对照上面的示例统一处理。 - 401/403:v1/v2 认证方式用混了,或令牌缺少目标 bucket 的读权限。
- 查询越来越慢:InfluxDB 本身对高基数 tag 敏感,先治理标签设计,再谈调超时。
下一步
- 数据源的通用概念与维护要点,见数据源概念与管理。
- 同类时序数据库的另一极,见连接 Prometheus。
- 想用 SQL 直接查业务库,见SQL 数据源:MySQL 与 PostgreSQL。