xObserve

  1. 入门教程
  2. 用变量让仪表盘动起来

我们之前创造的仪表盘都是静态的,也就是说,仪表盘中的查询语句等内容都是写死的。

比如,我们之前创建的查询语句是 go_gc_duration_seconds{job="node"} ,此时我们想查询另一个 job 的数据,就需要修改查询语句为 go_gc_duration_seconds{job="prometheus"} ,对于很多场景来说,都很不方便。

所以,我们需要引入一些特性,让我们的仪表盘变得动态起来。在这篇文档中,我们将通过添加变量来实现这一点。

创建变量

变量有两种类型:仪表盘变量和全局变量。我们先从仪表盘变量开始。

  1. 访问 Hosts info 仪表盘,打开设置面板,选择 变量 选项卡。
  2. 点击 新建变量 按钮,你将看到如下的弹出框:
dashboard-variable

看起来还挺复杂的,不过别担心,让我们从简单的开始 :)

下面,我们的目标是让查询语句中的 job 动态起来,因为它有两个值:nodeprometheus,我们需要创建一个变量也有这两个值。

  1. 填写表格如下:
edit-job-variable

请观查下 Variable Values 字段,这是我们的变量查询返回的结果,如果你看到了值列表,那么说明我们的变量创建成功了。

请注意,我们创建的变量是 Custom 类型的,它的值来自于我们输入的字符串,每个值都是用逗号分隔的,比如 1,2,3 表示我们有三个值:123

  1. 点击 提交 按钮,你将在 变量 选项卡中看到一个名为 job 的变量

别忘记存储仪表盘:对仪表盘所做的几乎任何改变,都不会自动保存!

现在关闭设置面板,你将看到仪表盘左上角出现了一个下拉列表,它就是我们刚刚创建的 job 变量。

job-variable

使用变量

在这一节中,我们将使用上一节中创建的变量。

在查询语句中使用变量

现在打开 go gc info 图表的编辑面板,在左下方将查询语句修改为 go_gc_duration_seconds{job="${job}"},然后点击应用按钮,回到仪表盘页面。

可以看到,我们的图表已经在展示 job="node" 的数据 :

chart-with-job-var

尝试将 job 变量的值更改为 prometheus, 然后看看会怎样变化。

变量格式

你可能已经注意到查询语句中的 ${job},它是我们使用一个变量的标准格式,在语句执行之前,xObserve 会将语句中的变量格式替换为变量当前选择的值。

你可以在一条语句中使用多个变量,例如: go_gc_duration_seconds{job="${job}", instance="${instance}"}.

在图表标题中使用变量

变量不仅可以在查询语句中使用,还可以在很多其他地方使用: 可以使用变量的地方通常在输入框中会有一个 Support variables 的提示。

由于我们的图表在查询语句中依赖于变量 job ,可以将它添加到图表标题中,这样我们就可以知道当前正在查看哪个 job 的数据。

将图表标题修改为 go gc info - ${job}:

variable-in-panel-title

值的多选和全选

在之前,job 变量只能选择一个值,如果我们想要在查询中使用多个变量值呢?也许你可以创建多个变量,但这并不是一个好主意。

更好的方式是为变量启用 支持多选支持全选 选项,这样我们就可以从变量下拉列表中选择多个值。

修改 job 变量如下:

job-var-enable-multi

回到仪表盘页面,你将看到 job 变量的下拉列表变成了多选模式,并且有一个新的选项 __all__

尝试选择所有或者选择 nodeprometheus,你会看到…什么都没有?

没错,你将在图表中看到空白,因为查询语句是 go_gc_duration_seconds{job="${job}"},当 job 变量有多个值时,这不是一个有效的查询语句。

根据 Prometheus 文档 ,我们应该将查询语句修改为 go_gc_duration_seconds{job=~"${job}"}

修改查询语句后,你将看到如下的图表:

query-support-multi-var

从数据源查询变量值

在之前的章节中,我们都是手动输入变量值的,如果我们想从外部服务中获取一些值,比如 Prometheus 数据源,该怎么办呢?

让我们创建一个名为 instance 的变量,它代表了主机列表,下面我们来从 Prometheus 查询所有的主机名。

  1. 打开 Hosts info 仪表盘的设置面板,选择 变量 选项卡,点击 新建变量 按钮。
  2. 填写表格如下:
edit-instance-var

这里我们做了几件事情:

  1. 查询类型 字段设置为 Query,它表示从配置的数据源中查询。
  2. 选择数据源 Prometheus
  3. 使用当前时间 字段设置为启用,它表示查询将在当前选择的时间范围内执行,否则如果设置为 Off,查询将不会带上时间范围,你可能会得到几个月甚至几年前的值,查询效率可能会降低。
  4. 因为我们想要获取 instance 标签的值,所以将 查询类型 字段设置为 Label values
  5. 如果 Metric 字段留空,查询将返回 instance 标签在所有语句中的所有值。因此我们可以在这里指定一个指标名称,比如 go_gc_duration_seconds。不过,为了演示的目的,我们将保留此字段为空。
  6. Label 字段设置为 instance

现在,我们将 go gc info 图表的查询语句修改为 go_gc_duration_seconds{job=~"${job}", instance=~"${instance}"}`, 然后看看会如何变化。

试着将 job 变量也修改为从 Promethues 中查询,而不是使用 Custom 字符串

让数据源动态起来

目前,我们是在图表编辑器中直接选择某个需要的数据源,如果在不同的数据中心中有多个数据源,并且想动态选择数据源该怎么办?

在开始之前,我们再来创建一个新的数据源 prometheus2:

prometheus1-ds

接着访问 Hosts info 仪表盘,打开设置面板,选择 变量 选项卡,创建一个名为 datasource 的变量:

edit-ds-variable

这里有几点值得注意:

  1. 多选和全选只在部分场景可以使用,数据源选择显然不是这种场景,否则逻辑将非常复杂,因此请关闭这两个选项
  2. 查询类型 设置为 数据源
  3. 使用正则表达式过滤掉 TestData 数据源,毕竟我们玩的就是真实

创建该变量很简单,现在让我们在图表中使用它。

打开 go gc info 图表的编辑面板,在左下方 查询 选项卡中找到选择数据源的地方:

use-ds-variable

不要选择任何数据源,因为我们要使用变量,因此直接输入变量的引用格式 ${datasource} 即可。

input-datasource-var

输入完后按回车确认,然后输入 go_gc_duration_seconds{job=~"${job}", instance=~"${instance}"} 作为查询语句。

注意:更改数据源将导致之前的查询被清除,因此在更改数据源之前最好先复制查询语句。

应用修改并回到仪表盘页面,重新选择 datasource 变量的值,你将看到图表数据发生了… 无变化,因为 prometheusprometheus1 完全是一个数据源,只是名称不一样。

给大家留一个小练习: 尝试添加回 TestData 数据源,然后在 datasource 变量的值之间切换,你将看到图表数据发生了变化。

在查询变量时使用变量

俄罗斯有套娃,我们有套变量: 在查询变量的语句中,你还可以使用其它的变量,这样可以实现变量依赖的关系,例如当你选择一个应用列表的变量 application 时,依赖它的 host 变量也将随之变化,毕竟每个应用都有自己独有的主机列表。

首先,来创建一个名为 metrics 的变量:

metrics-variable

这里从 Prometheus 中查询所有的 metrics 列表,然后过滤出以 go_gc 开头的 metrics。

更加动感的查询语句

在另外一个变量查询中使用 metrics 之前,我们先来让图表的查询语句更加动态一些。

打开图表编辑面板,输入查询语句 ${metrics}{job=~"${job}", instance=~"${instance}"}:

dynamic-query

点击应用按钮回到仪表盘页面,然后选择 metrcs 变量,看看图表会怎么变化。

可以看出:现在的图表就连基本的语句都可以变化,而不仅仅是标签值!

在查询变量中使用

言归正传,我们现在重新编辑下之前创建的 instance 变量,并将其重命名为 metrics name, 然后在查询中使用 metrics 变量:

rename-instance-var

可以看出,在 查询 -> Metric 字段中,相比之前使用的下拉框选择,现在使用的变量名 ${metrics}明显动态的多。

尝试选择 metrics 变量的值,看看 metrics name 变量将如何变化。