4. 使用 cURL 导出仪表板:通过 API 导出单个仪表板的 JSON 模型,理解 JSON 结构
在 Grafana 的日常运维与跨环境同步场景中,API 导出是最直接、最可编程的获取仪表板定义的方式。相比 UI 手动导出,cURL 方式更适合集成到 CI/CD 流水线或自动化脚本中。本节将带你掌握通过 Grafana HTTP API 导出仪表板 JSON 的标准流程,并深入解析返回的 JSON 结构,为后续的模板化与同步打下基础。
前置条件:确保你已拥有 Grafana 的 (角色至少为
Viewer)或有效的 Basic Auth 凭据。 推荐使用 Admin 角色以避免权限不足的问题。
4.1 导出仪表板的 API 端点与参数
Grafana 提供了两个核心端点用于获取仪表板定义,它们的返回格式略有不同:
| 端点路径 | HTTP 方法 | 返回内容 | 典型用途 |
|---|---|---|---|
/api/dashboards/uid/:uid |
GET |
包含 dashboard、meta 等完整对象 |
精确导出单个仪表板(推荐) |
/api/dashboards/db/:slug |
GET |
同上,但通过 slug 定位 | 兼容旧版,不推荐新项目使用 |
其中 UID(Unique Identifier)是 Grafana 仪表板的唯一标识,在仪表板 URL 中可以直接看到,例如:/d/cXq4m6Z7z/my-dashboard 中的 cXq4m6Z7z 即为 UID。
4.2 使用 cURL 导出仪表板 JSON
以下是一个标准的 cURL 导出命令模板,请根据你的环境替换 GRAFANA_URL、 和 DASHBOARD_UID:
curl -s -H "Authorization: Bearer glsa_xxxxxxxxxxxxxxxxxxxxxx" \
"http://localhost:3000/api/dashboards/uid/cXq4m6Z7z" \
| jq .
命令拆解:
-s:静默模式,不显示进度信息。-H "Authorization: Bearer <>":传递 进行身份认证。http://localhost:3000/api/dashboards/uid/cXq4m6Z7z:目标端点。| jq .:将返回的 JSON 进行格式化输出,便于阅读。
常见错误:如果返回
401 Unauthorized,请检查 是否过期或角色权限不足。如果返回 404 Not Found,请确认 UID 是否正确,或仪表板是否存在于当前组织(Organization)中。
4.3 导出 JSON 的核心结构解析
成功导出后,你将得到一个类似如下的 JSON 结构(已简化关键字段):
{
"dashboard": {
"id": 42,
"uid": "cXq4m6Z7z",
"title": "生产环境核心指标",
"tags": ["production", "linux", "metrics"],
"timezone": "browser",
"schemaVersion": 36,
"version": 7,
"panels": [
{
"id": 1,
"type": "graph",
"title": "CPU 使用率",
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 0 },
"targets": [
{
"expr": "100 - (avg by (instance) (rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)",
"legendFormat": "{{ instance }}",
"refId": "A"
}
]
}
],
"templating": {
"list": [
{
"name": "instance",
"type": "query",
"query": "label_values(node_cpu_seconds_total, instance)"
}
]
},
"annotations": { "list": [] }
},
"meta": {
"slug": "production-core-metrics",
"folderTitle": "生产环境",
"isStarred": false,
"url": "/d/cXq4m6Z7z/production-core-metrics"
}
}
关键字段说明:
| 路径 | 类型 | 说明 |
|---|---|---|
dashboard.uid |
string | 仪表板唯一标识,跨环境同步时需保持或重新生成 |
dashboard.title |
string | 仪表板标题,用于显示和搜索 |
dashboard.panels[] |
array | 面板列表,每个面板包含 type、targets、gridPos 等 |
dashboard.templating.list[] |
array | 模板变量定义,用于动态过滤数据 |
dashboard.schemaVersion |
int | Grafana 版本对应的 schema 版本,导入时需匹配 |
dashboard.version |
int | 仪表板编辑版本号,用于冲突检测 |
meta.folderTitle |
string | 仪表板所属文件夹名称,跨环境同步时需注意文件夹映射 |
4.4 导出流程可视化
下图展示了从发起 cURL 请求到获取完整仪表板 JSON 的完整数据流:
4.5 导出后的常见操作与注意事项
- 保存到文件:使用
curl ... > dashboard.json将输出直接写入文件,便于后续处理。 - 提取纯 dashboard 对象:使用
jq '.dashboard' dashboard.json > dashboard_clean.json去除meta信息,得到纯净的仪表板定义。 - 版本冲突处理:导入时如果
dashboard.version与目标环境冲突,Grafana 会拒绝导入。建议在导出脚本中移除version字段,或将其重置为0。 - UID 策略:跨环境同步时,如果希望保持仪表板 URL 一致,则保留
uid;如果希望目标环境生成新 UID,则删除uid字段。
实战建议:在自动化脚本中,推荐先导出仪表板 JSON,然后使用
jq 进行字段清洗(移除 id、version,可选移除 uid),最后通过 POST /api/dashboards/db 导入到目标环境。这个“导出-清洗-导入”三步法是跨环境同步的标准模式。
4.6 理解 JSON 结构中的关键嵌套关系
仪表板 JSON 的层次结构可以抽象为以下逻辑模型,理解它将帮助你更精准地进行模板化改造:
从层次图中可以清晰看到:panels[] 是仪表板的核心,每个面板又包含 targets[](查询语句)、gridPos(布局位置)和 type(面板类型)。templating 和 annotations 是全局配置,分别控制变量和事件标注。理解这个嵌套关系,是后续进行模板化替换和变量注入的前提。
小技巧:在导出后,可以使用
jq '.dashboard.panels[].targets[].expr' dashboard.json 快速提取所有面板的 PromQL 查询语句,用于审计或批量修改。