Grafana: (3) 变量的创建、管理与使用

建议点击 查看原文 查看最新内容。

原文链接: https://typonotes.com/posts/2023/06/08/grafana-variable-management/

之前在 Grafana: (1) DataSource 数据源管理 中提到过, 对于不同环境的的数据源命名是具有一定规则, 可以在后期通过变量管理。

这个需求其实很好理解:

  1. 不同的团队 对定制的监控界面有各自的需求, 大部分情况下 不能混用
  2. 而某个团队的 不同环境 的界面 又需要一致, 这样使用起来没有额外学习成本。

在面板中 引入变量, 能快速切换不同环境, 还能对更好的过滤查询条件。 这点很容易理解。

1. Grafana 变量

Grafana 给出了 9种内置变量类型 , 个人比较常用的有一下几种

  1. Global Variables: 内置全局变量
  2. Data Source: 数据源
  3. Query: 查询
  4. Interval: 间隔
  5. Ad hoc filters: 条件过滤

2. Grafana 变量配置

在 Dashboard 右上角 点击 齿轮/Dashboard Setting 进入配置界面, 选择 变量/Variables

点击 Add Variable 或者 New 创建变量

可以认为分为 三个区 或者 四个区(按名字)

  1. 红区: 对变量的定义, 描述
  2. 黄区: 对于变量的过滤或补充。 不同类型的变量这部分不同。
  3. 绿区: 结果预览。

重点说一下 红区

  1. Name: 变量名称。 一定要用有 语义单词或词组, 方便后期使用和展示。
  2. Label: Dashboard 上的显示名称, 如果为空则显示 Name。 这部分我通常不写。 变量名已经有了明确的意思, 直接用变量名更方便。
  3. Description: 变量描述。 这部分类似注释, 可以多写一些提示性语句。
  4. Type: 变量类型
  5. Hide: 是否隐藏。 一些 不需要用户控制 的变量就可以隐藏。 后面会有一个案例说明。

2.1. DataSource数据源 变量

我们创建一个 数据源变量。 直接看图, 很直观了。

实际上, 在没有过滤之前, 我拥有 十多个 Prometheus 的变量。

2.2. Query/查询 变量

Query 变量应该是用的 最多 的变量之一了。

  1. Type 选择 Query。 通过查询获得结果。
  2. 还需选择 DataSource, 不同的 数据源类型 语句对应的查询语句的语法肯定是不一样的, 这个很好理解。 这里我们选择刚才创建的变量 ${MyCluster}
  3. 变量的 Refresh 刷新时机。 是 加载面板 或者 时间范围变化 触发, 根据各自的情况选择。
  4. 过滤依旧是 Regex, 使用的 Google/re2 的正则表达语法。
  5. Sort 排序通常选 Alphabetical(asc) , 依据字母表顺序排列。

2.3. label_valuesquery_result

需要重点强调一下的是 label_valuesquery_result 都是 Grafana 针对 Prometheus 的语法, Prometheus template variables , 只能在 Grafana 上使用。

这两个 方法/函数 都可以通过 Grafana 在 Prometheus 进行数据查询, 并返回数据。 但是一些差异。

label_values

这里有一个很重要的 方法/函数: label_values, 可以提取一个 标签

语法很简单

label_values( 向量, 标签名)

例如上图中我们使用的条件, 以获取 namespace 的值

1
label_values( up{}, namespace )  # 查询 up, 提取 namespace 标签

在向量中, 查询条件是可以 扩展 的, 也是可以使用 变量 的。 例如这里通过提出 job 的值的时候, 使用了变量 namespace 的值。

1
label_values( up{namespace="$namespace"}, job) # 带有 up, 提取 job 标签

这应该可以算作 Chained Variable/链接变量 , 理论上是 无限 嵌套的, 但最好这种变量查询 不要超过 5-10 层(主要还是看每次查询的数据量)。

query_result

关于 query_result 我还没搞清楚到底要怎么用, 以及用在什么地方。

按照官方的说法: label_vaules 不支持查询, 因此可以使用 query_result 查询结果, 并通过 正则 过滤。

query_result(topk(5, sum(rate(up[1m])) by (instance)))

官方在这里有一个案例 Use interval and range variables , 有兴趣可以自己了解一下。

2.4. 变量的依赖关系

话说回来, 所有变量创建完成之后, 可以在 变量管理 界面, 点击右上角的 Show Dependencies 查看变量之间的以来关系。

2.5. 使用变量

使用变量很简单, 将变量替换在对应的地方就可以了。

这是替换后

这是替换前

3. 变量的语法

这里说说变量的基础语法。

  1. $variable 这是最基本的用法。
  2. ${variable} 可以使用这种方式将变量包裹起来。 通常用于有歧义表达式。 例如 ${variable}_1$variable_1 就是两个完全不同的含义。 这个点 Shell 类似。
  3. ${variable:<format>} 可以变量进行不同类型的格式化。 要注意 格式化 的方法是 Grafana 提供并限制了的。

可以点击链接到官网, 查看其他 更高级变量的语法