繁体   English   中英

在 docker 群模式下使用节点导出器在 Grafana/Prometheus 中查询错误

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

我在仪表板配置中遇到 Grafana variable查询的查询问题。 查询变量应该返回加入 swarm 的节点数,但它没有返回。 就我而言,我只有一个 swarm 节点,但 Grafana 中的变量最多返回 5 个节点。 我真的不明白是什么导致了错误。

情况如下:我在我的笔记本电脑中设置了 docker swarm 作为管理器,只有我的笔记本电脑具有 swarm 模式,没有其他节点加入。 我使用来自https://github.com/stefanprodan/swarmprom的源代码通过node-exporter监控主机。 我将prometheus.yml保留为原始文件。

当我从prometheus执行指标时,只有一个主机返回。 这是正确的,因为我只有一个节点。 可以看下图在此处输入图像描述

但是当我在 Grafana 中进行查询时,Grafana 返回了 5 个主机。 这里真的很奇怪。 我不知道为什么我有 5 个主机,因为我只有一个 swarm 节点。 在此处输入图像描述

我确实使用 play-with-docker 再次检查了 git 存储库,配置了一个管理器节点和 2 个客户端节点。 一切正常。 Grafana 中的查询返回 3 个主机。 在此处输入图像描述

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

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

Grafana 显示的实例多于实际实例是如何发生的。

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

实例 label 通常由一个地址(主机/域名或 IP 地址)和一个端口组成,prometheus 使用它来抓取指标。 在此示例中,实例地址是 IP 地址,因为目标列表是通过 DNS 服务器(作业定义中的dns_sd_configs )获得的。

部署堆栈时,docker 为每个服务创建至少一个容器,包括 node-exporter 和 prometheus。 不久之后,prometheus 开始从 node-exporter 实例获取指标,但是过了一段时间,node-exporter 容器被重新创建。 要么你更新了它,要么杀了它,要么它崩溃了——我不知道,但关键是——你有一个新容器。 新的节点导出器容器获得了不同的 IP 地址,因此来自新实例的指标收到了不同的“实例”label。

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

一般解决方案。

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

如果您认为无法避免使用动态标签,您可以在仪表板上使用较短的时间范围,以便label_values() function 不会返回长死标签。 您想将变量刷新选项设置为“按时间范围更改”,以便您可以使用较短的仪表板间隔来查看和选择当前活动的实例,而对于任何其他情况,您可以使用较长的时间间隔。

此特定问题的一个选项。

正如我之前所说,在这种情况下使用主机名 label 会更好。 问题是 - 在有问题的指标中没有这样的 label。 检查swarmprom repo,我发现这个节点导出器是通过node_meta label ( 此处)公开主机名。 因此,可以使用链式变量将主机名 map 分配给实例。

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

以下是如何做到这一切:

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

这将用作仪表板上的选择器。

  1. 更新“节点”变量:将刷新选项设置为“时间范围更改”,启用“多值”和“添加所有选项”,将查询替换为:
label_values(node_meta{node_name="$hostname"}, instance)

这将返回一组与所选“主机名”匹配的“实例”标签。 如果您 select 所有并更新面板查询以支持多值实例 label,您将能够查看与所选主机名关联的所有容器实例的指标。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM