如何使用Prometheus輕松實(shí)現(xiàn)集群監(jiān)控?
1、Prometheus 對(duì)比 Zabbix
和 Zabbix 類似,Prometheus 也是一個(gè)近年比較火的開(kāi)源監(jiān)控框架,和 Zabbix不同之處在于 Prometheus 相對(duì)更靈活點(diǎn),模塊間比較解耦,比如告警模塊、代理模塊等等都可以選擇性配置。服務(wù)端和客戶端都是開(kāi)箱即用,不需要進(jìn)行安裝。Zabbix則是一套安裝把所有東西都弄好,很龐大也很繁雜。
Zabbix 的客戶端 agent 可以比較方便的通過(guò)腳本來(lái)讀取機(jī)器內(nèi)數(shù)據(jù)庫(kù)、日志等文件來(lái)做上報(bào)。而 Prometheus 的上報(bào)客戶端則分為不同語(yǔ)言的SDK和不同用途的 exporter 兩種,比如如果你要監(jiān)控機(jī)器狀態(tài)、mysql性能等,有大量已經(jīng)成熟的 exporter 來(lái)直接開(kāi)箱使用,通過(guò)http通信來(lái)對(duì)服務(wù)端提供信息上報(bào)(server去pull信息);
而如果你想要監(jiān)控自己的業(yè)務(wù)狀態(tài),那么針對(duì)各種語(yǔ)言都有官方或其他人寫(xiě)好的 sdk 供你使用,都比較方便,不需要先把數(shù)據(jù)存入數(shù)據(jù)庫(kù)或日志再供 zabbix-agent 采集。
Zabbix 的客戶端更多是只做上報(bào)的事情,push 模式。而 Prometheus 則是客戶端本地也會(huì)存儲(chǔ)監(jiān)控?cái)?shù)據(jù),服務(wù)端定時(shí)來(lái)拉取想要的數(shù)據(jù)。界面來(lái)說(shuō) zabbix 比較陳舊,而 prometheus 比較新且非常簡(jiǎn)潔,簡(jiǎn)潔到只能算一個(gè)測(cè)試和配置平臺(tái)。要想獲得良好的監(jiān)控體驗(yàn),搭配 Grafana 還是二者的必走之路。
2、安裝 Prometheus
Prometheus 有很多種安裝方式,可以在官網(wǎng)看到,這里只介紹下載安裝包解壓的方式,因?yàn)?Prometheus 是“開(kāi)箱即用”的,也就是說(shuō)解壓安裝包后就可以直接使用了,不需要再執(zhí)行安裝程序,很方便。
可以去 Prometheus 的官網(wǎng)下載頁(yè)面獲取最新版本的信息,比如現(xiàn)在的最新版本是2.7.2,那就下載相應(yīng)系統(tǒng)的安裝包,然后解壓
- $ wget https://github.com/prometheus/prometheus/releases/download/v2.7.2/prometheus-2.7.2.linux-amd64.tar.gz
- $ tar xvfz prometheus-2.7.2.linux-amd64.tar.gz
解壓后當(dāng)前目錄就會(huì)出現(xiàn)一個(gè)相應(yīng)的文件夾,進(jìn)入該文件夾,然后就可以直接運(yùn)行Prometheus server了!
- $ cd prometheus-2.7.2.linux-amd64
- // 查看版本
- $ ./prometheus --version
- // 運(yùn)行server
- $ ./prometheus --config.file=prometheus.yml
命令中的 prometheus.yml 文件其實(shí)就是配置文件,也在當(dāng)前目錄下,在其中可以配置一些東西。
3、配置 Prometheus
上文說(shuō)了,prometheus.yml 是配置文件,打開(kāi)可以看到不多的幾十行文字,類似下面:
- $ cat prometheus.yml
- # my global config
- global:
- scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
- evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
- # scrape_timeout is set to the global default (10s).
- # Alertmanager configuration
- alerting:
- alertmanagers:
- - static_configs:
- - targets:
- # - alertmanager:9093
- # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
- rule_files:
- # - "first_rules.yml"
- # - "second_rules.yml"
- # A scrape configuration containing exactly one endpoint to scrape:
- # Here it's Prometheus itself.
- scrape_configs:
- # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- - job_name: 'prometheus'
- # metrics_path defaults to '/metrics'
- # scheme defaults to 'http'.
- static_configs:
- - targets: ['localhost:9090']
其大致分為四部分:
- global:全局配置,其中 scrape_interval 表示抓取一次數(shù)據(jù)的間隔時(shí)間,evaluation_interval 表示進(jìn)行告警規(guī)則檢測(cè)的間隔時(shí)間;
- alerting:告警管理器(Alertmanager)的配置,目前還沒(méi)有安裝Alertmanager;
- rule_files:告警規(guī)則有哪些;
- scrape_configs:抓取監(jiān)控信息的目標(biāo)。一個(gè) job_name 就是一個(gè)目標(biāo),其 targets 就是采集信息的 IP 和端口。這里默認(rèn)監(jiān)控了 Prometheus 自己,可以通過(guò)修改這里來(lái)修改 Prometheus 的監(jiān)控端口。
Prometheus 的每個(gè) exporter 都會(huì)是一個(gè)目標(biāo),它們可以上報(bào)不同的監(jiān)控信息,比如機(jī)器狀態(tài),或者 mysql 性能等等,不同語(yǔ)言 sdk 也會(huì)是一個(gè)目標(biāo),它們會(huì)上報(bào)你自定義的業(yè)務(wù)監(jiān)控信息。
4、Prometheus 界面
運(yùn)行后,在瀏覽器訪問(wèn)[機(jī)器IP:端口]就可以查看 Prometheus 的界面了,這里的機(jī)器IP是你運(yùn)行 Prometheus 的機(jī)器,端口是上面配置文件中配置的監(jiān)控自己的端口。打開(kāi)后界面如下:
如果訪問(wèn)不了,看看是不是端口沒(méi)有打開(kāi)或者允許外網(wǎng)訪問(wèn)。
界面非常簡(jiǎn)單(所以我們還需要Grafana),上面標(biāo)簽欄中,Alerts是告警管理器,暫時(shí)還沒(méi)安裝。Graph是查看監(jiān)控項(xiàng)的圖表,也是訪問(wèn)后的默認(rèn)頁(yè)面,Status中可以查看一些配置、監(jiān)控目標(biāo)、告警規(guī)則等。
在 Graph 頁(yè)面,由于我們默認(rèn)已經(jīng)監(jiān)控了 Prometheus 自己,所以已經(jīng)可以查看一些監(jiān)控圖表,比如在輸入框輸入“promhttp_metric_handler_requests_total”,執(zhí)行Execute,下面的小標(biāo)簽中切換到Graph就能看到“/metrics”訪問(wèn)次數(shù)的折線圖。
5、添加機(jī)器狀態(tài)監(jiān)控
我們嘗試添加第一個(gè)監(jiān)控exporter——監(jiān)控當(dāng)前機(jī)器自身的狀態(tài),包括硬盤(pán)、CPU、流量等。因?yàn)镻rometheus已經(jīng)有了很多現(xiàn)成的常用exporter,所以我們直接用其中的node_exporter。注意了,這里名字雖然叫node_exporter,但跟nodejs沒(méi)有任何關(guān)系,在Prometheus看來(lái),一臺(tái)機(jī)器或者說(shuō)一個(gè)節(jié)點(diǎn)就是一個(gè)node,所以該exporter是在上報(bào)當(dāng)前節(jié)點(diǎn)的狀態(tài)。node_exporter本身也是一個(gè)http服務(wù),可以供 prometheus server 調(diào)用(pull)來(lái)獲取監(jiān)控的信息,安裝方法同樣是下載安裝包后解壓直接運(yùn)行:
- // 下載最新版本,可以在github的release中對(duì)最新版本右鍵獲取下載鏈接
- $ wget https://github.com/prometheus/node_exporter/releases/download/v0.17.0/node_exporter-0.17.0.linux-amd64.tar.gz
- // 解壓
- $ tar xvfz node_exporter-0.17.0.linux-amd64.tar.gz
- // 進(jìn)入解壓出的目錄
- $ cd node_exporter-0.17.0.linux-amd64
- // 運(yùn)行監(jiān)控采集服務(wù)
- $ ./node_exporter
運(yùn)行后可以看到在監(jiān)聽(tīng)9100端口。這樣就可以采集了,現(xiàn)在先訪問(wèn)試試能不能有沒(méi)有成功運(yùn)行:這里也可以看出其實(shí)每個(gè)exporter本身都是一個(gè)http服務(wù),server端會(huì)定時(shí)來(lái)訪問(wèn)獲取監(jiān)控信息。訪問(wèn)成功的話,我們?nèi)rometheus的配置文件(prometheus.yml)中,加上這個(gè)target:
- scrape_configs:
- - job_name: 'prometheus'
- static_configs:
- - targets: ['localhost:9090']
- - job_name: 'server'
- static_configs:
- - targets: ['localhost:9100']
可以看到,就是在 scrape_configs 模塊中加一個(gè)job,命好名,配置好監(jiān)聽(tīng)的IP和端口即可,然后重新運(yùn)行 prometheus,在標(biāo)簽欄的 Status → Targets 中可以看到多了一個(gè):
如果新加的 target 的 status 是“UP”的話,就說(shuō)明監(jiān)聽(tīng)成功了。
此時(shí)去Graph中,輸入框輸入node可以發(fā)現(xiàn)有很多 node 開(kāi)頭的監(jiān)控項(xiàng)了,都是和機(jī)器狀態(tài)有關(guān)的,可以自己執(zhí)行看一看。
安裝 Grafana
因?yàn)?Prometheus 的界面看起來(lái)非常簡(jiǎn)單,所以我們還需要 Grafana 這個(gè)非常強(qiáng)大也是最常用的監(jiān)控展示框架。
我們還是用下載二進(jìn)制包的方式來(lái)進(jìn)行安裝,這種方式不需要你當(dāng)前的linux用戶擁有sudo權(quán)限,也不需要你知道 root 密碼。如果你有這些權(quán)限,那就使用 yum 等其他直接的安裝方式吧,安裝說(shuō)明見(jiàn) Grafana 的官方安裝頁(yè)面
我們直接下載并解壓:
- $wget [https://dl.grafana.com/oss/release/grafana-6.0.0.linux-amd64.tar.gz](https://dl.grafana.com/oss/release/grafana-6.0.0.linux-amd64.tar.gz)
- $ tar -zxvf grafana-6.0.0.linux-amd64.tar.gz
- 這個(gè)頁(yè)面給出的是最新版本的安裝命令,右上角可以選擇切換其他版本的安裝命令。
解壓后會(huì)出現(xiàn) grafana-6.0.0 目錄,進(jìn)入該目錄,然后就可以運(yùn)行 Grafana 了:
- $ cd grafana-6.0.0
- // 啟動(dòng)Grafana。$ ./bin/grafana-server web
通過(guò)log信息可以看到Grafana默認(rèn)運(yùn)行在3000端口,這個(gè)也可以通過(guò)配置文件進(jìn)行修改:創(chuàng)建名為 custom.ini 的配置文件,添加到 conf 文件夾,復(fù)制 conf/defaults.ini 中定義的所有設(shè)置,然后修改自己想要修改的。
在 Grafana 展示監(jiān)控信息
安裝并啟動(dòng)Grafana后,瀏覽器輸入 IP:3000 來(lái)訪問(wèn)Grafana,管理員賬號(hào)密碼默認(rèn)是admin/admin。首次登陸會(huì)讓你修改管理員密碼,然后就可以登錄查看了。
在界面左邊是一豎排選項(xiàng),選擇設(shè)置圖標(biāo)中的Data Source,添加Prometheus的數(shù)據(jù)源,URL 就填上面你給 Prometheus Server 設(shè)置的ip+端口號(hào)就行了,如果沒(méi)改過(guò)且在本機(jī)運(yùn)行的話,那就是 localhost:9090。
此時(shí)可以添加 dashboard,也就是監(jiān)控面板了,在剛配好的 Prometheus Data Source的設(shè)置中有一個(gè)標(biāo)簽就是 dashboard,我們導(dǎo)入 Prometheus 2.0 Stats 這個(gè)面板,就能看到我們Prometheus的一些基本監(jiān)控情況了,這其實(shí)就是導(dǎo)入了一個(gè)別人寫(xiě)好的面板配置,并且連接我們自己 Prometheus 的監(jiān)控?cái)?shù)據(jù)做展示。還記得我們上面還運(yùn)行了一個(gè) node exporter 吧,現(xiàn)在我們展現(xiàn)一下這個(gè)監(jiān)控信息,左邊豎排點(diǎn)擊加號(hào)圖標(biāo)中的 Import,來(lái)導(dǎo)入其他別人寫(xiě)好的面板。在Grafana的官方面板頁(yè)面其實(shí)可以看到很多別人配置好的面板,我們找到自己想要的面板,比如這個(gè)node exporter 的:
復(fù)制右邊那個(gè)面板ID,然后在 Import 界面輸入ID,Load 后配置好數(shù)據(jù)源為我們的Prometheus,就可以出現(xiàn)我們自己機(jī)器的狀態(tài)監(jiān)控面板了,很炫酷吧。
這個(gè)面板需要安裝一個(gè)餅圖的插件(頁(yè)面上有說(shuō)明),安裝 Grafana 插件的方法為:
- // 進(jìn)入Grafana/bin目錄
- ./grafana-cli plugins install [插件名]
- // 安裝成功后重啟Grafana
面板中的每個(gè)圖都是可以編輯的,也可以設(shè)置告警,Grafana 告警支持多種方式,我們最常用的就是郵件和 webhook 了,所以其實(shí)不太需要用 Prometheus 的告警。