我试图将性能测试结果历史导入到Prometheus,并在官方Prometheus客户机中遇到了一个奇怪的问题。
这些守则正确运作:
dt_now = datetime.datetime.now(tz=pytz.timezone('UTC'))
gobj = GaugeMetricFamily('FooMetricGood', '')
gobj.add_metric([], 123, timestamp=dt_now.timestamp())
yield gobj
这样就不可以:
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
普罗米修斯的日志上有这样的警告:
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
,所有这些指标都出现在接口中:
# 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服务器的日志中我看到:
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时间戳以毫秒为单位,所以我对它们进行了比较
FooMetricGood 1639475119451
FooMetricNotWorkingNew 1639355699000
并得到:
1639475119451 - 1639355699000 = 119420451 milliseconds = (119420451 / 1000 / 60 / 60) hours = 33.1723475
因此,根据Prometheus的说法,Python当前的时间在错误的度量时间戳之后只有33小时。
我试着调整这个日期,让它成为2021-12-14_08-34-59.000000 +0000
,现在的差别仅仅比现在的时间早了1.2913288888888887小时,但仍然不起作用。
发布于 2021-12-14 10:35:49
看来我找到麻烦的源头了。
我找到了Prometheus服务器设置:
scrape_interval: 1m
scrape_timeout: 10s
这里是他们的描述:
每5分钟(scrape_interval) Prometheus将从给定的URL中获取度量。它将尝试30秒(scrape_timeout),以获得度量,如果它不能在这段时间内,它将超时。
因此,即使我的指标只有一个小时--对于服务器来说,它仍然太老了。
现在的问题是,您不能设置比scrape_timeout
更多的scrape_interval
。因此,对于一个月前的数据,我需要等待一个月的时间,服务器才能收集这些指标。
我厌倦了Prometheus,我读过的大多数消息来源都说,很难将历史导入到它,所以我转而使用VictoriaMetrics,使用相同的Prometheus客户端,并且通过增加VictoriaMetrics选项-search.cacheTimestampOffset
到10080m0s
(1周),我已经很容易地导入测试数据集来表示它是可能的。
发布于 2021-12-11 08:15:03
我成功地执行了您的代码,并在prometheus:https://replit.com/@pygeek1/ComplicatedAcidicAxis#main.py中查询了度量
我怀疑Prometheus服务器有问题。确保正确设置服务器时间。类似的问题在一年前就有报道,原因是服务器时间不断变化的问题:https://github.com/prometheus/prometheus/issues/6554。
https://stackoverflow.com/questions/70092048
复制相似问题