前言
在《如何对开源社区的数据进行可视化分析》中我们介绍了如何通过 GitHub GraphQL API 获取数据并结合 MySQL 和 Grafana Dashboard 对开源社区的数据进行可视化分析与展示。
本篇文章将继续这一话题,并将重点放在如何通过 Variables 构建一个动态的 Grafana Dashboard。
静态面板和动态面板
静态面板
静态面板在本文中指的是面板对应的查询的内容是 “写死的” 或者说通过硬编码编写的。
想象一下你想通过 Grafana 监测你的后端服务器 backend_server_1
的负载情况,于是你将 backend_server_1
写死在了查询中,本着能跑就行的原则来说这确实没有问题;但当这一台服务器已经不足以支持你的应用程序的时候,你可能需要添加 backend_server_2
,backend_server_3
等等,这时你最开始编写的查询就会出现问题,每当你添加或者减少一台服务器你可能就需要修改一次查询的内容,这是非常麻烦和低扩展性的。
以之前文章中获取各个仓库的 Star 数变化情况的面板为例:
其对应查询数据的 SQL 中将仓库的名字都确定 “死了”,这种静态面板是非常傻的,不要做这样的事。
动态面板
通过使用 Grafana Dashboard 提供的 Variables 特性,我们可以轻松构建出一系列随着设置的变量进行动态变化的面板。
与静态面板相比,动态面板通过编写与不同类型的变量相配合的各种查询,更加灵活和自然。
创建变量
Grafana Dashboard 所支持创建的变量类型非常多(如下表所示),其创建与使用的方式都大同小异,我们这里主要讨论 Query
类型的变量,如果你想了解其他类型的变量,你可以查看官方文档。
变量类型 | 描述 |
---|---|
Query | 查询生成的值列表,例如度量名称、服务器名称、传感器 ID、数据中心等。 |
Custom | 使用逗号分隔的列表手动定义变量选项。 |
Text box | 显示一个带有可选默认值的自由文本输入字段。 |
Constant | 定义一个隐藏的常量。 |
Data source | 快速更改整个仪表板的数据源。 |
Interval | Interval 变量表示时间跨度。 |
Ad hoc filters | 自动添加到数据源(仅限 Prometheus、Loki、InfluxDB 和 Elasticsearch)的所有度量查询中的键/值过滤器。 |
Global variables | 可以在查询编辑器中的表达式中使用的内置变量。 |
Chained variables | 变量查询可以包含其他变量。 |
变量的创建在 Dashboard Settings 的 Variables 选项卡中,点击 New variale
即可。
将变量的类型设置为 Query
后我们可以编写一个查询来设置到这个变量实际的值。
我们这里创建一个简单的 login
变量来查询出数据库中所有 GitHub 组织的名字,由于我们使用了 MySQL 作为数据源,所以我们只需编写一个简单的 SQL 即可。
完成创建之后的 login
变量效果如下,所有的组织都被查询了出来并以下拉框列表的形式进行展示,我们可以选择一个条目作为 login
变量实际的值。
变量之间还可以互相引用。 例如现在我想再创建一个 repos
变量,它可以展示一个组织下的所有仓库的名字,于是我们只需要再 repos
变量的查询中通过 $varname
语法来使用我们已经创建的 login
变量即可,更多使用变量的语法,你可以参考官方文档。
通过 Variables 选项卡的 Show dependencies
你可以清晰的看到各个变量之间的依赖关系。
我们还可以选择将查询出的多个值设置为变量实际的值。
现在我们的 repos
变量通过引用 login
变量并开启 Multi-value
选项,我们可以选择一个特定组织下的多个仓库的名字作为 repos
变量的值。
使用变量
使用变量的方式正如我们在创建 repos
变量中做的那样,通过 $varname
或者 ${var_name}
等语法来将变量嵌入具体的查询或者表达式即可。
为了直观的让你看到动态面板相对于静态面板的灵活性与优点所在,我们仍然以最开始的 获取各个仓库的 Star 数变化情况的面板 为例,现在我们有了 repos
变量可以根据 login
变量所选中的组织的名字来选中多个组织下的仓库名字并作为 repos
变量的值。于是我们可以通过以下这种方式来编写我们的 SQL:
如图所示:
- 我们为选中 cloudwego 这个组织作为
login
变量的值并在repos
变量中选择了组织下的 netpoll,kitex 和 hertz 这三个仓库; - 在 SQL 中我们通过
$varname
的语法使用了repos
变量; - 最终可以看到我们的图表显示了我们选中的三个仓库的 Star 数变化趋势;
这比我们最开始在查询中直接写上仓库的名字要优雅多了。
另外一个需要 注意 的点是在图中的这种用法需要你在添加一个额外的 Transform 来处理查询出的数据,Multi-frame time series
Transform 可以将查询返回的字符串类型值作为一种标签,从而可以对各个标签的时间序列进行分别展示。
总结
以上就是本篇文章的所有内容了,我们通过实际例子来了解了 Grafana Dashboard 中的 Variables 的使用,这让我们可以很轻松的创建出灵活的动态面板。
通过对 Grafana Dashboard Variables 等特性的使用,OPENALYSIS 项目可以更加灵活的对配置的开源社区的数据进行可视化分析,我相信这可以帮助你更好的对你所在开源社区进行构建与发展。