Grafana: (5) Data Source 绑定/联动的解决方案(曲线救国)

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

原文链接: https://typonotes.com/posts/2023/06/17/grafana-datasource-relation/

之前在下述两篇文章中说到了 Grafana 变量的应用

  1. Grafana: (1) DataSource 数据源管理
  2. Grafana: (3) 变量的创建、管理与使用

我们将数据源的值使用了 变量 控制, 保证同样的 Dashboard 可以应用到不同的环境。 不仅减少工作了工作, 还同时保证了环境的一致性。

但是, 当我们具有多个变量的时候就出现问题了, 假设我们现在有 三组K8s集群 对应 三个日志集群

  1. K8sCluster: Prometheus-K8S-DEV, Prometheus-K8S-STG, Prometheus-K8S-PRD
  2. SLS_Store: Aliyun-SLS-DEV, Aliyun-SLS-STG, Aliyun-SLS-PRD

使用时, 变量的变更不能联动

在用户侧, 用户选择变量值的操作, 都是 完全独立的。 Grafana 并没有变量变更的 联动机制。 换而言之, 我在改变变量 K8sCluster 的值的时候, 不能同时改变对应的 LogCluster。

由于之前我习惯于根据 环境 的类型对变量进行分组, 这时候用起来就尴尬不已。

K8sCluster-DEV -> LogCluster-DEV
K8sCluster-STG -> LogCluster-STG
K8sCluster-PROD -> LogCluster-PROD

比如上图, 日志集群选择的是 DEV, 但是 Prometheus 监控集群对应的 PROD

解决方案, 曲线救国

思路是这样的, 如果在 当前界面 无法关联, 那么就在上级想办法将其绑定。

举个不恰当的例子, 如果自己找不到对象, 就让父母定一个娃娃亲。

在这里, 我使用 PgSQL 保存了数据源之间的关系。

注: PgSQL 作为数据源, 还有可以用于 Grafana(6): 使用数据源实现扩展函数支持

新创建的 父界面 被做成了 入口界面, 仅展示了当前界面的简略信息, 例如服务列表。

  1. 变量 列表中, 只提供 K8S 集群变量。 减少操作。
  2. 在 Summary Entry 表格中的 Container 字段上, 添加 Link, 点击即可跳转到 Summary 详细界面。 而在 Linux 中, 可以添加 SLS 的变量值。
/d/xxxxxxx/k8s-service-summary?orgId=1&var-K8sCluster=${K8sCluster}&var-SLS_Store=${ro_SLS_Store}&var-namespace=${namespace}&var-container=${__value.raw}

注意: 这里是 内部 页面跳转, 可以不用写 域名 地址。

在配置变量的时候注意, ro_SLS_Store 并不是一个 数据源类型 的变量。 而是一个 Query/查询 变量。

通过查询 PgSQL 数据库表中保存的信息, 返回了一个 与数据源 SLS_Store 同名 的值。 而这个 Query 变量是可以进行联动的。

有了 ro_SLS_Store 变量值后, 上面的 Link 值就可以正常翻译了。

为什么不直接将两个数据源变量关联?

不是不想, 是不支持。

曾经做过 变量嵌套 的尝试, 类似 ${SLS_${Env}} 这样。 想通过 ${Env}=DEV 推导出 ${SLS_DEV}=SLS_Store_DEV 这样的方式。 但是没成功。