Grafana/Prometheus 节点导出器在 docker 集群模式下的错误查询

Error query in Grafana/Prometheus with node-exporter in docker swarm mode

我正在努力解决仪表板配置中 Grafana variable 查询的查询问题。查询变量应该 return 加入群的节点数,但它没有。在我的例子中,我只有一个群节点,但 Grafana return 中的变量最多有 5 个节点。我真的不明白是什么导致了这个错误。

情况是这样的:我在我的笔记本电脑上设置了docker swarm作为管理器,只有我的笔记本电脑是swarm模式,没有其他节点加入。 我使用来自 https://github.com/stefanprodan/swarmprom 的源来监视 node-exporter 的主机。我将 prometheus.yml 保持原样。

当我从 prometheus 执行指标时,只有一台主机 returned。这是正确的,因为我只有一个节点。可以看下图

但是当我在 Grafana 中进行查询时,Grafana returned 了 5 个主机。这里真的很奇怪。我不知道为什么我有 5 个主机,因为我只有一个群节点。

我确实使用 play-docker 再次检查了 git 存储库,配置了一个管理器节点和 2 个客户端节点。一切正常。 Grafana 中的查询 returned 3 台主机。

这里是查询公式:label_values(node_uname_info{job="node-exporter"}, instance) 非常感谢您提前支持。

您所面临的是短暂容器性质的结果,这是监控容器应用程序的挑战之一。在我们进入任何解决方案选项之前,让我们看看...

为什么 Grafana 显示的实例比现在多。

Prometheus 是一个时间序列数据库。它偶尔会联系其抓取目标并收集指标。这些指标与时间戳和一组标签一起保存,其中一个是有问题的 'instance' 标签。

实例标签通常由地址(host/domain 名称或 IP 地址)和端口组成,普罗米修斯使用它来抓取指标。在此示例中,实例地址是一个 IP 地址,因为目标列表是通过 DNS 服务器(作业定义中的dns_sd_configs)获得的。

部署堆栈时,docker 为每项服务至少创建了一个容器,包括节点导出器和普罗米修斯。不久之后,prometheus 开始从 node-exporter 实例获取指标,但是在一段时间后重新创建了 node-exporter 容器。要么你更新了它,要么杀了它,要么它崩溃了——我不知道,但关键是——你有了一个新容器。新的节点导出器容器获得了不同的 IP 地址,并且由于来自新实例的指标获得了不同的 'instance' 标签。

还记得 prometheus 是一个时间序列数据库吗?您没有丢失掉线实例的指标,它们仍在数据库中。正是在这一点上,您已经开始使用不同的标签集(至少 'instance' 标签中的新 IP 地址)收集节点导出器指标。当 Grafana 为您查询标签时,它会请求仪表板上当前设置的时间段内的指标。由于时间段是 'today',您已经看到今天 的实例。换句话说,当您请求可能的实例值列表时,您会收到该期间的值列表,而不会对当前活动的实例进行任何过滤。

一般解决方案。

您需要为此任务使用一些静态标签。如果您不希望在列表中看到死实例,'instance' 或 'pod_name' (K8s) 标签是一个糟糕的选择。选择一个代表您要观看的事物或单元的标签并坚持下去。由于node-exporter是监控节点指标,我想一个主机名标签就可以了。

如果您认为无法避免使用动态标签,则可以在仪表板上使用短时间范围,这样 label_values() 函数就不会 return 长死标签。您希望将变量刷新选项设置为 'On Time Range Change',以便您可以使用较短的仪表板时间间隔来查看和选择当前活动的实例,并使用较长的时间间隔用于任何其他情况。

这个特定问题的选项。

正如我之前所说,在这种情况下使用主机名标签会更好。问题是——相关指标中没有这样的标签。正在检查 swarmprom repo, I found that this node-exporter was made to expose a host name via node_meta label (here)。因此可以使用链式变量将主机名映射到实例。

另一个问题是此解决方案可能需要更改面板查询。由于一个主机名可以解析为多个实例,面板查询必须使用正则表达式匹配 'instance' 标签(即 =15=] 而不是 =).

以下是完成所有这些操作的方法:

  1. 创建一个名为 'hostname' 的新变量,将刷新选项设置为 'On Time Range Change',并将其用于查询字段:
label_values(node_meta, node_name)

这个将用作 select 或在仪表板上。

  1. 更新 'node' 变量:将刷新选项设置为 'On Time Range Change',启用 'Multi-value' 和 'Add All option',将查询替换为:
label_values(node_meta{node_name="$hostname"}, instance)

这将 return 一组 'instance' 标签匹配 selected 'hostname'。如果您 select 所有并更新面板查询以支持多值实例标签,您将能够查看与 selected 主机名关联的所有容器实例的指标。

  1. 打开仪表板 JSON 模型并将其复制到您喜欢的文本编辑器中。将所有出现的 instance= 替换为 instance=~,然后将编辑后的模型复制粘贴到 Grafana 中。