首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Prometheus客户端时的时间戳错误--“摄入太老或未来太远的样本时出错”

使用Prometheus客户端时的时间戳错误--“摄入太老或未来太远的样本时出错”
EN

Stack Overflow用户
提问于 2021-11-24 07:19:55
回答 2查看 1.1K关注 0票数 2

我试图将性能测试结果历史导入到Prometheus,并在官方Prometheus客户机中遇到了一个奇怪的问题。

这些守则正确运作:

代码语言:javascript
运行
复制
dt_now = datetime.datetime.now(tz=pytz.timezone('UTC'))
gobj = GaugeMetricFamily('FooMetricGood', '')
gobj.add_metric([], 123, timestamp=dt_now.timestamp())
yield gobj

这样就不可以:

代码语言:javascript
运行
复制
dt_format = '%Y-%m-%d_%H-%M-%S.%f %z'
dt_custom_str = '2021-11-11_18-12-59.000000 +0000'
dt_parsed_from_custom = datetime.datetime.strptime(dt_custom_str, dt_format)
gobj = GaugeMetricFamily('FooMetricNotWorking', '')
gobj.add_metric([], 789987, timestamp=dt_parsed_from_custom.timestamp())
yield gobj

普罗米修斯的日志上有这样的警告:

代码语言:javascript
运行
复制
prometheus-prometheus-1  | ts=2021-11-11T13:41:01.895Z caller=scrape.go:1563 level=warn component="scrape manager" scrape_pool=services target=http://192.168.64.1:8080/metrics msg="Error on ingesting samples that are too old or are too far into the future" num_dropped=1

大约两周前,我试图在GitHub 这里中提出这个问题,但没有得到任何答案。

任何帮助都将不胜感激。

UPDATE:在回答和评论之后,我重新检查了一下,下面是更多的细节。

如果我现在尝试来自datetime的两个度量标准(参见上面GitHub链接中的代码示例)和来自string '2021-12-13_00-34-59.000000 +0000'datetime,所有这些指标都出现在接口中:

代码语言:javascript
运行
复制
# HELP FooMetricGood 
# TYPE FooMetricGood gauge
FooMetricGood 123.0 1639475119451
# HELP FooMetricGoodToo 
# TYPE FooMetricGoodToo gauge
FooMetricGoodToo 456.0 1639475119451
# HELP FooMetricNotWorkingNew 
# TYPE FooMetricNotWorkingNew gauge
FooMetricNotWorkingNew 789987.0 1639355699000

但是在Prometheus服务器的日志中我看到:

代码语言:javascript
运行
复制
prometheus-prometheus-1  | ts=2021-12-14T09:51:35.524Z caller=scrape.go:1611 level=debug component="scrape manager" scrape_pool=services target=http://192.168.64.1:8080/metrics msg="Out of bounds metric" series=FooMetricNotWorkingNew
prometheus-prometheus-1  | ts=2021-12-14T09:51:35.524Z caller=scrape.go:1563 level=warn component="scrape manager" scrape_pool=services target=http://192.168.64.1:8080/metrics msg="Error on ingesting samples that are too old or are too far into the future" num_dropped=1

据我所知,Python时间戳以毫秒为单位,所以我对它们进行了比较

代码语言:javascript
运行
复制
FooMetricGood 1639475119451
FooMetricNotWorkingNew 1639355699000

并得到:

代码语言:javascript
运行
复制
1639475119451 - 1639355699000 = 119420451 milliseconds = (119420451 / 1000 / 60 / 60) hours = 33.1723475

因此,根据Prometheus的说法,Python当前的时间在错误的度量时间戳之后只有33小时。

我试着调整这个日期,让它成为2021-12-14_08-34-59.000000 +0000,现在的差别仅仅比现在的时间早了1.2913288888888887小时,但仍然不起作用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-14 10:35:49

看来我找到麻烦的源头了。

我找到了Prometheus服务器设置:

代码语言:javascript
运行
复制
  scrape_interval: 1m
  scrape_timeout: 10s

这里是他们的描述:

每5分钟(scrape_interval) Prometheus将从给定的URL中获取度量。它将尝试30秒(scrape_timeout),以获得度量,如果它不能在这段时间内,它将超时。

因此,即使我的指标只有一个小时--对于服务器来说,它仍然太老了。

现在的问题是,您不能设置比scrape_timeout更多的scrape_interval。因此,对于一个月前的数据,我需要等待一个月的时间,服务器才能收集这些指标。

我厌倦了Prometheus,我读过的大多数消息来源都说,很难将历史导入到它,所以我转而使用VictoriaMetrics,使用相同的Prometheus客户端,并且通过增加VictoriaMetrics选项-search.cacheTimestampOffset10080m0s (1周),我已经很容易地导入测试数据集来表示它是可能的。

票数 2
EN

Stack Overflow用户

发布于 2021-12-11 08:15:03

我成功地执行了您的代码,并在prometheus:https://replit.com/@pygeek1/ComplicatedAcidicAxis#main.py中查询了度量

我怀疑Prometheus服务器有问题。确保正确设置服务器时间。类似的问题在一年前就有报道,原因是服务器时间不断变化的问题:https://github.com/prometheus/prometheus/issues/6554

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70092048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档