我有3台Ubuntu机器。它们每个都安装了带有node_exporter的普罗米修斯。当我试图获取网络统计数据时,我会查询
- node_network_receive_bytes_total
- 节点网络传输字节总数
- node_network_receive_drop_total
- node_network_transmit_drop_tal
- node_network_receive_errs_total
- 节点网络传输错误总数
- node_network_receive_packets_total
- node_network_transmit_packets_tal
在通过HTTP API的for循环中一个接一个。
在大多数情况下,返回的统计数据都很好。但是,在某些情况下,一个节点的数据将丢失。
例如,在1轮中,查询node_network_receive_bytes_total将返回所有数据。但node_network_receive_packets_total中缺少第三个节点的数据。
我该如何避免这个问题?或者,如果我发现一些数据丢失,我只是重新发送查询吗?
我认为发生这种情况是因为当我试图查询时,实际数据尚未保存到prometheus。
想想这个场景,prometheus从每个节点上的node_exporters中提取数据。这些拉动动作并不是同时进行的。当我发送查询时,prometheus可能已经完成了从2个节点提取最新数据,但没有从第3个节点提取。因此,普罗米修斯无法计算第三个节点的时间戳值。这导致查询中没有返回第三个节点的数据。
顺便说一句,从prometheus的源代码来看,即使您在查询请求中没有指定时间戳,prometheus也会生成一个时间戳。
我找到了两个解决这个问题的方法:
- 从现在起将查询请求的
time
参数设置为1秒前。通过这种方式,您总是在查询";旧的";数据,因此无需担心数据不存在。然而,缺点是你得到的数据不是很准确,因为你总是像现在一样使用1秒前的数据 - 只需再次向普罗米修斯发送查询即可