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 的完整数据流:

cURL 导出仪表板 JSON 数据流 cURL 客户端 Grafana API Grafana 数据库 GET /api/dashboards/uid/:uid Authorization: Bearer 查询仪表板定义 返回完整 JSON 200 OK + JSON body 输出:仪表板 JSON 模型 包含 dashboard(panels, templating, annotations) 和 meta(slug, folderTitle, url)两个顶级对象

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 的层次结构可以抽象为以下逻辑模型,理解它将帮助你更精准地进行模板化改造:

仪表板 JSON 层次结构 dashboard (根对象) panels[] templating annotations timepicker targets[] gridPos type / title list[] (变量定义) 关键字段 uid: 全局唯一 version: 冲突检测 schemaVersion: 兼容性

从层次图中可以清晰看到:panels[] 是仪表板的核心,每个面板又包含 targets[](查询语句)、gridPos(布局位置)和 type(面板类型)。templating 和 annotations 是全局配置,分别控制变量和事件标注。理解这个嵌套关系,是后续进行模板化替换和变量注入的前提。

小技巧:在导出后,可以使用 jq '.dashboard.panels[].targets[].expr' dashboard.json 快速提取所有面板的 PromQL 查询语句,用于审计或批量修改。