博客/工程

如何用API修复坏掉的Grafana仪表盘

2019年9月23日5分钟

最近,我们遇到了一个问题,一位客户的仪表盘坏了,以至于在装载时挂了起来。这是一个非常罕见的问题,在这种情况下是客户创建的实例引用自身的变量.一旦仪表板以这种方式损坏,就不可能找到允许您删除该变量的屏幕。这篇文章不是关于它是如何被打破的,而是关于我们如何解决这个错误。

那么,如何恢复所有投入到仪表板外观的工作时间呢只是对吧?我们将介绍几种不同的方法来摆脱这种棘手的情况。

这个问题

首先,让我们创建一个简单的仪表板,其中包含一个工作变量。

简单的仪表板
简单的仪表板
变量编辑
变量编辑
变量编辑仪表板
变量编辑仪表板

我还对仪表板进行了一些编辑,这样我们就可以看到版本控制是如何工作的。稍后再详细介绍。

现在让我们通过添加一个自引用变量来打破仪表板。

变量了
变量了

现在,当我们加载仪表板时,我们只看到这个屏幕上有一个旋转的“Services”错误消息。

变量服务错误
变量服务错误

解决方案#1:使用API

为了解决这个问题,我们首先需要使用API。这里的所有命令都将从常规的Linux终端会话运行,运行BASH并使用CURL和JQ命令。我们需要做的第一件事是创建一个API键来与API交互。在Grafana进入“Configuration -> API Key”。

变量API键被破坏
变量API键被破坏

点击“添加API密钥”,创建一个具有Admin级别权限的API密钥。运行旋度命令它显示,以确认一切正常工作。如果您使用jquery (jq)管道,您应该会看到详细描述仪表板的JSON。

~> curl -H "Authorization: Bearer eyabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcdefghabcdevfgabcjq {"meta": {"isHome": true, " csaved ": false, "canAdmin": false, "canStar": false, "slug": "" "url": "" expired ": "0001-01-01T00:00:00Z", "created": "0001-01-01T00:00:00Z", [snip] "timezone": "browser", "title": "Home", "version": 0}}

让我们来分析一下curl命令行。

解析curl命令的变量
解析curl命令的变量
  1. 授权头中需要的序言
  2. 您刚刚生成的API键(显然这已经被混淆了)
  3. 我的测试grafana服务器的URL
  4. API调用URl。这些都是记录
  5. 发送给API调用的参数
  6. 管道输出通过jquery,所以我们可以彩色格式等。

如果从命令行执行大量API调用,那么创建一个小型shell脚本来运行CURL可能会很有用。

该命令的输出实际上是描述您的主仪表板的JSON,因此我们几乎已经访问了我们想要的内容。

我们想要的实际API调用是/ api /仪表板/ uid /(散列)其中[hash]是你试图加载的仪表盘的唯一ID,你在URL中看到。因此,使用Jquery来解析JSON,我们可以很容易地看到问题在哪里。

~> curl -s -H "授权:不记名ey…X0=" http://cat-g1.local:3000/api/dashboards/uid/zwXQsOdZz |jq .dashboard. "模板{“列表”:[{“allValue”:空,“当前”:{“标签”:[],“文本”:“所有”、“价值”:[" $ __all "]},“数据源”:“普罗米修斯”,“定义”:“label_values (node_load1、工作)”,“隐藏”:0,“includeAll”:假的,“标签”:空,“多”:假的,“名字”:“节点”、“选项”:[],“查询”:“label_values (node_load1、工作)”、“刷新”:1、“正则表达式”:“”,“skipUrlSync”:假的,“排序”:0,“tagValuesQuery”:“”,“标签”:[],“tagsQuery”:“”,“类型”:“查询”、“标签”:假},{“allValue”:空,“当前”:{“isNone”:真的,“文本”:“没有”,“价值 ": "" }, " 数据源”:“——Grafana”、“定义”:“选择${破碎:csv}”、“隐藏”:0,”includeAll“:假的,“标签”:空,“多”:假的,“名称”:“破”、“选项”:[],“查询”:“选择${破碎:csv}”、“刷新”:1、“正则表达式”:“”、“skipUrlSync“:假的,”“:0,”tagValuesQuery”:“”、“标签”:[],“tagsQuery”:“”、“类型”:“查询”、“标签”:假}]}

这样,我们就可以将整个仪表板部分转储到一个文件中,编辑该文件以删除损坏的变量,然后将其作为一个新的仪表板导入。

~> curl -s -H "授权:不记名ey…X0=" http://cat-g1.local:3000/api/dashboards/uid/zwXQsOdZz |jq .dashboard > broken.json .

编辑破碎的。Json,并删除以下部分:

  • 被破坏的模板部分
  • UUID、名称和版本。

确保它是有效的JSON(例如,没有后面的逗号)。

在Grafana中,导航到仪表板->管理->导入将损坏文件的内容粘贴到文本框中,然后单击“加载”。如果您的JSON是有效的,那么您应该恢复到原来的仪表板,减去损坏的变量。

解决方案#2:使用版本控制

也可以通过使用内置的仪表板版本控制来修复这个问题。

获取损坏仪表盘的ID。

~> curl -s -H "授权:不记名ey…X0=" http://cat-g1.local:3000/api/dashboards/uid/zwXQsOdZz |jq .dashboard. "id 4

获取损坏仪表板的版本列表。

~> curl -s -H "授权:ey…X0=" http://cat-g1.local:3000/api/dashboards/id/4/versions|jq [{"id": 56, "dashboardId": 4, "parentVersion": 7, "restoredFrom": 0, "version": 8, "created": "2019-08-14T14:05:45+01:00", "createdBy": "admin", "message": "broken"}, [snip] {"id": 49, "dashboardId": 4, "parentVersion": 0, "restoredFrom": 0, "version": 1, "created": "2019-08-14T12:52:22+01:00", "createdBy": "admin", "message": "初始保存"}]

在这里您可以看到仪表板版本的所有历史。如果您想检查特定版本的JSON,请继续。仪表板版本ID实际上叫做" parentVersion "

~> curl -s -H "授权:不记名ey…X0=" http://cat-g1.local:3000/api/dashboards/id/4/versions/8 |jq "id": 56, "dashboardId": 4, "parentVersion": 7, "restoredFrom": 0, "version": 8, "created": "2019-08-14T14:05:45+01:00",[剪辑]"uid": "zwXQsOdZz", "version": 8}, "createdBy": "admin"}

我们可以看看两个仪表板之间的区别,但输出是为前端输入而设计的,所以这不是很有帮助。

但是,我们可以告诉后端在破坏之前恢复以前的版本。

~> curl -s -H "Content-Type: application/json" -H "Authorization: holder ey…X0 = " http://cat-g1.local: 3000 / api /仪表板/身份证/ 4 /恢复- d '{“版本”:7}{" id ": 4,“鼻涕虫”:“cpu_test_query”,“状态”:“成功”,“uid”:“zwXQsOdZz”、“url”:“/ d / zwXQsOdZz / cpu_test_query”、“版本”:10}

结论

使用API不仅仅是为了希望自动化一切的开发人员类型。如果您需要摆脱困境,熟悉与API的交互,除了有用之外,还可以帮助您发现管理和与Grafana系统交互的新方法,从将仪表板从一个系统复制到另一个系统,到生成关于您的Grafana使用情况的元数据。