Grafana(6): 使用数据源实现扩展函数支持

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

原文链接: https://typonotes.com/posts/2023/06/29/grafana-function-extends-support/

Grafana 只提供了 Grafana 变量内置语法 。 例如

1
2
3
servers = ['test1.', 'test2']
String to interpolate: '${servers:regex}'
Interpolation result: '(test1\.|test2)'

但并没有提供额外的 function/函数 功能。 这也直接导致了在界面配置的时候, 可能无法与很多第三方组件进行交互。

举个例子

举个例子, 我使用了 Aliyun SLS 服务作为日志分析和监控工作。

但是在配置跳转链接的时候, 其中 查询字段 使用了 base64 编码。 encode=base64&queryString=X25hbWVzcGFjZV86a3ViZS1zeXN0ZW0g

https://sls.console.aliyun.com/lognext/project/<project_name>/logsearch/<logstore_name>?encode=base64&queryString=X25hbWVzcGFjZV86a3ViZS1zeXN0ZW0g&queryTimeType=99&startTime=1688008005&endTime=1688008905

经过验证: 删除 encode=base64 直接使用 明文 queryString=_namespace_:kube-system 也是可以查询的。

但是当 查询条件过多 的时候就容易因为 特殊字符空白符 造成异常。

使用 数据源 提供函数支持

天无绝人之路, 我们可以通过使用 数据源 的方式扩展出 函数/功能(甚至更多)。 接下来, 我们继续以 base64 编码为案例, 进行扩展。

这里, 我选择的是 Postgres 数据库提供支持。 关于数据源配置, 可以参考 Grafana: (1) DataSource 数据源管理

从图中 (1) 可以看到, 我们原来的字段 _namespace_: kube-system 通过 PgSQL 函数处理, 成为了一串 base64 的编码数据, X25hbWVzcGFjZV86IGt1YmUtc3lzdGVt

在 Query 的输入框内, 可以使用 变量

1
select encode('_namespace_: ${namespace}'::bytea, 'base64');

Grafana 在处理时会先变量替换成 真实值, 再交给 PgSQL 处理。

通过 扩展 数据源的方式, 可以对变量进行任何 函数/其他方式 的处理。 处理方法的限制就是数据源的限制。 理论上 所支持的函数数量无上限 的, 因为出了内置数据源类型外, 用户还可以开发定制 自己的数据源, 也就是 处理引擎

扩展变量的约束

通过之前的处理, 我们可以想办法对任何变量进行任何形式的处理。

但是同时带来了另外一个问题需要解决, 这些变量从某种意义上来说, 是 内置 的, 用户不可见 的。

如果操作界面呈现出 过多的 变量, 其一, 会给用户操作带来额外的负担; 其二, 对以后的维护也是一种累赘。

因此, 在变量管理方面, 我做了一点 额外 的工作。

  1. (2) 变量命令: 增加 前缀 ro_, 表示 只读, 用户不可选择
  2. (3) 变量可见性: 在可见性方便, 选择 Hide Variable, 直接隐藏全部, 直接在 Grafana 配置模版使用。 用户根本不可见。
  3. 在变量管理界面, 通过排序将变量按照依赖关系进行 面包屑 排序。 将 隐藏变量 全部放在最后。