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

在docker swarm模式下使用节点导出器在Grafana/Prometheus中进行错误查询,docker,prometheus,grafana,docker-swarm,prometheus-node-exporter,Docker,Prometheus,Grafana,Docker Swarm,Prometheus Node Exporter,我在仪表板配置中使用Grafanavariablequery时遇到了一个查询问题。查询变量应该返回加入群的节点数,但它没有返回。在我的例子中,我只有一个swarm节点,但Grafana中的变量返回最多5个节点。我真的不明白是什么导致了这个错误 情况如下:我在笔记本电脑中设置docker swarm作为管理器,只有我的笔记本电脑采用swarm模式,没有其他节点加入。 我使用来自的源代码通过节点导出器监视主机。我把普罗米修斯.yml保留为原始版本 当我从普罗米修斯执行度量时,只有一个主机返回。这是正

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

情况如下:我在笔记本电脑中设置docker swarm作为管理器,只有我的笔记本电脑采用swarm模式,没有其他节点加入。 我使用来自的源代码通过
节点导出器
监视主机。我把普罗米修斯.yml保留为原始版本

当我从普罗米修斯执行度量时,只有一个主机返回。这是正确的,因为我只有一个节点。您可以看到下图

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

我确实使用play with docker再次检查了git repo,配置了一个管理器节点和两个客户端节点。一切都很顺利。Grafana中的查询返回了3台主机。

以下是查询公式:
label\u值(node\u uname\u info{job=“node exporter”},实例)

非常感谢您提前提供支持。

您所面临的是短暂容器特性的后果,这是监控容器应用程序的挑战之一。在讨论任何解决方案选项之前,让我们先看看

Grafana展示了比现在更多的实例。 普罗米修斯是一个时间序列数据库。每隔一段时间,它就会联系其清理目标并收集指标。这些度量值与一个时间戳和一组标签一起保存,其中一个标签是有问题的“实例”标签

实例标签通常由一个地址(主机/域名或IP地址)和一个端口组成,普罗米修斯用它来获取度量。在此示例中,实例地址是IP地址,因为目标列表是通过DNS服务器获得的(
DNS\u sd\u configs
在作业定义中)

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

还记得普罗米修斯是一个时间序列数据库吗?您没有丢失脱机实例的度量值,它们仍在数据库中。就在此时,您已经开始使用不同的标签集(至少在“实例”标签中有新的IP地址)收集节点导出器度量。当Grafana为您查询标签时,它会从仪表板上当前设置的时段请求度量。由于时间段是“今天”,您已经看到了今天出现的实例。换句话说,当您请求可能的实例值列表时,您将收到该时段的值列表,而不过滤当前活动实例

一般解决方案。 您需要为此任务使用一些静态标签。如果您不想在列表中看到死掉的实例,“实例”或“pod_name”(K8s)标签是一个糟糕的选择。选择一个代表你想要观看的事物或单位的标签,并贴在上面。由于节点导出器是监视节点度量的,所以我认为主机名标签就可以了

如果无法避免使用动态标签,可以在仪表板上使用较短的时间范围,以便
label\u values()
函数不会返回长死区标签。您希望将variable refresh option设置为“On Time Range Change”,这样您就可以使用较短的仪表板时间间隔来查看和拾取当前活动的实例,而对于任何其他情况,则可以使用较长的时间间隔

这个特殊问题的一个选择。 如前所述,在这种情况下使用主机名标签会更好。问题是——在所讨论的指标中没有这样的标签。检查repo时,我发现这个节点导出器是通过
node\u meta
label()公开主机名的。因此,可以使用链接变量将主机名映射到实例

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

以下是如何做到这一切:

  • 创建一个名为“hostname”的新变量,将refresh选项设置为“On Time Range Change”,并将其用于查询字段:
  • 这一个将用作仪表板上的选择器

  • 更新'node'变量:将刷新选项设置为'On Time Range Change',启用'Multi value'和'Add All option',将查询替换为以下内容:
  • 这将返回一组与所选“主机名”匹配的“实例”标签。如果选择“全部”并更新面板查询以支持多值实例标签,则可以查看与选定主机名关联的所有容器实例的度量

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

  • 其他的例子是什么?你看到他们的指标了吗(尝试一个广泛的时间范围)?它们会在某个时刻结束吗?在很长的时间范围内,我在prometheus表中只看到一个主机。问题是,每次exporter容器重新启动时,您可能会得到一个新实例。这是因为容器IP不是静态的,并且实例标签值绑定到IP地址。尝试更改
    节点
    变量
    Re
    
    label_values(node_meta, node_name)
    
    label_values(node_meta{node_name="$hostname"}, instance)