我正在使用 Prometheus、cAdvisor 和 Prometheus Alertmanager 监控多个容器。我想要的是在容器由于某种原因出现故障时收到警报。问题是如果容器死亡,cAdvisor 没有收集到任何指标。任何查询都返回“无数据”,因为该查询没有匹配项。
4 回答
看看 Prometheus 函数缺席()
如果传递给它的向量有任何元素,则缺席(v instant-vector) 返回一个空向量;如果传递给它的向量没有元素,则返回一个值为 1 的 1 元素向量。
这对于在给定指标名称和标签组合不存在时间序列时发出警报很有用。
例子:
absent(nonexistent{job="myjob"}) => {job="myjob"}
absent(nonexistent{job="myjob",instance=~".*"}) => {job="myjob"}
absent(sum(nonexistent{job="myjob"})) => {}
这是警报的示例:
ALERT kibana_absent
IF absent(container_cpu_usage_seconds_total{com_docker_compose_service="kibana"})
FOR 5s
LABELS {
severity="page"
}
ANNOTATIONS {
SUMMARY= "Instance {{$labels.instance}} down",
DESCRIPTION= "Instance= {{$labels.instance}}, Service/Job ={{$labels.job}} is down for more than 5 sec."
}
我使用一个名为Docker Event Monitor的小工具,它作为 Docker 主机上的容器运行,并在触发某些事件时向 Slack、Discord 或 SparkPost 发送警报。您可以配置哪些事件触发警报。
尝试这个:
time() - container_last_seen{label="whatever-label-you-have", job="myjob"} > 60
如果容器在 60 秒内无法看到,则会发出警报。或者
absent(container_memory_usage_bytes{label="whatever-label-you-have", job="myjob"})
请注意,在第二种方法中,容器的内存使用量可能需要一些时间才能达到0。
我们可以使用这两个:
absent(container_start_time_seconds{name="my-container"})
这个包含时间戳的特定指标在 5 分钟内似乎不会过时,因此一旦从上次抓取中消失,它就会从 prometheus 结果中消失(请参阅:https ://prometheus.io/docs/prometheus/latest/querying/basics/# staleness ) 而不是像 container_cpu_usage_seconds_total 这样的 5 分钟后。测试OK,但我不确定我是否理解板岩性......
否则你可以使用这个:
time() - timestamp(container_cpu_usage_seconds_total{name="mycontainer"}) > 60 OR absent(container_cpu_usage_seconds_total{name="mycontainer"})
第一部分给出了自指标被抓取以来的时间。因此,如果它从导出器输出中消失但仍由 promql 返回(默认为 5 分钟),则此方法有效。您必须根据刮擦间隔调整 >60。