仪表盘变量(大盘变量)使用说明

快猫运营团队 2025-04-21 14:43:39

夜莺仪表盘支持变量(即大盘变量),变量的作用是数据筛选,夜莺的大盘变量定义方式和 Grafana 几乎一样,但是很多人没有用过 Grafana,所以这里写一篇文章,简单介绍一下夜莺的仪表盘变量的使用方法。

仪表盘变量样例

我们先来看一个例子:

上面的仪表盘 JSON 可以从下面地址下载:

https://github.com/ccfos/nightingale/blob/main/integrations/Linux/dashboards/host_generic_categraf.json

红框中就是大盘变量。在这个仪表盘中,有两个变量,一个是数据源,一个是机器:

  • 数据源变量:如果你在夜莺里接入了多个 Prometheus/VictoriaMetrics 数据源,可以通过数据源变量做数据源的切换。
  • 机器变量:通常公司都有多台机器,可以通过机器变量选择要查看的机器。

把鼠标放到变量旁边,会出现一个编辑按钮:

点击编辑按钮,就可以进入变量的编辑界面:

点击不同的变量,就可以查看变量的配置啦。点击 prom 变量,就可以看到这个变量的详细配置了:

  • 变量名称:变量的一个唯一标识符
  • 显示名称:仪表盘最上面展示的变量的名称
  • 变量类型:数据源(Datasource),变量类型有多种,这里的变量就是为了筛选数据源的,所以变量类型选择数据源
  • 数据源类型:选择 Prometheus,因为我们希望变量下拉框里只展示 Prometheus 类型的数据源,VictoriaMetrics、Thanos 等和 Prometheus 接口兼容的数据源,也都归为 Prometheus 类型
  • 隐藏变量:如果勾选了隐藏变量,仪表盘最上面就没法筛选了
  • 数据源过滤:可以通过正则对数据源列表做二次过滤
  • 默认值:默认选中哪个数据源

数据源类型的变量,相对简单,下面我们再点开 ident 变量,看看 ident 变量的详细配置:

夜莺仪表盘变量

和 prom 变量相同的配置就不解释了,不同的部分是:

  • 变量类型:选择「查询(Query)」,即这个变量的下拉框的内容,是向数据源发起了一次查询,把查询结果整理之后放到下拉框里了
  • 数据源:指定这个查询时向哪个数据源查询,正常来说,应该和前面的数据源变量联动,所以选择 ${prom}
  • 变量定义:整体来看,是一个函数,函数名是 label_values,含义是表示查询 system_uptime 这个 promql,从查询结果中提取 ident 这个标签的值,作为下拉框的内容
  • 多选:如果勾选了,下拉框里可以选择多个值,但是,这要求仪表盘中每个图表的 promql 中写过滤条件的时候,都要写成 ident=~"$ident" 的形式,不能写成 ident="$ident" 的形式,因为 promql 中 = 只能匹配一个值,而这里勾选了「多选」,用户可能选择了多个值
  • 包含全选:用于控制下拉框里是是否出现「All」选项
  • 自定义全选值:即用户选择「All」的时候,promql 中最终给 $ident 变量赋的什么值,通常来讲是 .*,表示匹配所有值,即便这个标签值为空也会被查到,如果要求这个标签值不能为空,可以配置为 .+,表示匹配所有值,但是不能为空

这里最最关键的是变量定义部分。我再额外举几个例子。

  • label_values(ident) 这样也可以,没有配置预查询的 promql,只是指定了 ident 标签名。这样一来,系统会去查询时序库里的所有标签,然后取所有 ident 标签的值,去重之后返回,虽然这样可以工作,但是性能会差很多,因为要查询所有的标签,尤其是当数据量很大的时候,性能会很差。
  • label_values(disk_free, ident) 这样也可以,预查询的 promql 配置的是 disk_free,和配置成 system_uptime 的效果差不多。因为所有机器都有硬盘,所以根据 disk_free 这个指标的查询结果,提取 ident 标签的值,和 system_uptime 的查询结果是一样的。但是,一个机器通常会有多个硬盘分区,所以,理论上,disk_free 的查询结果要比 system_uptime 的查询结果要多,所以性能上会稍微差一些。你就拿着 system_uptimedisk_free 这俩 promql 分别去即时查询里查一下,看看结果就知道了。
  • label_values(disk_free{path="/"}, ident) 这个写法相比上面一个,预查询的 promql 中多了一个过滤条件 {path="/},一个机器只有一个根分区,所以这个查询的性能和 system_uptime 是差不多的。但是要注意,Windows 机器没有根分区,所以 disk_free{path="/"} 只能过滤到 Linux,而不能过滤到 Windows 机器。如果只想过滤 Windows 机器怎么写?可以写成 label_values(disk_free{path="C:"}, ident),Windows 机器都有 C 盘,所以这样就可以过滤到 Windows 机器了。

上面的写法,是查询整个时序库,把结果放到下拉框里,如果我只想查看当前业务组下面的机器,应该如何定义呢?

把变量类型设置为「机器标识(Host ident)」即可。系统会去仪表盘所属的业务组查询下面的机器列表放到下拉框里。这样一来,不同业务组下面的仪表盘,就可以只查看所在业务组下面的机器了。

One more thing

夜莺可以做指标、日志告警,但是通常一个公司会有很多套监控系统,云上的、云下的、开源的、商业的,甚至还有一些自研的监控系统。这导致告警事件散落各处,如果想对这些事件做统一的收敛降噪、排班、认领、升级,就会比较麻烦。我们创业做了一个 Flashduty 的产品解决这个痛点,欢迎点 这里 了解哈,可以免费注册试用。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云
OpenSource
开源版
Flashcat
Flashcat