如何使用Python将Grafana master-plots新面板添加到server-plots
Grafana 跨Dashboard同步新增面板Python实现方案
核心逻辑
Grafana 没有提供单独新增单个面板的API,你可以直接操作Dashboard的完整JSON结构,筛选出新增面板后拼接,再调用官方的Dashboard更新接口提交即可,全程只用Python的requests库就能实现,无需curl或手动操作。
前置准备
- 安装依赖库:
pip install requests - 生成Grafana API Key:路径为「控制台 - 配置 - API Keys」,权限选择
Editor或Admin - 获取两个Dashboard的UID:可通过Grafana控制台打开对应Dashboard,URL路径中
d/后面的第一段字符串即为UID,也可通过/api/search?query=Dashboard名称接口查询获取
完整实现代码
import requests # 配置项,替换为你自己的实际值 GRAFANA_URL = "http://你的Grafana地址:3000" API_KEY = "你的Grafana API Key" MASTER_DASHBOARD_UID = "master-plots的UID" TARGET_DASHBOARD_UID = "server-plots的UID" HEADERS = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } def get_dashboard_json(uid): """获取指定UID的Dashboard完整JSON""" resp = requests.get( f"{GRAFANA_URL}/api/dashboards/uid/{uid}", headers=HEADERS ) resp.raise_for_status() return resp.json() # 1. 拉取两个Dashboard的原始数据 master_dash = get_dashboard_json(MASTER_DASHBOARD_UID) target_dash = get_dashboard_json(TARGET_DASHBOARD_UID) # 2. 提取目标Dashboard已有的面板唯一标识,用panel.uid作为判断依据(Grafana 8+面板默认带uid) existing_panel_uids = {p["uid"] for p in target_dash["dashboard"]["panels"] if "uid" in p} # 老版本Grafana无panel.uid的情况,可以用标题+类型组合作为判断依据: # existing_panel_keys = {(p["title"], p["type"]) for p in target_dash["dashboard"]["panels"]} # 3. 筛选master里的新增面板 new_panels = [] for panel in master_dash["dashboard"]["panels"]: if panel.get("uid") not in existing_panel_uids: new_panel = panel.copy() new_panels.append(new_panel) if not new_panels: print("无新增面板需要同步") exit() # 4. 处理面板ID冲突:给新增面板分配不重复的ID,取现有最大ID+1开始递增 max_existing_panel_id = max(p["id"] for p in target_dash["dashboard"]["panels"]) for idx, panel in enumerate(new_panels): panel["id"] = max_existing_panel_id + idx + 1 # 5. 把新增面板拼接到目标Dashboard的面板列表中 target_dash["dashboard"]["panels"].extend(new_panels) # 6. 构造提交的请求体,去掉不需要的meta字段,开启覆盖避免版本冲突 post_data = { "dashboard": target_dash["dashboard"], "overwrite": True, "message": "同步master-plots新增面板" } # 7. 提交更新 resp = requests.post( f"{GRAFANA_URL}/api/dashboards/db", headers=HEADERS, json=post_data ) resp.raise_for_status() print(f"同步成功,共新增{len(new_panels)}个面板,新版本号:{resp.json()['version']}")
注意事项
- 同步前建议先备份
server-plots的原始JSON,避免配置错误导致面板丢失 - 如果master的面板依赖特定的Dashboard变量或数据源,需要提前在
server-plots中配置对应的变量和数据源,否则同步后面板会加载失败 - 如果需要同步更新已存在的面板配置,只需要修改筛选逻辑,匹配到相同uid的面板后直接替换即可
内容的提问来源于stack exchange,提问作者coderKeed
相关产品推荐
相关产品推荐

