3. Grafana API 入门:API 认证方式与常用端点
跨环境同步的核心是程序化地操作 Grafana 资源,而 Grafana HTTP API 是实现这一目标的唯一通道。本章将带你掌握 API 的两种认证方式,并熟练使用搜索、获取、创建仪表板这三个最常用的端点,为后续的自动化同步脚本打下基础。
3.1 API 认证方式
Grafana API 默认不对外开放匿名访问,所有请求必须携带有效的认证凭证。官方提供两种主流认证方式: 和 Basic Auth。下表从安全性、适用场景和生命周期三个维度进行对比:
| 对比维度 | (推荐) | Basic Auth |
|---|---|---|
| 凭证形式 | Bearer (字符串) | 用户名:密码(Base64 编码) |
| 权限粒度 | 支持 Admin / Editor / Viewer 角色 | 继承用户自身权限 |
| 生命周期 | 可设置过期时间,支持吊销 | 依赖用户账户状态 |
| 适用场景 | CI/CD 流水线、自动化脚本 | 快速测试、临时调试 |
| 安全风险 | 较低(可限制角色和有效期) | 较高(泄露后影响整个账户) |
最佳实践:在跨环境同步场景中,始终使用 ,并为每个环境(开发、测试、生产)创建独立的 Key,设置最小必要权限和合理的过期时间。
3.1.1 创建与使用
在 Grafana Web UI 中,通过 Configuration → s → Add 创建。创建时需指定名称、角色(Admin / Editor / Viewer)和过期时间。创建成功后,Key 仅显示一次,务必立即保存。
在 HTTP 请求中,通过 Authorization 头传递:
# 使用 curl 请求示例
curl -X GET "http://your-grafana:3000/api/search" \
-H "Authorization: Bearer glsa_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
3.1.2 使用 Basic Auth
适用于快速验证或无法创建 的受限环境。将用户名和密码拼接为 username:password 后进行 Base64 编码:
# 使用 curl 的 -u 参数自动处理 Base64 编码
curl -X GET "http://your-grafana:3000/api/search" \
-u "admin:admin123"
安全警告:Basic Auth 会将密码明文传输(仅 Base64 编码,非加密),务必配合 HTTPS 使用。不要在共享脚本或版本控制系统中硬编码密码。
3.2 常用 API 端点详解
Grafana API 覆盖了仪表板、数据源、组织、用户等全部资源。在跨环境同步流程中,以下三个端点构成了核心操作循环:搜索 → 获取 → 创建/更新。
3.2.1 搜索仪表板:GET /api/search
该端点返回当前组织中所有可访问的仪表板列表,支持按文件夹、标签、名称进行过滤。响应结果包含每个仪表板的 uid、title、folderUid 等关键字段。
常用查询参数:
query:按名称模糊搜索folderIds:按文件夹 ID 过滤tag:按标签过滤(可重复使用)type:dash-db(仪表板)或dash-folder(文件夹)
# 搜索名称包含 "nginx" 的所有仪表板
curl -s -X GET "http://your-grafana:3000/api/search?query=nginx&type=dash-db" \
-H "Authorization: Bearer glsa_xxxxxxxxxxxx" | jq '.[] | {uid, title, folderUid}'
3.2.2 获取仪表板:GET /api/dashboards/uid/:uid
通过搜索得到的 uid,获取单个仪表板的完整定义。响应体包含两个重要部分:
dashboard:仪表板 JSON 模型(包含 panels、templating、annotations 等)meta:元数据(版本号、是否被星标、所属文件夹路径等)
# 获取指定 uid 的仪表板完整 JSON
curl -s -X GET "http://your-grafana:3000/api/dashboards/uid/abc123" \
-H "Authorization: Bearer glsa_xxxxxxxxxxxx" | jq '.dashboard' > dashboard.json
关键字段说明:仪表板 JSON 中的
uid 是全局唯一标识符,version 用于乐观锁冲突检测。在跨环境同步时,通常需要重置 uid 和 version 以避免冲突。
3.2.3 创建/更新仪表板:POST /api/dashboards/db
该端点同时支持创建和更新操作。请求体必须包含 dashboard 对象和 overwrite 标志:
- 创建新仪表板:提供
dashboardJSON,不设置uid或使用新uid,overwrite: false - 更新已有仪表板:提供完整的
dashboardJSON(包含现有uid和正确的version),overwrite: true
# 创建新仪表板(从文件读取 JSON)
curl -s -X POST "http://your-grafana:3000/api/dashboards/db" \
-H "Authorization: Bearer glsa_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"dashboard": {
"title": "Nginx 监控(同步测试)",
"tags": ["nginx", "synced"],
"panels": [],
"timezone": "browser"
},
"overwrite": false,
"folderUid": "folder123"
}' | jq '.uid'
3.3 认证方式与端点组合实战
下面的 SVG 图展示了两种认证方式如何与三个核心端点组合,形成完整的跨环境同步数据流:
3.4 常见错误与排查
| HTTP 状态码 | 错误原因 | 排查方向 |
|---|---|---|
| 401 Unauthorized | 认证凭证无效或已过期 | 检查 是否被吊销;检查 Basic Auth 用户名密码是否正确 |
| 403 Forbidden | 凭证有效但权限不足 | 确认 角色是否为 Admin;确认用户是否有对应文件夹的写入权限 |
| 412 Precondition Failed | 仪表板版本冲突(更新时 version 不匹配) | 先 GET 获取最新版本号,再 PUT 提交 |
| 400 Bad Request | 请求体 JSON 格式错误或缺少必填字段 | 使用 jq 验证 JSON 合法性;检查 dashboard 对象是否包含 title |
调试技巧:在 curl 命令中添加
-v 参数可查看完整的请求和响应头,帮助定位认证或权限问题。对于 JSON 响应,使用 jq 工具格式化输出,便于阅读嵌套结构。