Prometheus increase()函數(shù)的坑

背景

如下憋他,我司的訂單服務(wù)的支付和訂單業(yè)務(wù)采用Prometheus配合Alertmanager來做報(bào)警處理孩饼。業(yè)務(wù)方會(huì)挑選一些比較重要的支付方式來做報(bào)警處理。大致就是一段時(shí)間內(nèi)的支付量低于某一個(gè)閾值的時(shí)候就報(bào)警竹挡。


拓?fù)鋱D

寫成promql表達(dá)式如下

#pay_metrics就是支付的指標(biāo)名稱镀娶,pay_way就是支付方式
sum(increase(pay_metrics{pay_way="weixin"}[30m])) < 0

上面表達(dá)式的意思就是:如果微信這種支付方式的支付量在過去5分鐘內(nèi)的增量為0,那么就報(bào)警揪罕。業(yè)務(wù)方給了我們很多這種類似的報(bào)警規(guī)則梯码,然后跑了很長(zhǎng)一段時(shí)間宝泵,報(bào)警都工作得很好。

問題

某天業(yè)務(wù)收到某條報(bào)警信息轩娶,說是某某支付方式的報(bào)警有問題儿奶,他們說那個(gè)報(bào)警時(shí)間段內(nèi),他們是有支付成功的訂單的鳄抒,你這個(gè)報(bào)警有問題。然后我就會(huì)默默地查詢了up指標(biāo)(Prometheus中探活指標(biāo)),發(fā)現(xiàn)他們最近一段時(shí)間發(fā)布代碼了棒口。而他們的實(shí)例又是多實(shí)例的保屯,發(fā)布的時(shí)候是一臺(tái)臺(tái)發(fā)布的,發(fā)布之后停留在內(nèi)存中的指標(biāo)數(shù)據(jù)都會(huì)丟失贤重。然后在計(jì)算報(bào)警規(guī)則的時(shí)候可能會(huì)出現(xiàn)誤報(bào)的情況娱仔。



然后我很自豪地跟他們的研發(fā)確認(rèn)了發(fā)布的事情,然后很愉快地就去泡咖啡去了游桩。

然后還沒等我喝完咖啡牲迫,業(yè)務(wù)又找上我了,說還是有問題借卧。但是這次沒有發(fā)布盹憎。下面就開始了我得苦逼調(diào)查之旅。

調(diào)查

首先铐刘,我們明確一下問題的本質(zhì):業(yè)務(wù)在他們自己的訂單存儲(chǔ)中看到有支付訂單的陪每,但是還是報(bào)警了。其實(shí)就是業(yè)務(wù)數(shù)據(jù)和監(jiān)控報(bào)警數(shù)據(jù)不一致镰吵。那這樣的不一致就有可能是兩面的原因

  1. 訂單服務(wù)的研發(fā)在埋點(diǎn)支付數(shù)據(jù)的時(shí)候有bug
  2. Prometheus在計(jì)算報(bào)警規(guī)則的時(shí)候有問題

第一個(gè)問題檩禾,我讓研發(fā)排查了,他們只有一個(gè)入口疤祭,而且不太可能會(huì)有問題盼产。那我們先假設(shè)不是第一個(gè)問題。我們接著排查第二個(gè)問題勺馆。
Prometheus在計(jì)算的時(shí)候有問題戏售。
下面我們來審視一下下面這個(gè)函數(shù)

#pay_metrics就是支付的指標(biāo)名稱,pay_way就是支付方式
sum(increase(pay_metrics{pay_way="weixin"}[5m])) < 0

我們只用了兩個(gè)函數(shù):sum和increase函數(shù)草穆。sum比較簡(jiǎn)單灌灾,就是把指標(biāo)相加,沒什么好說的悲柱。但是increase()函數(shù)沒有想象中那么簡(jiǎn)單锋喜,至少它要處理重啟的情況。所以我就去prometheus中的issue搜搜了下豌鸡。果然被我發(fā)現(xiàn)了一個(gè)類似的issue
increase() should consider creation of new timeseries as reset
如下

issue

大概意思就是:如果一個(gè)時(shí)間序列之前不存在然后以值1出現(xiàn)嘿般,那么這時(shí)候Prometheus就不知道計(jì)數(shù)器是實(shí)際上是增加還是第一次被簡(jiǎn)單抓取到轴总。那么increase()在處理的時(shí)候就直接返回0 了。

如下圖博个,在T1時(shí)間計(jì)算increase()的時(shí)候,m1的增量為11怀樟,m2由于向前沒有找到對(duì)應(yīng)的指標(biāo)數(shù)據(jù),所以increase()直接返回0 了盆佣,這樣在使用sum()函數(shù)計(jì)算增量和的時(shí)候就會(huì)丟失數(shù)據(jù)往堡。


下面我們來看一下實(shí)際線上的情況,我畫了兩張圖共耍,左邊的表達(dá)式是這樣的(就是報(bào)警規(guī)則中的promql)

sum(increase(pay_metrics{pay_way="weixin"}[30m]))

右邊的表達(dá)式是這樣的(計(jì)算每個(gè)時(shí)間點(diǎn)的累計(jì)量)

sum(pay_metrics{pay_way="weixin"})

從上左邊可以看到大概3點(diǎn)17分鐘左右數(shù)量為0 虑灰,這時(shí)候報(bào)警了,但是我們?cè)倏从疫叺膱D痹兜,在3點(diǎn)17分鐘的時(shí)候向前推30分鐘穆咐,這30分鐘內(nèi)實(shí)際是有數(shù)量變化的。由此可見字旭,prometheus的這兩種計(jì)算方式的計(jì)算結(jié)果是不一樣的对湃。直接sum的結(jié)果更接近于真實(shí)數(shù)據(jù)。

解決方案

那有沒有什么好的解決方案呢遗淳?很多issue提倡能不能提供一個(gè)zero_increase()函數(shù)拍柒,或者加一個(gè)可以帶默認(rèn)值的increase()函數(shù),讓用戶自己處理這種情況屈暗。我翻了下所有的issue拆讯,發(fā)現(xiàn)到目前為止官方還沒有給出一個(gè)正式的解決方法。大家有興趣可以翻看一下有關(guān)的issue
Proposal for improving rate/increase
那我們自己有沒有可能通過各種騷操作得到我們想要的效果呢养叛?反復(fù)查詢后得到一種比較容易理解且相對(duì)比較精確的解決方案种呐。如下

(sum(pay_metrics{pay_way="weixin"} or pay_metrics{pay_way="weixin"}*0) by(payMethod)-
sum(pay_metrics{pay_way="weixin"} offset 30m or pay_metrics{pay_way="weixin"}*0) by(pay_way))

思路也很簡(jiǎn)單就是sum(當(dāng)前指標(biāo))-sum(30分鐘之前的指標(biāo))就OK,然后再加上獲取不到指標(biāo)的情況下使用默認(rèn)值0來代替弃甥。
但是這種解決方案也不是完美的爽室,在重啟的情況下有可能導(dǎo)致最終計(jì)算的差值是負(fù)數(shù)。不過在報(bào)警這種場(chǎng)景下完美只要不對(duì)這種情況下報(bào)警就可以了潘飘。

總結(jié)

increase()函數(shù)其實(shí)在大多數(shù)場(chǎng)景下是沒啥問題的肮之,只在下面兩種場(chǎng)景下有可能有問題。

  1. 重啟時(shí)間有點(diǎn)長(zhǎng)
  2. 重啟后很長(zhǎng)時(shí)間某種label的指標(biāo)數(shù)據(jù)才開始增加為0

解決方案:

  1. 在label組合比較少的情況下卜录,可以都初始化所有l(wèi)abel組合的指標(biāo)數(shù)據(jù)為0
  2. 使用我們上面提到的promql表達(dá)式來解決(但是要注意重啟后計(jì)算結(jié)果為負(fù)數(shù)的情況)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市眶明,隨后出現(xiàn)的幾起案子艰毒,更是在濱河造成了極大的恐慌,老刑警劉巖搜囱,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丑瞧,死亡現(xiàn)場(chǎng)離奇詭異柑土,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绊汹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門稽屏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人西乖,你說我怎么就攤上這事狐榔。” “怎么了获雕?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵薄腻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我届案,道長(zhǎng)庵楷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任楣颠,我火速辦了婚禮尽纽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘童漩。我一直安慰自己蜓斧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布睁冬。 她就那樣靜靜地躺著挎春,像睡著了一般。 火紅的嫁衣襯著肌膚如雪豆拨。 梳的紋絲不亂的頭發(fā)上直奋,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音施禾,去河邊找鬼脚线。 笑死,一個(gè)胖子當(dāng)著我的面吹牛弥搞,可吹牛的內(nèi)容都是我干的邮绿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼攀例,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼船逮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粤铭,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤挖胃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酱鸭,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吗垮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凹髓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烁登。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蔚舀,靈堂內(nèi)的尸體忽然破棺而出饵沧,到底是詐尸還是另有隱情,我是刑警寧澤蝗敢,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布捷泞,位于F島的核電站,受9級(jí)特大地震影響寿谴,放射性物質(zhì)發(fā)生泄漏锁右。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一讶泰、第九天 我趴在偏房一處隱蔽的房頂上張望咏瑟。 院中可真熱鬧,春花似錦痪署、人聲如沸码泞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)余寥。三九已至,卻和暖如春悯森,著一層夾襖步出監(jiān)牢的瞬間宋舷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工瓢姻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祝蝠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓幻碱,卻偏偏與公主長(zhǎng)得像绎狭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子褥傍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容