我是Prometheus和警报方面的新手,我无法通过查看文档来完善答案。
我有一些数据正在进入Elasticsearch集群。每天,该过程都会在Elasticsearch上创建一个新索引,并将当天的数据写入该索引(例如my_index-2019-10-06
,my_index-2019-10-05
等)。我想监视今天的索引大小,看看它在增长,如果它没有在定义的时间间隔内增长(例如15分钟),我想在Prometheus中发出警报。为此,我正在考虑警报规则中的expr
:
expr: delta(elasticsearch_index_primary_store_size{index_name="my_index-TODAY-DATE"}[15m] <= 0)
TODAY-DATE
应该是动态的,并且每天都会生成。但是据我了解,标签值中不能有动态值,而日期中也没有函数。
然后我在考虑比较以my_index
开头的所有索引的总和的增量,但是这种方法的问题是保留时间,如果删除了索引,则总和的增量可能为负数,而新数据即将进入今天的指数。
您对此问题有解决方案吗?
先谢谢了。
答案 0 :(得分:1)
问题来自您的假设,即您将基于delta()
时间序列中的sum()
发出警报,这是Prometheus文档提出警告的第一批内容之一。 (而且在引入子查询之前,用单个查询是不可能做到的;您需要设置记录规则来实现这一点。)
如果您使用的是sum()
中的delta()
值(并且导出器在删除过程中不会产生零或迅速减小的索引大小度量),则一切都准备就绪。删除索引后,其增量只会从delta()
产生的结果中静默消失,并且不会以任何方式影响结果总和。前几天的索引可能不会更改大小,因此也不会影响总数。而且如果有进行压缩,导致索引大小突然减小,您可以过滤掉这些值:
expr: sum(delta(elasticsearch_index_primary_store_size{index_name=~"my_index-.*"}[15m]) > 0)) <= 0
话虽如此,您可以使用count_values without() ("year", year(vector(time())))
(以及month()
和day_of_month()
)加上label_join()
/ label_replace()
生成一个以今天的日期为值的标签,但是您可能不想去那里。
答案 1 :(得分:1)
Elasticsearch别名可用于避免每天指定(动态)索引名称的问题,请参见https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-aliases.html
也就是说,您可以对当前的当前索引名称使用别名。例如,my_favourite_today_index
可以指向my_favourite_index_2019-11-07
并每天更新(cronjob或其他方法)。这种方法将允许您在Prometheus中指定预定义索引名称。