溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

報警分發(fā)系統(tǒng)的實現(xiàn)和總結(jié)

發(fā)布時間:2020-07-03 02:25:25 來源:網(wǎng)絡(luò) 閱讀:2691 作者:li690347460 欄目:編程語言

報警分發(fā)系統(tǒng):https://github.com/smartxff/dingding_exporter
既然是上篇博客的實現(xiàn)結(jié)果,就以上篇的需求為主體結(jié)構(gòu)來進(jìn)行實現(xiàn)過程的說明和總結(jié)

1. 報警輸入標(biāo)記

  控制自己的東西,永遠(yuǎn)比控制自己簡單。報警消息發(fā)送過來時,只會告訴我那個實例有問題,有什么問題,至于這個實例屬于誰,它并不關(guān)心。所以發(fā)送過來的告警所在的實例屬于誰這件事,就得我自己程序?qū)崿F(xiàn)了。畢竟控制自己簡單嘛。

2. 獲取報警

  報警的獲取來源是prometheus的alertmanager。它會發(fā)送給我一個固定格式的json,然后我可以從這個json中獲取,報警信息。至于其他非prometheus的告警,我怎么獲取呢?只要他發(fā)送我的消息滿足這個json的部分字段,我就可以處理他的報警。所以此部分是以固定格式的請求body來實現(xiàn)復(fù)用。

3. 獲取報警與接收人對應(yīng)關(guān)系

  因為我們prometheus主要的監(jiān)控來自于docker上跑的服務(wù)的url,我們會進(jìn)行探活,而每個docker的項目的源代碼都來自于gitlab。所以報警和接收人的關(guān)系就來自于gitlab了。畢竟每個項目都是由創(chuàng)建者和修改著構(gòu)造的。但是一個gitlab項目不僅可以屬于某個人,也可以屬于某個組,我肯定不可能給一個組的人都發(fā)送報警。我肯定會被打死。我們提交代碼時都會commit。但是這個commit屬于提交代碼時的本地環(huán)境。本地環(huán)境和線上環(huán)境可能不同步,比如你gitlab中叫張三,你本地叫sanzhang,那么commit里面保存的就是sanzhang。所以從commit中獲取接收人信息就pass。雖然commit里面的信息不是gitlab上的,但是push代碼這個event,事件本身是屬于線上本身的。所以我們的報警總會發(fā)送給最后一次提交代碼的人。簡直相當(dāng)完美呀。我們prometheus除了監(jiān)控docker里面的項目,還監(jiān)控了一些手動加上的監(jiān)控項,比如某個外網(wǎng)url之類的。我們只能通過讀取本地對應(yīng)關(guān)系表中的數(shù)據(jù),來查找對應(yīng)關(guān)系。此處試用yaml格式存儲這些數(shù)據(jù)。然后沒找到對應(yīng)關(guān)系的報警會發(fā)送到我們運(yùn)維所在釘釘群中,我們收到后可以選擇手動添加對應(yīng)關(guān)系,和我們自己處理報警。此處算是實現(xiàn)了需求分析。

4. 根據(jù)標(biāo)記和對應(yīng)關(guān)系發(fā)送報警

  用戶基本上就使用兩種接受信息的方式,一種是短信,一種是郵件。郵件還是比較好實現(xiàn)的。釘釘群的機(jī)器人接口使用特別方便,所以測試階段以及我們運(yùn)維接受報警主要使用釘釘群。郵件實現(xiàn)的比較簡單,總體內(nèi)容固定,只有內(nèi)容和發(fā)送對象不同。釘釘因為我們自己使用,我實現(xiàn)的功能就更多一點。首先有一個默認(rèn)的釘釘接口,主要接受沒有匹配的接收人的告警。然后可以通過配置文件自定義哪個實例的告訴發(fā)送到那個釘釘群。

其他實現(xiàn)

  有些告警信息一時半會兒處理不了,但是prometheus我們設(shè)置的同一個報警10,如果未處理10分鐘發(fā)送一次。所以此處我加入了告警過濾的功能,當(dāng)然也是以配置文件的形式實現(xiàn)。
  釘釘群接口每分鐘只能向它發(fā)送20次消息,超過這個數(shù),此接口就會失效,必須手動生成新的webhook。所以我打算在釘釘發(fā)送消息這上面做一個限制,每分鐘最多只能發(fā)送20個消息。目前還沒實現(xiàn),不過具體的思路已經(jīng)有了。創(chuàng)建一個長度為20的chan,沒收到一個發(fā)送釘釘告警的請求,就起一個goroutine,從chan中獲取一個值,然后發(fā)出一個釘釘告警消息,sleep 1分鐘后在往chan中發(fā)送一個值。就算一秒鐘發(fā)送20個請求,chan里面的值為空,下一個請求,就會一直等待chan中的有值。只有超過一分鐘后,其中一個gorutine給chan發(fā)送一個值。下一次請求才可執(zhí)行。此處有點濫用chan的感覺。不過嘛,優(yōu)秀的程序員都是從寫爛代碼開始的~~~

不知道自己代碼爛
知道自己代碼爛,不知道為何爛
知道自己代碼爛,知道怎么寫好
代碼已經(jīng)能寫好,不知道怎么寫更高性能的代碼
代碼能寫好,也能寫高并發(fā),并且高可用,無狀態(tài)。
那么,我就算是成為一個合格的程序員了。
加油!

向AI問一下細(xì)節(jié)
AI