链式变量也称为链接变量或嵌套变量,是在变量查询中包含一个或多个其他变量的查询变量。本节将解释链式变量的工作原理,并提供使用链式变量的仪表板示例链接。
每个数据源的链式变量查询都不一样,但前提都是一样的。您可以在任何允许链式变量查询的数据源中使用链式变量查询。
可以使用极其复杂的链接模板仪表板,深度可达 5 或 10 层。从技术上讲,深度和复杂程度没有限制,但链接越多,查询负载就越大。
以下 Grafana Play 仪表板包含相当简单的链式变量,只有两层深度。要查看变量及其设置,请单击仪表板设置(齿轮图标),然后单击“Variables”。这两个示例将在下一节中展开:
变量对于重复使用仪表盘和动态更改仪表板中显示的内容非常有用。链式变量尤其适用于过滤所看到的内容。
在变量中创建父/子关系,类似于树形结构,可以选择不同级别的筛选器。
下面的章节将深入解释上述仪表板中的链接示例,并在此基础上进行扩展。虽然这些示例是针对特定数据源的,但其概念可以广泛应用。
在本例中,有多个应用程序。每个应用程序都有不同的服务器子集。它基于 Graphite Templated Nested。
现在,你可以为每个度量源创建单独的变量,但这样你就必须知道哪个服务器与哪个应用程序相匹配。更好的解决方案是使用一个变量过滤另一个变量。在本例中,当用户更改应用程序变量的值时,服务器变量返回的下拉选项也会随之更改。这两个变量都使用了 “Multi-value” 选项和 “Include all option” 选项,使用户可以随时选择显示的部分或全部选项。
对这个变量的查询基本上就是:"给我所有存在的应用程序"。
apps.*
返回的值包括 backend、country、fakesite 和 All。
对该变量的查询基本上是:"给我当前所选应用程序的所有服务器"。
apps.$app.*
如果用户选择了 “backend”,查询就会变为:
apps.backend.*
查询会返回与 backend 关联的所有服务器,包括 backend_01、backend_02 等。
如果用户选择了“fakesite”,则查询会变为:
apps.fakesite.*
查询会返回与 fakesite 相关的所有服务器,包括 web_server_01、web_server_02 等。
注意:本示例为理论示例。示例中使用的 Graphite 服务器不包含 CPU 指标。
仪表板停止在两个级别,但您可以继续。例如,如果想获取所选服务器的 CPU 指标,可以复制服务器变量并扩展查询,使其读数为:
apps.$app.$server.cpu.*
该查询基本上是说:"向我显示所选服务器的 CPU 指标"。
根据用户选择的变量选项,可以得到以下查询结果:
apps.backend.backend_01.cpu.* apps.{backend.backend_02,backend_03}.cpu.* apps.fakesite.web_server_01.cpu.*
在本例中,您有多个数据中心。每个数据中心都有不同的主机子集。它基于 InfluxDB Templated 仪表板。
在本例中,当用户更改数据中心变量的值时,就会更改主机变量返回的下拉选项。主机变量使用 “Multi-value” 选项和 “Include all option” 选项,允许用户随时选择显示的部分或全部选项。数据中心不使用这两个选项,因此一次只能选择一个数据中心。
对该变量的查询基本上是:"给我所有存在的数据中心"。
SHOW TAG VALUES WITH KEY = "datacenter"
返回值为America、Africa、Asia和Europe。
对该变量的查询基本上是:"给我当前所选数据中心的所有主机"。
SHOW TAG VALUES WITH KEY = "hostname" WHERE "datacenter" =~ /^$datacenter$/
如果用户选择 "America",查询就会变成:
SHOW TAG VALUES WITH KEY = "hostname" WHERE "datacenter" =~ /^America/
查询会返回与 America 相关的所有服务器,包括 server1、server2 等。
如果用户选择“Europe”,则查询会变为:
SHOW TAG VALUES WITH KEY = "hostname" WHERE "datacenter" =~ /^Europe/
查询会返回与 Europe 相关的所有服务器,包括 server3、server4 等。
注:本示例为理论示例。示例中使用的 InfluxDB 服务器不包含 CPU 指标。
仪表盘停止在两个级别,但您可以继续。例如,如果想获取所选主机的 CPU 指标,可以复制主机变量并扩展查询,使其读取如下内容:
SHOW TAG VALUES WITH KEY = "cpu" WHERE "datacenter" =~ /^$datacenter$/ AND "host" =~ /^$host$/
该查询基本上是说:"向我显示所选主机的 CPU 指标"。
根据用户选择的变量选项,可以得到以下查询结果:
SHOW TAG VALUES WITH KEY = "cpu" WHERE "datacenter" =~ /^America/ AND "host" =~ /^server2/ SHOW TAG VALUES WITH KEY = "cpu" WHERE "datacenter" =~ /^Africa/ AND "host" =~ /^server/7/ SHOW TAG VALUES WITH KEY = "cpu" WHERE "datacenter" =~ /^Europe/ AND "host" =~ /^server3+server4/
以下做法将使仪表板和变量更易于使用。
链式变量创建父/子依赖关系。你可以把它们想象成一个阶梯或一棵树。
创建新链式变量的最简单方法是复制变量。在变量列表中,点击变量条目右侧的复制变量图标,创建一个副本。然后就可以添加到父变量的查询中了。
以这种方式创建的新变量会出现在列表底部。您可能需要将其拖动到列表中的不同位置,使其符合逻辑顺序。
您可以通过单击每个条目的右侧的上下箭头来更改仪表盘变量列表中变量的顺序。Grafana 会根据此列表从左到右列出变量下拉菜单,最上面的变量位于最左边。
将不存在依赖关系的变量列在顶部,在其子变量之前。
每个变量都应排在它所依赖的变量之后。
请记住,用户界面中不会显示哪些变量具有依赖关系。按逻辑顺序列出变量,以方便其他用户(和你自己)使用。
变量的依赖层越多,更改变量后更新仪表盘所需的时间就越长。
例如,如果您有一系列四个关联变量(country, region, server, metric),并且您更改了一个根变量值(country),那么 Grafana 在更新仪表板中的可视化之前必须对所有变量运行查询。