如何构建 Grafana 动态面板并可视化分析开源社区数据

72 阅读4分钟

前言

《如何对开源社区的数据进行可视化分析》中我们介绍了如何通过 GitHub GraphQL API 获取数据并结合 MySQL 和 Grafana Dashboard 对开源社区的数据进行可视化分析与展示。

本篇文章将继续这一话题,并将重点放在如何通过 Variables 构建一个动态的 Grafana Dashboard。

静态面板和动态面板

静态面板

静态面板在本文中指的是面板对应的查询的内容是 “写死的” 或者说通过硬编码编写的。

想象一下你想通过 Grafana 监测你的后端服务器 backend_server_1 的负载情况,于是你将 backend_server_1 写死在了查询中,本着能跑就行的原则来说这确实没有问题;但当这一台服务器已经不足以支持你的应用程序的时候,你可能需要添加 backend_server_2backend_server_3 等等,这时你最开始编写的查询就会出现问题,每当你添加或者减少一台服务器你可能就需要修改一次查询的内容,这是非常麻烦和低扩展性的。

以之前文章中获取各个仓库的 Star 数变化情况的面板为例:

image-20240421151547317.png

其对应查询数据的 SQL 中将仓库的名字都确定 “死了”,这种静态面板是非常傻的,不要做这样的事。

image-20240713205111357.png

动态面板

通过使用 Grafana Dashboard 提供的 Variables 特性,我们可以轻松构建出一系列随着设置的变量进行动态变化的面板。

与静态面板相比,动态面板通过编写与不同类型的变量相配合的各种查询,更加灵活和自然。

创建变量

Grafana Dashboard 所支持创建的变量类型非常多(如下表所示),其创建与使用的方式都大同小异,我们这里主要讨论 Query 类型的变量,如果你想了解其他类型的变量,你可以查看官方文档

变量类型描述
Query查询生成的值列表,例如度量名称、服务器名称、传感器 ID、数据中心等。
Custom使用逗号分隔的列表手动定义变量选项。
Text box显示一个带有可选默认值的自由文本输入字段。
Constant定义一个隐藏的常量。
Data source快速更改整个仪表板的数据源。
IntervalInterval 变量表示时间跨度。
Ad hoc filters自动添加到数据源(仅限 Prometheus、Loki、InfluxDB 和 Elasticsearch)的所有度量查询中的键/值过滤器。
Global variables可以在查询编辑器中的表达式中使用的内置变量。
Chained variables变量查询可以包含其他变量。

变量的创建在 Dashboard Settings 的 Variables 选项卡中,点击 New variale 即可。

image-20240713211435357.png

将变量的类型设置为 Query 后我们可以编写一个查询来设置到这个变量实际的值。

我们这里创建一个简单的 login 变量来查询出数据库中所有 GitHub 组织的名字,由于我们使用了 MySQL 作为数据源,所以我们只需编写一个简单的 SQL 即可。

image-20240713212504049.png

完成创建之后的 login 变量效果如下,所有的组织都被查询了出来并以下拉框列表的形式进行展示,我们可以选择一个条目作为 login 变量实际的值。

image-20240713212813110.png

变量之间还可以互相引用。 例如现在我想再创建一个 repos 变量,它可以展示一个组织下的所有仓库的名字,于是我们只需要再 repos 变量的查询中通过 $varname 语法来使用我们已经创建的 login 变量即可,更多使用变量的语法,你可以参考官方文档

image-20240713223232598.png

通过 Variables 选项卡的 Show dependencies 你可以清晰的看到各个变量之间的依赖关系。

image-20240713223942307.png

我们还可以选择将查询出的多个值设置为变量实际的值。

image-20240713223428806.png

现在我们的 repos 变量通过引用 login 变量并开启 Multi-value 选项,我们可以选择一个特定组织下的多个仓库的名字作为 repos 变量的值。

image-20240713223712008.png

使用变量

使用变量的方式正如我们在创建 repos 变量中做的那样,通过 $varname 或者 ${var_name} 等语法来将变量嵌入具体的查询或者表达式即可。

为了直观的让你看到动态面板相对于静态面板的灵活性与优点所在,我们仍然以最开始的 获取各个仓库的 Star 数变化情况的面板 为例,现在我们有了 repos 变量可以根据 login 变量所选中的组织的名字来选中多个组织下的仓库名字并作为 repos 变量的值。于是我们可以通过以下这种方式来编写我们的 SQL:

image-20240713225847243.png

如图所示:

  • 我们为选中 cloudwego 这个组织作为 login 变量的值并在 repos 变量中选择了组织下的 netpoll,kitex 和 hertz 这三个仓库;
  • 在 SQL 中我们通过 $varname 的语法使用了 repos 变量;
  • 最终可以看到我们的图表显示了我们选中的三个仓库的 Star 数变化趋势;

这比我们最开始在查询中直接写上仓库的名字要优雅多了。

另外一个需要 注意 的点是在图中的这种用法需要你在添加一个额外的 Transform 来处理查询出的数据,Multi-frame time series Transform 可以将查询返回的字符串类型值作为一种标签,从而可以对各个标签的时间序列进行分别展示。

image-20240713230917377.png

总结

以上就是本篇文章的所有内容了,我们通过实际例子来了解了 Grafana Dashboard 中的 Variables 的使用,这让我们可以很轻松的创建出灵活的动态面板。

通过对 Grafana Dashboard Variables 等特性的使用,OPENALYSIS 项目可以更加灵活的对配置的开源社区的数据进行可视化分析,我相信这可以帮助你更好的对你所在开源社区进行构建与发展。

参考列表