目錄
- 監(jiān)控告警系統(tǒng)的總體介紹
- 常見的監(jiān)控告警系統(tǒng)介紹
- Prometheus
- 架構
- Prometheus Server
- Metric Type
- Prometheus Exporter
- AlertManager
- 架構
- Open-Falcon
- 架構
- Data model
- Data collection
- Alert
- Heartbeat server
- Zabbix
- Zabbix組件圖
- Zabbix Server
- Zabbix Database
- Zabbix Web
- Proxy
- Agent
- Zabbix組件圖
- InfluxData
- TICK技術棧
- InfluxDB metric type
- Kapacitor
- Bosun
- Unisphere Unity300
- Prometheus
- 對比分析
- References
監(jiān)控告警系統(tǒng)的總體介紹
監(jiān)控告警系統(tǒng)的實現(xiàn)各有不同仗颈,大致如下所述笔链。
- 在數(shù)據(jù)采集方面斟叼,有的監(jiān)控系統(tǒng)采用主動采集方式幻锁,有的監(jiān)控系統(tǒng)采用被動上報方式公黑,有的監(jiān)控系統(tǒng)采用上述兩者兼?zhèn)涞姆绞健?/li>
- 在數(shù)據(jù)傳輸方面,有的監(jiān)控系統(tǒng)采用socket傳輸稿茉,有的監(jiān)控系統(tǒng)采用HTTP傳輸。
- 在數(shù)據(jù)存儲方面拳亿,有的監(jiān)控系統(tǒng)將監(jiān)控數(shù)據(jù)保存在MySQL中,有的監(jiān)控系統(tǒng)將數(shù)據(jù)保存在MongoDB愿伴,OpenTSDB, InfluxDB等時序數(shù)據(jù)庫中肺魁。
但是,所有的監(jiān)控告警系統(tǒng)的核心都是采集和處理數(shù)據(jù)隔节。
監(jiān)控系統(tǒng)通常由指標采集子系統(tǒng)和數(shù)據(jù)處理子系統(tǒng)組成鹅经。
- 指標采集子系統(tǒng)主要負責信息采集,過濾怎诫,匯總和存儲瘾晃。
-
數(shù)據(jù)處理子系統(tǒng)主要負責數(shù)據(jù)分析,展現(xiàn)幻妓,預警蹦误,告警動作觸發(fā)和告警等。
常見的監(jiān)控告警系統(tǒng)介紹
常見的監(jiān)控告警系統(tǒng)主要有Prometheus肉津,Prometheus AlertManager强胰,Zabbix,Open-Falcon妹沙, Bosun偶洋, InfluxData, Unity300等距糖。下面分別進行簡單的介紹和對比分析玄窝。
Prometheus
Prometheus是由SoundCloud公司開發(fā)的開源告警系統(tǒng)并且?guī)r序數(shù)據(jù)庫牵寺,基于Go語言開發(fā)。
架構
Prometheus的基本原理是通過HTTP周期性地抓取被監(jiān)控組件的狀態(tài)哆料,任意組件只要提供對應的HTTP接口并且符合Prometheus定義的數(shù)據(jù)格式缸剪,就可以接入Prometheus監(jiān)控。其架構圖及其生態(tài)系統(tǒng)組件圖如下所示东亦。
Prometheus Server
Prometheus Server是Prometheus的核心,根據(jù)配置完成數(shù)據(jù)采集唬渗,服務發(fā)現(xiàn)以及數(shù)據(jù)存儲 典阵,推送告警,以及提供PromQL查詢語言的支持镊逝。
- Prometheus Server負責定時在目標上抓去Metrics數(shù)據(jù)壮啊,每個抓取目標都需要暴露一個HTTP服務接口用于Prometheus定時抓取。這種調用監(jiān)控對象獲取監(jiān)控數(shù)據(jù)的方式成為Pull撑蒜。Pull方式可以降低耦合歹啼,通過Pull方式,被采集端無須感知監(jiān)控系統(tǒng)的存在座菠,完全獨立于監(jiān)控系統(tǒng)之外狸眼,這樣數(shù)據(jù)的采集完全由監(jiān)控系統(tǒng)控制,增強了整個系統(tǒng)的穩(wěn)定性浴滴。
- Prometheus Server通過如下兩種方式獲取監(jiān)控對象拓萌。
- 通過配置文件,文本文件等進行靜態(tài)配置升略。
- 支持Kubernetes微王,file_sd,Consul等方式進行動態(tài)發(fā)現(xiàn)品嚣。
- Storage通過一定的規(guī)則清理和整理數(shù)據(jù)炕倘,并把得到的結果存儲到新的時間序列中,主要有兩種存儲方式翰撑。
- 本地存儲罩旋。通過Prometheus自帶的時序數(shù)據(jù)庫保存到本地磁盤。
- 遠端存儲额嘿。通過中間層的適配器的轉化瘸恼,目前Prometheus支持OpenTSDB, InfluxDB册养,ElasticSearch等后端存儲东帅。
- Prometheus通過PromQL和其他API可視化地展示收集的數(shù)據(jù)球拦。
- AlertManager是獨立于Prometheus的一個組件靠闭,在觸發(fā)了預先設置在Prometheus中的告警規(guī)則后帐我,Prometheus便會push告警信息到AlertManager。
Metric Type
Prometheus的所有監(jiān)控指標(Metric)被統(tǒng)一定義為:
<metric_name>{<label_name>=<label_value>, ...}
其中指標名稱說明指標的含義愧膀,標簽可以體現(xiàn)指標的維度特征拦键,用于過濾和聚合。
Prometheus的Client Library提供度量的四種基本類型包括: Counter(計數(shù)器), Gauge(儀表盤), Histogram(柱狀圖), Summary(概要)檩淋。
Prometheus Exporter
AlertManager
Alertmanager作為一個獨立的組件芬为,負責接收并處理來自Prometheus Server(也可以是其它的客戶端程序)的告警信息。Alertmanager可以對這些告警信息進行進一步的處理蟀悦,比如當接收到大量重復告警時能夠消除重復的告警信息媚朦,同時對告警信息進行分組并且路由到正確的通知方,Prometheus內置了對郵件日戈,Slack等多種通知方式的支持询张,同時還支持與Webhook的集成,以支持更多定制化的場景浙炼。同時AlertManager還提供了靜默和告警抑制機制來對告警通知行為進行優(yōu)化份氧。
- 客戶端通過POST請求向AlertManager推送告警信息。
- 每條告警信息中的labels可用于唯一識別告警信息并用于去重弯屈。
[
{
"labels": {
"alertname": "<requiredAlertName>",
"<labelname>": "<labelvalue>",
...
},
"annotations": {
"<labelname>": "<labelvalue>",
},
"startsAt": "<rfc3339>",
"endsAt": "<rfc3339>",
"generatorURL": "<generator_url>"
},
...
]
架構
AlertManager主要分為兩個部分蜗帜,路由(router)和接收器(receiver)。告警消息先被經(jīng)過路由樹季俩,然后被分配到對應的接收器中钮糖。路由樹是由預先設定的路由規(guī)則生成的。其高可用架構如上圖所示酌住,具體流程如下:
- Prometheus會通過調用AlertManager提供的告警接口將原始的告警消息發(fā)送到AlertManager店归。
- AlertManager的API除了接收告警,還接收靜默請求酪我,將其分別保存到各自的provider里消痛。
- provider提供了一個訂閱(subscribe)接口,這樣Dispatcher組件便可以獲取告警數(shù)據(jù)都哭,并對數(shù)據(jù)進行分組秩伞,通過用戶預先設置的規(guī)則進入告警抑制階段或靜默階段。
- 如果通過了上面的告警靜默階段欺矫,則進入路由分發(fā)階段纱新,最終發(fā)送通知。
Open-Falcon
Open-Falcon是小米公司開源的一款監(jiān)控與告警系統(tǒng)穆趴,已被多家國內互聯(lián)網(wǎng)公司所使用脸爱,基于Go語言開發(fā)。
架構
Data model
open-falcon采用和opentsdb相同的數(shù)據(jù)格式:metric未妹、endpoint加多組key value tags簿废。例如:
{
metric: load.1min,
endpoint: open-falcon-host,
tags: srv=falcon,idc=aws-sgp,group=az1,
value: 1.5,
timestamp: `date +%s`,
counterType: GAUGE,
step: 60
}
Data collection
falcon-agent用于采集各項基礎監(jiān)控數(shù)據(jù)指標空入,主動上報,不需要用戶在server做任何配置族檬。falcon-agent還可以執(zhí)行用戶自定義的插件返回的數(shù)據(jù)歪赢。同時falcon-agent提供了一個proxy-gateway,用戶可以方便的通過http接口单料,push數(shù)據(jù)到本機的gateway埋凯,gateway會幫忙高效率的轉發(fā)到server端。
transfer接收客戶端發(fā)送的數(shù)據(jù)扫尖,做一些數(shù)據(jù)規(guī)整递鹉,檢查之后,轉發(fā)到多個后端系統(tǒng)去處理藏斩。在轉發(fā)到每個后端業(yè)務系統(tǒng)的時候,transfer會根據(jù)一致性hash算法却盘,進行數(shù)據(jù)分片狰域,來達到后端業(yè)務系統(tǒng)的水平擴展。transfer目前支持三種業(yè)務后端黄橘,分別為judge兆览、graph、opentsdb塞关。其中judge是告警判定組件抬探,graph是數(shù)據(jù)存儲、歸檔帆赢、查詢組件小压,opentsdb是開源的時間序列數(shù)據(jù)存儲服務。
Alert
Judge組件用戶告警的判定椰于。用戶在web portal來配置相關的報警策略怠益,存儲在MySQL中。heartbeat server 會定期加載MySQL中的內容瘾婿。judge也會定期和heartbeat server保持溝通蜻牢,來獲取相關的告警策略。
Heartbeat server
heartbeat sever從數(shù)據(jù)庫中加載模板策略偏陪,根據(jù)模板繼承抢呆、模板項覆蓋、報警動作覆蓋笛谦、模板和hostGroup綁定抱虐,計算出最終關聯(lián)到每個endpoint的告警策略,提供給judge組件來使用揪罕。
Zabbix
Zabbix 是由 Alexei Vladishev 開發(fā)的一種網(wǎng)絡監(jiān)視梯码、管理系統(tǒng)宝泵,支持多種采集方式和采集客戶端,同時支持SNMP轩娶,IPMI儿奶,JMX,Telnet鳄抒,SSH等多種協(xié)議闯捎,它將采集到的數(shù)據(jù)存放到數(shù)據(jù)庫中,然后對其進行分析整理许溅,如果符合告警規(guī)則瓤鼻,則觸發(fā)相應的告警。
Zabbix組件圖
Zabbix Server
Zabbix的核心組件贤重,由C語言編寫茬祷,主要負責接收Agent發(fā)送的監(jiān)控信息,并進行匯總存儲并蝗。Zabbix Server主要包括三個方面的工作祭犯。
- 設備注冊。
- 手動配置Agent地址滚停。
- 自動發(fā)現(xiàn)機制沃粗。
- 數(shù)據(jù)收集。采集到數(shù)據(jù)首先會被放置在內存中键畴,然后被批量保存在數(shù)據(jù)庫中最盅。
- 主動收集
- 被動接收
- 定期的數(shù)據(jù)清理和告警觸發(fā)。
Zabbix Database
用于存儲配置信息以及收集的監(jiān)控數(shù)據(jù)起惕。后端數(shù)據(jù)庫支持MySQL涡贱,PostgreSQL,Oracle等疤祭,并提供Zabbix Web頁面的數(shù)據(jù)查詢方式盼产。由于采用關系型數(shù)據(jù)庫存儲時序數(shù)據(jù),所以Zabbix在監(jiān)控大規(guī)模集群時常常在數(shù)據(jù)存儲方面捉襟見肘勺馆。
Zabbix Web
Zabbix的GUI組件戏售,由PHP編寫。通常于Server運行在同一臺主機上草穆。提供監(jiān)控數(shù)據(jù)的展現(xiàn)和系統(tǒng)配置灌灾,主要配置包括監(jiān)控模板,告警等悲柱。
Proxy
主要解決兩個問題锋喜。
- Server和Agent之間網(wǎng)絡不通。
- 大規(guī)模部署時減輕Server的壓力。
Agent
部署在被監(jiān)控主機上嘿般,負責收集本地數(shù)據(jù)并發(fā)往Server端或Proxy端段标,Agent端會啟動一個Agentd的守護進程。
- 主動
- 被動
InfluxData
TICK技術棧
TICK技術棧是InfluxData 平臺提供的監(jiān)控方案炉奴,代表了用于解決時序數(shù)據(jù)庫問題的四個組件:Telegraf(數(shù)據(jù)收集器)逼庞、InfluxDB(時序數(shù)據(jù)庫)、Chronograf(可視化 UI)和 Kapacitor(處理和監(jiān)控服務)瞻赶。
InfluxDB metric type
InfluxDB與傳統(tǒng)數(shù)據(jù)庫的比較
InfluxDB | MySQL |
---|---|
database | 數(shù)據(jù)庫 |
measurement | 數(shù)據(jù)庫中的表 |
points | 表里面的一行數(shù)據(jù) |
InfluxDB的數(shù)據(jù)類型
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
InfluxDB數(shù)據(jù)的構成:Point由時間戳(time)赛糟、數(shù)據(jù)(field)、標簽(tags)組成砸逊。
Pointer屬性 | 傳統(tǒng)數(shù)據(jù)庫中的概念 |
---|---|
fields | 各種記錄值(沒有索引的屬性)也就是記錄的值:溫度璧南, 濕度 |
tags | 各種有索引的屬性:地區(qū),海拔 |
time | 每個數(shù)據(jù)記錄時間师逸,是數(shù)據(jù)庫中的主索引(會自動生成) |
Kapacitor
Kapacitor 是TICK技術棧的告警服務司倚,用戶通過tickScript腳本來對時序數(shù)據(jù)庫當中的數(shù)據(jù)進行過濾,篩選篓像,批處理等進行告警对湃,告警信息可以通過日志保存在本地,或回插到InfluxDB遗淳,還可以直接在告警產生后發(fā)起http請求到指定地址,kapacitor支持數(shù)據(jù)流(stream)和批處理(batch)數(shù)據(jù)心傀。
kapacitor是一個腳本定義告警規(guī)則服務屈暗,與InfluxDB強相關,安裝kapacitor后通過配置kapacitor.conf文件來配置和InfluxDB連接(通常是與InfluxDB開放的本地端口8086連接)
Example:
stream
|from()
.measurement('cpu')
.where(lambda: "host" == 'serverA')
.groupBy('host')
|alert()
.id('kapacitor/{{ index .Tags "service" }}')
.message('{{ .ID }} is {{ .Level }} value:{{ index .Fields "value" }}')
.info(lambda: "value" > 60)
.warn(lambda: "value" > 70)
.crit(lambda: "value" > 80)
.post("http://example.com/api/alert")
.post("http://another.example.com/api/alert")
.tcp("exampleendpoint.com:5678")
.email('oncall@example.com')
Bosun
Unisphere Unity300
對比分析
監(jiān)控與告警系統(tǒng) | 開發(fā)語言 | 成熟度 | 配置 | 可擴展性 | 故障域 | 性能 | 告警源 | 告警目標 | 社區(qū)活躍度 | 對容器的支持 | 企業(yè)使用度 |
---|---|---|---|---|---|---|---|---|---|---|---|
Zabbix | C + PHP | 高 | 基于模版 | 高 | 大脂男,集成 | 低 | 多通道 | 多通道 | 中 | 低 | 高 |
Prometheus | Go | 高 | 基于模版 | 高 | 小养叛,單組件 | 高 | 多通道 | 多通道 | 高 | 高 | 高 |
Open-Falcon | Go + Python | 中 | 樹形結構 | 高 | 小,單組件 | 高 | 多通道 | 多通道 | 中 | 中 | 中 (主要是國內企業(yè)使用宰翅,包括美團弃甥,滴滴,360等) |
InfluxDB | Go | 高 | 高 | 小汁讼,單組件 | 高 | 多通道 | 多通道 | 高 | 高 | ||
Bosun | Go | ||||||||||
Unity300 | Dell EMC產品 |