You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:54:03