博客/工程

如何配置Grafana作为代码

2020年2月26日7分钟

Grafana仪表板可以做很多事情,但是您知道通过将它们配置为代码可以从它们中得到多少吗?

这是最近由Grafana实验室软件开发人员Malcolm Holmes和因纽特人的开源顾问Julienbob电竞频道 Pivotto在FOSDEM 2020演讲的主题。在他们的陈述中,两人讨论了Grafonnet(一个Jsonnet库来生成Grafana仪表板),提供了如何有效使用它的技巧,并解释了如何从代码中完全管理你的Grafana实例。

所以。很多。仪表板。

Pivotto首先承认了这一点Grafana的丰富的用户界面,这使得创建漂亮的仪表盘很容易。正因为如此,您最终会想要创建大量的仪表板——而且您拥有的仪表板越多,您就能越快地理解基础设施中正在发生的事情。

他说,这一切看起来都很好,但随着时间的推移,你不得不为偏好和目标相互冲突的人维护一套仪表板。或者你正在处理混乱,因为一个图表显示了一种颜色的错误,而一个新的图表使用了不同的颜色。或者在Grafana中有一个新功能,你需要改变50个仪表板才能使用它。因此,确保您的仪表板工作和外观良好不再是一个简单的过程。

“这就是为什么你想把仪表板当作代码来使用,”他说,并强调从开发人员到运营人员,能够看到仪表板,看到相同的东西,阅读相同的东西,并以完全相同的方式理解仪表板是多么重要。“这很难做到。”

Grafana仪表板可以以多种方式创造:通过Grafana UI,通过Grafana的REST API, Terraform提供者,甚至直接将它们推到Grafana数据库。

“不仅如此,现在Grafana还支持开箱即用的文件供应,”Pivotto解释说,“这意味着你可以对Grafana说,‘嘿,请进入一个特定的目录,查看那里的所有JSON文件,并将它们作为仪表板加载到Grafana中。’当你在那里更新文件时,Grafana会自动拾取并直接更新你的仪表板,当你想对仪表板进行编码并使它们与你的文件保持一致时,这真的很好。”

由于Grafana仪表板中的所有内容都是JSON,所以这非常简单。但Pivotto说,JSON本身“毫无乐趣”,因为它很难用传统的模板系统来制作模板。

JSON
JSON

进入Jsonnet

福尔摩斯在演讲开始时提出了一个问题:“对此我们能做些什么?”

然后,他提出了一种更好的处理JSON的方法:使用一种名为Jsonnet的语言,这是JSON的超集(也用于将资源部署到Kubernetes)。执行Jsonnet脚本的最终结果是JSON。

他说:“Jsonnet有很多很多语言特性,使用、合作、生成JSON以及与他人合作生成JSON都很愉快。”

Jsonnet
Jsonnet

通过上面的例子,他指出:

  • 定义一个局部变量,然后稍后引用该局部变量。
  • 你得到了“漂亮的语法糖”,而不必使用引号。
  • 冒号语法意味着隐藏的在程序的其他地方可用,但不会出现在最终的JSON输出中。

语言的各个方面

Holmes强调了Jsonnet的三个特别之处。

功能

Jsonnet功能
Jsonnet功能

他说,在这个经过删节和简化的示例中,您将定义一个名为仪表板()与一个标题和一个uid.“所以你可以看到,如果你想象这个仪表盘JSON要长得多,我们可以把所有这些都封装在一个非常非常简单的命令中。”

问题是,在上面的例子中schemaVersion是天生的。如果你想创建一个仪表板使用schemaVersion: 22而不是schemaVersion: 20,指示板函数没有暴露它。

补丁

为了解决这个问题,Jsonnet有补丁的概念。您调用Jsonnet函数并将JSON片段附加到它,它只是添加-覆盖-schemaVersion:像这样:

Jsonnet补丁
Jsonnet补丁

霍姆斯说,这段代码“极其强大”。“它允许你有一个功能,说,‘这是我们认为你会需要的东西。但如果有什么我们没想过的,没关系。你仍然可以扩展它。’”

进口

您不仅可以创建函数,还可以将这些函数放入文件中。

Jsonnet进口
Jsonnet进口

在上面的例子中,Holmes展示了一个新函数被放入一个名为dashboard.libsonnet.然后在main.jsonnet,他将该仪表盘文件加载到一个名为指示板,并将其称为新()方法。最后,他补充道schemaVersion: 22最终得到了完全相同的JSON。

“所以现在我们已经把脚本分解成多个文件,”他说,“我们可能会发现——现在我们已经有能力创建一个仪表板——我们可以有100个这样的脚本来创建我们所有的许多许多最终的仪表板。”

为了更进一步,Jsonnet有一个叫做Jsonnet捆绑器的工具,Holmes说它“有点像在golang中出售。它可以从GitHub或类似的地方收集Jsonnet库,这样你就可以在公共场合与其他人就你的仪表板和资源进行互动,这使得协作更加有效。”

现成的库

这是两个有用的现有库:

其中最突出的是Grafonnet (Holmes和Pivotto在他们的演示中使用了它),它是一个非常简单的库,为您提供了基本功能:创建仪表板、创建面板、创建单个统计面板等等。

Grafonnet-lib
Grafonnet-lib

演示

随后,两人进行了简短的演示。

在其中,他们能够创建两个非常简单的、可重用的仪表板以及可重用的面板和可重用的覆盖——而且它们看起来都一样。

“我们在两个仪表板之间重用了99%的代码,”Pivotto指出。“所以如果你设计了一次,你想让多个团队重复使用它,即使你开始添加颜色——比如我想看到用过的空间用红色,空闲空间用绿色——你可以用任何类型的指标来显示完全相同的东西,并且总是以相同的方式。”

未来

在Grafana实验室里有很多关于如何更好地将Grafana实例作为代码来管理的讨论,Hobob电竞频道lmes说。我们相信它有很多强大的功能,讨论产生了很多想法,比如:如果Grafana本身有原生的Jsonnet功能,那么你不运行Jsonnet来生成JSON,你只是放弃Jsonnet?

“关于它如何相互作用,有各种各样有趣的想法,”他解释道——这可能真的很简单。您已经在源代码控制中拥有了应用程序,因此,我们可以使用预先打包的应用程序,其中嵌入了代码和仪表板以及监视配置。这样,仪表板(及其附带的所有内容)将以与其余代码相同的方式运行。这一点特别有用,因为人们喜欢把仪表板放在版本控制中,集成在CI/CD管道中,就像他们的其他代码一样。

Grafonnet是一个开源项目,Holmes说,在未来一年左右的时间里,他预计该图书馆可能会加速发展。

Grafana云是开始使用仪表板、指标、日志和跟踪的最简单方法。我们有一个慷慨的免费永远层和计划为每个bob体育手机二维码用例。现在免费注册