Prometheus 的九个坑

转载自公众号【工匠小猪猪的技术世界】原文地址https://mp.weixin.qq.com/s/Tnx60stl5aWKxmZxi0NfKg

最近我在研究Prometheus,在研究吴叶磊的文章以后,对于Prometheus存在的问题做了一次再梳理的评注,如下所示:

Prometheus本身已经成为了云原生中指标监控的事实标准,几乎所有 Kubernetes 的核心组件以及其它云原生系统都以 Prometheus 的指标格式输出自己的运行时监控信息。

甚至绝大多数中间件(比如 MySQL、Kafka、Redis、ES)也都有社区提供的Prometheus Exporter。
很多人都从Prometheus的优点开始说起,比如概念、安装、搭建、使用,那我反其道而行之,先从Prometheus的潜在问题开始说起。

Prometheus does one thing, and it does it well

Prometheus最核心的是监控指标,但是如果考虑动态伸缩、远端存储、平台化就需要做一些额外的扩展和整合工作。

2019年了,Prometheus除了仍然还不支持分布式、不支持数据导入/导出、不支持通过 api 修改监控目标和报警规则,还有着如下的一些问题,在使用之初就需要了解。

参考资料:https://aleiwu.com/post/prometheus-bp/

风险规避

一、自监控

Prometheus在云原生上可以用来监控其他一系列系统,那么这里问一个尖锐的问题,Prometheus的自监控谁来做?我们都知道Prometheus也可以提供自身的监控指标项,但是如果Prometheus本身就宕机了,那么Prometheus本身如何做告警?

因此,强烈建议在上生产环境之前,一定要确保至少有两个独立的 Prometheus 实例互相做交叉监控。 交叉监控的配置也很简单,每台 Prometheus 都拉取其余所有 Prometheus 的指标即可。

二、Alertmanager警报系统挂掉了怎么办

如果Alertmanager挂掉了,警报就发不出来了,对于开发、运维人员来说,Prometheus就成了一个哑巴,我们该如何处理?

因此,对于Prometheus来说,要做HA集群,包括警报系统Alertmanager。

除此之外还有一个经典的兜底措施叫做 “Dead man’s switch”: 定义一条永远会触发的告警,不断通知,假如哪天这条通知停了,那么说明报警链路出问题了。

三、准确性与运维简易性的权衡

和ELK等其他日志架构相比,Prometheus的运维相对比较简单。

在使用Prometheus之初必须明确清楚,Prometheus放弃了一部分数据准确性,无法和日志系统一样做到100%准确,但是可以获取高纯度的监控趋势

  • 比如在两次采样的间隔中,内存用量有一个瞬时小尖峰,那么这次小尖峰我们是观察不到的;
  • 再比如 QPS、RT、P95、P99 这些值都只能估算,无法和日志系统一样做到 100% 准确

四、任何版本的Prometheus都不支持NFS

参见 https://github.com/prometheus/prometheus/issues/3534

这个案例还有一些实际生产案例都告诉我们,Prometheus存储文件如果使用NFS上有发生损坏丢失历史数据的可能性

五、尽早干掉维度过高的坏指标

如果Prometheus 里有 50% 以上的存储空间和 80% 以上的计算资源(CPU、内存)都被两三个高维度指标占据,这里就需要考虑是否需要治理。对于这些高指标,可以换其他的方式,比如数仓或者日志流等等去处理。

并不是业务方所有的指标都可以直接不管不顾得往Label里塞

解决方法:用警报规则找出维度过高的坏指标,然后在 Scrape 配置里 Drop 掉导致维度过高的 label。

# 统计每个指标的时间序列数,超出 10000 的报警
count by (__name__)({__name__=~".+"}) > 10000

“坏指标”报警出来之后,就可以用 metric_relabel_config 的 drop 操作删掉有问题的 label(比如 userId、email 这些一看就是问题户)

六、PromQL要先 rate() 再 sum(),不能 sum() 完再 rate()

这背后与 rate() 的实现方式有关,rate() 在设计上假定对应的指标是一个 Counter,也就是只有 incr(增加) 和 reset(归0) 两种行为。而做了 sum() 或其他聚合之后,得到的就不再是一个 Counter 了,举个例子,比如 sum() 的计算对象中有一个归0了,那整体的和会下降,而不是归零,这会影响 rate() 中判断 reset(归0) 的逻辑,从而导致错误的结果。写 PromQL 时这个坑容易避免,但碰到 Recording Rule 就不那么容易了,因为不去看配置的话大家也想不到 new_metric 是怎么来的。

Recording Rule规则:一步到位,直接算出需要的值,避免算出一个中间结果再拿去做聚合。

七、警报和历史趋势图未必 Match

最近半年常常被问两个问题:

  • 我的历史趋势图看上去超过水位线了,警报为什么没报?
  • 我的历史趋势图看上去挺正常的,警报为什么报了?

这其中有一个原因是:趋势图上每个采样点的采样时间和警报规则每次的计算时间不是严格一致的。当时间区间拉得比较大的时候,采样点非常稀疏,不如警报计算的间隔来得密集,这个现象尤为明显,比如时序图采样了 0秒,60秒,120秒三个点。而警报在15秒,30秒,45秒连续计算出了异常,那在图上就看不出来。另外,经过越多的聚合以及函数操作,不同时间点的数据差异会来得越明显,有时确实容易混淆。

这个其实不是问题,碰到时将趋势图的采样间隔拉到最小,仔细比对一下,就能验证警报的准确性。而对于聚合很复杂的警报,可以先写一条 Recording Rule, 再针对 Recording Rule 产生的新指标来建警报。这种范式也能帮助我们更高效地去建分级警报(超过不同阈值对应不同的紧急程度)

八、Alertmanager 的 group_interval 会影响 resolved 通知

Alertmanager 里有一个叫 group_interval 的配置,用于控制同一个 group 内的警报最快多久通知一次。这里有一个问题是 firing(激活) 和 resolved(已消除) 的警报通知是共享同一个 group 的。也就是说,假设我们的 group_interval 是默认的 5 分钟,那么一条警报激活十几秒后立马就消除了,它的消除通知会在报警通知的 5 分钟之后才到,因为在发完报警通知之后,这个 Group 需要等待 5 分钟的 group_interval 才能进行下一次通知。

这个设计让”警报消除就立马发送消除通知”变得几乎不可能,因为假如把 group_interval 变得很小的话,警报通知就会过于频繁,而调大的话,就会拖累到消除通知。

这个问题修改一点源码即可解决,不过无伤大雅,不修也完全没问题。

九、Prometheus 本身没有提供管理配置的 API 接口

Prometheus Operator Make Prometheus as a Service By k8s

Prometheus 本身没有提供管理配置的 API 接口,尤其是管理监控目标和管理警报规则,没有提供好用的多实例管理手段。除了写脚本以外,可以了解一下 Prometheus Operator

什么是 Operator?Operator = Controller + CRD。假如你不了解什么是 Controller 和 CRD,可以看一个 Kubernetes 本身的例子:我们提交一个 Deployment 对象来声明期望状态,比如 3 个副本;而 Kubernetes 的 Controller 会不断地干活(跑控制循环)来达成期望状态,比如看到只有 2 个副本就创建一个,看到有 4 个副本了就删除一个。在这里,Deployment 是 Kubernetes 本身的 API 对象。那假如我们想自己设计一些 API 对象来完成需求呢?Kubernetes 本身提供了 CRD(Custom Resource Definition),允许我们定义新的 API 对象。但在定义完之后,Kubernetes 本身当然不可能知道这些 API 对象的期望状态该如何到达。这时,我们就要写对应的 Controller 去实现这个逻辑。而这种自定义 API 对象 + 自己写 Controller 去解决问题的模式,就是 Operator Pattern。
https://aleiwu.com/post/prometheus-operator/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容