跳到主要内容

检测

本节我们将学习如何来检查我们的实例数据抓取健康状况。

检查抓取实例

每当 Prometheus 抓取一个目标时,它都会存储一个合成的样本,其中包含指标名称 up 和被抓取实例的 jobinstance 标签,如果抓取成功,则样本的值被设置为 1,如果抓取失败,则设置为 0,所以我们可以通过如下所示的查询来获取当前哪些实例处于正常或挂掉的状态:

up{job="demo"}

正常三个演示服务实例都处于正常状态,所以应该都为1。如果我们将第一个实例停掉,重新查询则第一个实例结果为0

up

如果只希望显示 down 掉的实例,可以通过过滤0值来获取:

up{job="demo"} == 0

down

或者获取挂掉实例的总数:

count by(job) (up{job="demo"} == 0)

count

一般情况下这种类型的查询会用于指标抓取健康状态报警。

注意:因为 count() 是一个聚合运算符,它期望有一组维度的时间序列作为其输入,并且可以根据 bywithout 子句将输出序列分组。任何输出组只能基于现有的输入序列,如果根本没有输入序列,就不会产生输出。

检查序列数据

在某些情况下,只查看序列的样本值是不够的,有时还需要检测是否存在某些序列,上面我们用 up{job="demo"} == 0 语句来查询所有无法抓取的演示服务实例,但是只有已经被抓取的目标才会被加上 up 指标,如果 Prometheus 都没有抓取到任何的演示服务目标应该怎么办呢?比如它的抓取配置出问题了,服务发现可能返回也为空,或者由于 Prometheus 自身出了某些问题。

在这种情况下,absent() 函数就非常有用了,absent() 将一个瞬时向量作为其输入,当输入包含序列时,将返回一个空结果,不包含时将返回单个输出序列,而且样本值为1

例如,查询语句 absent(up{job="demo"}) 将得到一个空的输出结果,如果测试一个没有被抓取的 job 是否存在的时候,将得到样本值1

non-existent

这可以帮助我们检测序列是否存在的情况。此外还有一个 absent() 的变种,叫做 absent_over_time(),它接受一个区间向量,告诉你在该输入向量的整个时间范围内是否有样本。

练习:

1.构建一个查询,检测指标 demo_api_request_duration_seconds_count 是否具有 PUT 的 method 标签的序列。


absent(demo_api_request_duration_seconds_count{method="PUT"})

2.构建一个查询,当过去一小时内任务 non-existent 没有记录 up 指标时,该查询输出一个系列。


absent_over_time(up{job="non-existent"}[1h])