什么是 Prometheus
Prometheus 是開(kāi)源監(jiān)控告警解決方案确镊,CNCF(Cloud Native Computing Foundation) 成員。
主要特點(diǎn)
- 一個(gè)帶時(shí)序數(shù)據(jù)庫(kù)(TSDB)的監(jiān)控系統(tǒng)伦仍。
- 提供計(jì)量數(shù)據(jù)查詢功能迎变,實(shí)現(xiàn)了類似于 SQL 的查詢語(yǔ)法PromQL脓魏。
- 采用 http 協(xié)議田炭,使用 pull 模式近她,拉取數(shù)據(jù),并將其保存在TSDB 中竟宋。
- 監(jiān)控目標(biāo)提完,可以采用服務(wù)發(fā)現(xiàn)或靜態(tài)配置的方式。
- 提供告警功能丘侠,能根據(jù)已定義的告警規(guī)則向外輸出告警徒欣。
- 雖然它自己實(shí)現(xiàn)了一個(gè)面板,但還比較簡(jiǎn)陋∥献郑現(xiàn)在主流的做法是將它和 Grafana 結(jié)合打肝,由 Grafana 提供面板脂新。
它不是什么:
- 它不處理日志或跟蹤(tracing),只處理計(jì)量數(shù)據(jù)粗梭。
- 它本身不是專門的具有良好擴(kuò)展性的持久存儲(chǔ)争便。它自身的存儲(chǔ),被設(shè)計(jì)為用于短時(shí)間保存數(shù)據(jù)断医。
核心組件
- Prometheus Server滞乙, 主要用于抓取數(shù)據(jù)和存儲(chǔ)時(shí)序數(shù)據(jù),另外還提供查詢和 Alert Rule 配置管理鉴嗤。
- client libraries酷宵,用于對(duì)接 Prometheus Server, 可以查詢和上報(bào)數(shù)據(jù)。
- push gateway 躬窜,用于批量浇垦,短期的監(jiān)控?cái)?shù)據(jù)的匯總節(jié)點(diǎn),主要用于業(yè)務(wù)數(shù)據(jù)匯報(bào)等荣挨。
- 各種匯報(bào)數(shù)據(jù)的 exporters 男韧,例如匯報(bào)機(jī)器數(shù)據(jù)的 node_exporter, 匯報(bào) MongoDB 信息的 MongoDB exporter 等等。
- 用于告警通知管理的 alertmanager 默垄。
基礎(chǔ)架構(gòu)
官方的架構(gòu)圖
關(guān)于架構(gòu)的說(shuō)明:
- 左側(cè)是被監(jiān)控的對(duì)象(target)此虑,將監(jiān)控?cái)?shù)據(jù)采集的端點(diǎn)通過(guò)HTTP服務(wù)的形式暴露給Prometheus Server,Prometheus Server通過(guò)訪問(wèn)該Exporter提供的Endpoint端點(diǎn)口锭,即可獲取到需要采集的監(jiān)控?cái)?shù)據(jù)朦前。它一般分為2類:
- 直接采集:直接內(nèi)置了對(duì)Prometheus監(jiān)控的支持,比如cAdvisor鹃操,Kubernetes韭寸,Etcd,Gokit等荆隘,都直接內(nèi)置了用于向Prometheus暴露監(jiān)控?cái)?shù)據(jù)的端點(diǎn)恩伺。
- 間接采集:間接采集,原有監(jiān)控目標(biāo)并不直接支持Prometheus椰拒,因此我們需要通過(guò)Prometheus提供的Client Library編寫該監(jiān)控目標(biāo)的監(jiān)控采集程序晶渠。例如: Mysql Exporter,JMX Exporter燃观,Consul Exporter等褒脯。
- 左上是PushGateway:由于Prometheus數(shù)據(jù)采集基于Pull模型進(jìn)行設(shè)計(jì),因此在網(wǎng)絡(luò)環(huán)境的配置上必須要讓Prometheus Server能夠直接與Exporter進(jìn)行通信缆毁。 當(dāng)這種網(wǎng)絡(luò)需求無(wú)法直接滿足時(shí)番川,就可以利用PushGateway來(lái)進(jìn)行中轉(zhuǎn)。可以通過(guò)PushGateway將內(nèi)部網(wǎng)絡(luò)的監(jiān)控?cái)?shù)據(jù)主動(dòng)Push到Gateway當(dāng)中爽彤。而Prometheus Server則可以采用同樣Pull的方式從PushGateway中獲取到監(jiān)控?cái)?shù)據(jù)。還有一種情況是生存周期很短的job缚陷,server 每次去pull 都抓不到數(shù)據(jù)适篙,這時(shí)候需要它主動(dòng)push 到一個(gè)中間位置(gateway)。
- 中下部分是 Prometheus(開(kāi)源項(xiàng)目地址)箫爷。它是監(jiān)控系統(tǒng)的中心嚷节,負(fù)責(zé)策略數(shù)據(jù)收集、存儲(chǔ)虎锚、告警硫痰、查詢等。
- 中上部分是服務(wù)發(fā)現(xiàn)窜护,用于動(dòng)態(tài)對(duì)象的監(jiān)控效斑。在很多現(xiàn)代系統(tǒng)中,被監(jiān)控對(duì)象不是靜態(tài)的柱徙,比如 K8S 中的Pod缓屠。對(duì)于動(dòng)態(tài)目標(biāo),按照靜態(tài)目標(biāo)那種監(jiān)控方式就很難了护侮,因此 Prometheus 提供了服務(wù)發(fā)現(xiàn)功能敌完。它能動(dòng)態(tài)地發(fā)現(xiàn)被監(jiān)控的對(duì)象,然后對(duì)它們做監(jiān)控羊初。
- 右上是 AlertManager(開(kāi)源項(xiàng)目地址 )滨溉。它接受 Prometheus 根據(jù)所配置的告警規(guī)則發(fā)過(guò)來(lái)的告警,然后做去重长赞、分組和路由等處理晦攒,然后發(fā)給外部的接口組件,比如 PageDuty得哆、郵件系統(tǒng)等勤家。(告警部分也可以在Grafana部分完成)
- 右下是 Grafana(開(kāi)源項(xiàng)目地址 )。它以Prometheus 為后端(它支持對(duì)接很多種后端)柳恐,根據(jù)配置伐脖,從中獲取數(shù)據(jù),然后以非常漂亮的界面(Dashboard)將數(shù)據(jù)呈現(xiàn)出來(lái)乐设。
Prometheus vs Zabbix
Zabbix | Prometheus |
---|---|
更適合監(jiān)控物理機(jī)環(huán)境讼庇。 | 更適合云環(huán)境的監(jiān)控,對(duì) OpenStack近尚,Kubernetes 有更好的集成蠕啄。 |
安裝簡(jiǎn)單,zabbix-server 一個(gè)軟件包中包括了所有的服務(wù)端功能。 | 安裝相對(duì)復(fù)雜歼跟,監(jiān)控和媳、告警和界面都分屬于不同的組件。 |
圖形化界面比較成熟哈街,界面上基本上能完成全部的配置操作留瞳。 | 界面相對(duì)較弱,很多配置需要修改配置文件骚秦。 |
最核心的一點(diǎn)她倘,Prometheus對(duì)云環(huán)境支持更好,如果監(jiān)控物理機(jī)還是用Zabbix作箍。
OpenShift 提供了基于 Prometheus + Grafana 的監(jiān)控系統(tǒng)硬梁。針對(duì)每個(gè)需要被監(jiān)控的目標(biāo)(target),都利用了Prometheus提供的某個(gè)功能來(lái)實(shí)現(xiàn)對(duì)它的監(jiān)控胞得。也就是說(shuō)荧止,有現(xiàn)成的解決方案,不需要我們單獨(dú)配置阶剑。
安裝
Prometheus基于Golang編寫罩息,編譯后的軟件包,不依賴于任何的第三方依賴个扰。用戶只需要下載對(duì)應(yīng)平臺(tái)的二進(jìn)制包瓷炮,解壓并且添加基本的配置即可正常啟動(dòng)Prometheus Server。
我用二進(jìn)制方式递宅,在CentOS測(cè)試娘香,下載地址從官網(wǎng)獲取
$ wget https://github.com/prometheus/prometheus/releases/download/v2.12.0-rc.0/prometheus-2.12.0-rc.0.linux-amd64.tar.gz
$ tar zxf prometheus-2.12.0-rc.0.linux-amd64.tar.gz
$ cd prometheus-2.12.0-rc.0.linux-amd64
$ ./prometheus --config.file=prometheus.yml
level=info ts=2019-08-15T07:14:35.171Z caller=main.go:293 msg="no time or size retention was set so using the default time retention" duration=15d
level=info ts=2019-08-15T07:14:35.171Z caller=main.go:329 msg="Starting Prometheus" version="(version=2.12.0-rc.0, branch=HEAD, revision=eaf81808d5aa19ee4b9b8980ac5feeaec51408ac)"
...
查看
當(dāng) Prometheus 啟動(dòng)后,通過(guò)瀏覽器來(lái)訪問(wèn) http://IP:9090
办龄,將看到如下頁(yè)面
我們現(xiàn)在可以使用 `PromQL` (Prometheus Query Language)來(lái)查看烘绽,如果不知道怎么寫,可以查看 `http://IP:9090/metrics` 選擇一個(gè)metric 填進(jìn)去(也可以從Execute按鈕旁邊的下拉菜單選一個(gè))俐填。
還可以選旁邊的Graph(如下圖)看圖形界面安接。
如果要查詢99%的情況下如何,查詢語(yǔ)句改成
prometheus_target_interval_length_seconds{quantile="0.99"}
在console 的value 部分可以看到結(jié)果英融。
通過(guò)PromQL可以輕松回答類似于以下問(wèn)題:
- 在過(guò)去一段時(shí)間中95%應(yīng)用延遲時(shí)間的分布范圍盏檐?
- 預(yù)測(cè)在4小時(shí)后,磁盤空間占用大致會(huì)是什么情況驶悟?
- CPU占用率前5位的服務(wù)有哪些胡野?(過(guò)濾)
更多的PromQL用法,參考這里痕鳍。
配置一個(gè)數(shù)據(jù)源(Go client library target)
去一個(gè)新VM(10.0.0.5)
Pometheus鼓勵(lì)用戶監(jiān)控服務(wù)的內(nèi)部狀態(tài)硫豆,基于Prometheus豐富的Client庫(kù)龙巨,用戶可以輕松的在應(yīng)用程序中添加對(duì)Prometheus的支持,從而讓用戶可以獲取服務(wù)和應(yīng)用內(nèi)部真正的運(yùn)行狀態(tài)熊响。這本質(zhì)上是白盒監(jiān)控旨别。
安裝Go 編譯器并配置
$ wget https://dl.google.com/go/go1.12.8.linux-amd64.tar.gz
$ sudo tar zxf go1.12.8.linux-amd64.tar.gz -C /usr/local
$ export PATH=$PATH:/usr/local/go/bin
$ export GOPATH=/usr/local/go
下載Go client lib,運(yùn)行幾個(gè)測(cè)試
$ git clone https://github.com/prometheus/client_golang.git
$ cd client_golang/examples/random
$ sudo /usr/local/go/bin/go get -d
$ sudo /usr/local/go/bin/go build
$ ./random -listen-address=:8080 &
$ ./random -listen-address=:8081 &
$ ./random -listen-address=:8082 &
服務(wù)器端查看新的數(shù)據(jù)源(target)
更新 prometheus.yml
文件的scrape_configs
部分汗茄,加上新的target
scrape_configs:
- job_name: 'example-random'
scrape_interval: 5s
static_configs:
- targets: ['10.0.0.5:8080', '10.0.0.5:8081']
labels:
group: 'production'
- targets: ['10.0.0.5:8082']
labels:
group: 'canary'
重啟Prometheus秸弛,網(wǎng)頁(yè)查看,能找到新的機(jī)器剔难。
選擇 Status-> Targets 查看胆屿,更直觀一些
手工把target的進(jìn)程停掉奥喻,再查看偶宫,它們是DOWN
的狀態(tài)。
配置規(guī)則(rules)把收集到的數(shù)據(jù)放到新的時(shí)序中
rules 存在的意義是跟 alert manager 結(jié)合著使用环鲤。rules 定義了什么條件下報(bào)警纯趋,而所謂計(jì)算警報(bào)規(guī)則,其實(shí)就是周期性地執(zhí)行一段 PromQL冷离,得到的查詢結(jié)果就是警報(bào)吵冒,具體查詢語(yǔ)句參考: https://prometheus.io/docs/prometheus/latest/querying/basics/
alert manager 定義了怎么報(bào)警(分組,抑制西剥,靜默)->不同接受者(郵件痹栖,微信,Jenkins)
創(chuàng)建新的規(guī)則文件 prometheus.rules.yml
groups:
- name: example
rules:
- record: job_service:rpc_durations_seconds_count:avg_rate5m
expr: avg(rate(rpc_durations_seconds_count[5m])) by (job, service)
修改主配置文件 prometheus.yml
讓它讀取規(guī)則
rule_files:
- "prometheus.rules.yml"
重啟瞭空,新的時(shí)序 job_service:rpc_durations_seconds_count:avg_rate5m
可以查詢了揪阿。
網(wǎng)頁(yè)的Rules 也可以看到:
配置Node Exporter
這是最常見(jiàn)的組件,在vm 上安裝咆畏,負(fù)債監(jiān)控常規(guī)數(shù)據(jù)(CPU,Memory南捂,network,disk 等)
在Prometheus的架構(gòu)設(shè)計(jì)中,Prometheus Server并不直接服務(wù)監(jiān)控特定的目標(biāo)旧找,其主要任務(wù)負(fù)責(zé)數(shù)據(jù)的收集溺健,存儲(chǔ)并且對(duì)外提供數(shù)據(jù)查詢支持。因此為了能夠能夠監(jiān)控到某些東西钮蛛,如主機(jī)的CPU使用率鞭缭,我們需要使用到Exporter。Prometheus周期性的從Exporter暴露的HTTP服務(wù)地址(通常是/metrics)拉取監(jiān)控樣本數(shù)據(jù)魏颓。
客戶端安裝運(yùn)行
Node Exporter同樣采用Golang編寫缚去,并且不存在任何的第三方依賴,只需要下載琼开,解壓即可運(yùn)行易结。文件來(lái)源(Prometheus downloads page)
$ wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz
$ tar zxf node_exporter-0.18.1.linux-amd64.tar.gz
$ cd node_exporter-0.18.1.linux-amd64/
$ ./node_exporter &
$ curl http://localhost:9100/metrics
服務(wù)器端配置
為了能夠讓Prometheus Server能夠從當(dāng)前node exporter獲取到監(jiān)控?cái)?shù)據(jù),這里需要修改Prometheus配置文件 prometheus.yml
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['10.0.0.5:9100']
重啟服務(wù)。
$ ./prometheus --config.file=./prometheus.yml
網(wǎng)頁(yè)查看
Targets 中搞动,也能找到新的node
與Grafana集成
Prometheus 自帶的 Web 界面比較簡(jiǎn)單躏精,因?yàn)樗哪康氖菫榱思皶r(shí)查詢數(shù)據(jù),方便 PromeQL 調(diào)試鹦肿。
而在大多數(shù)場(chǎng)景下引入監(jiān)控系統(tǒng)通常還需要構(gòu)建可以長(zhǎng)期使用的監(jiān)控?cái)?shù)據(jù)可視化面板(Dashboard)矗烛。這時(shí)用戶可以考慮使用第三方的可視化工具如Grafana,Grafana是一個(gè)開(kāi)源的可視化平臺(tái)箩溃,并且提供了對(duì)Prometheus的完整支持瞭吃。
Grafana安裝
安裝方式參考官網(wǎng) official Grafana documentation.
wget https://dl.grafana.com/oss/release/grafana-6.3.3-1.x86_64.rpm
sudo yum localinstall grafana-6.3.3-1.x86_64.rpm
啟動(dòng)服務(wù)
$ sudo systemctl daemon-reload
$ sudo systemctl start grafana-server
$ sudo systmctl status grafana-server
網(wǎng)頁(yè)配置Prometheus源
訪問(wèn)http://localhost:3000就可以進(jìn)入到Grafana的界面中,默認(rèn)情況下使用賬戶admin/admin進(jìn)行登錄涣旨。在Grafana首頁(yè)中顯示默認(rèn)的使用向?qū)峒埽ǎ喊惭b、添加數(shù)據(jù)源霹陡、創(chuàng)建Dashboard和蚪、邀請(qǐng)成員、以及安裝應(yīng)用和插件等主要流程:
生成Dashboard
回首頁(yè)烹棉,再創(chuàng)建 Dashboard
Dashboard 中新的panel攒霹,使用query 方式,來(lái)源是Prometheus浆洗,metrics 是我們之前用過(guò)的 prometheus_target_interval_length_seconds
類似的方法催束,我們?cè)偬砑? job_service:rpc_durations_seconds_count:avg_rate5m
最后得到:
導(dǎo)入Dashboard
上面的方法,每個(gè)metrics都要自己填寫伏社,panel的排列也要自己調(diào)整抠刺,很麻煩。更簡(jiǎn)單的方式就是使用別人現(xiàn)成的模板洛口,模板可以從Grafana官網(wǎng)去找矫付,
針對(duì)Node Exporter 從上面的頁(yè)面找到Dashboard ID,用于之后的導(dǎo)入第焰。
看起來(lái)很專業(yè)的監(jiān)控圖表就出現(xiàn)了买优。
參考文檔
https://www.cnblogs.com/sammyliu/p/10155442.html
https://yunlzheng.gitbook.io/prometheus-book/