如何通过编程方式复制Grafana仪表板布局至另一仪表板?
解决Grafana仪表板复制时API 400错误的问题
你的操作存在几个核心问题,导致请求返回400错误:
1. 请求端点与方法错误
更新现有仪表板应使用PUT请求指向/api/dashboards/uid/{second_dashboard_uid},而非创建仪表板时的POST端点。POST用于新建资源,PUT才是针对已有UID的仪表板执行更新操作。
2. 仪表板字段处理不当
从GET接口获取的第一个仪表板JSON中,dashboard节点包含原有的id和uid,直接替换会引发冲突:
- 需清空复制过来的
dashboard.id(设为空字符串),Grafana会自动维护现有仪表板的ID - 要将复制后的
dashboard.uid设置为第二个仪表板的UID - 更新时必须将
overwrite设为True,否则Grafana会拒绝覆盖现有内容
3. 请求体结构错误
你修改的second_dashboard_json是GET返回的完整结构(包含meta等冗余字段),但更新API仅接受与创建时一致的精简结构,外层仅保留dashboard、folderUid、message、overwrite字段。
正确操作代码示例
# 1. 获取第一个仪表板的完整JSON(含GUI修改内容) r_first = s.get(api_get_dashboard_by_uid + first_dashboard_uid) first_dashboard_json = r_first.json() # 2. 提取并处理第一个仪表板的dashboard节点 copied_dashboard = first_dashboard_json['dashboard'].copy() copied_dashboard['id'] = "" # 清空原有ID避免冲突 copied_dashboard['uid'] = second_dashboard_uid # 设置为目标仪表板UID copied_dashboard['title'] = "this is a copy of first dashboard" # 修改标题区分副本 # 3. 构造更新请求体 update_payload = { "dashboard": copied_dashboard, "folderUid": "", # 保持原文件夹或按需修改 "message": "Copied from first dashboard", "overwrite": True # 必须设为True才能覆盖现有仪表板 } # 4. 发送PUT请求更新 update_url = f"{api_base_url}/api/dashboards/uid/{second_dashboard_uid}" r_update = s.put(update_url, data=json.dumps(update_payload)) print(r_update.status_code) print(r_update.json())
额外优化:直接创建副本(无需提前建空仪表板)
# 直接基于第一个仪表板创建副本,省去空仪表板创建步骤 new_dashboard_payload = { "dashboard": { **first_dashboard_json['dashboard'], "id": "", "uid": "", # 留空让Grafana自动生成,或指定新UID "title": "this is a copy of first dashboard" }, "folderUid": "", "message": "Create copy of first dashboard", "overwrite": False } r_create_copy = s.post(api_create_dashboard, data=json.dumps(new_dashboard_payload))
内容的提问来源于stack exchange,提问作者Vincent Tep
相关产品推荐
相关产品推荐

