Prometheus+Grafana監控系統搭建
Prometheus對比Zabbix
和Zabbix類似,Prometheus也是一個近年比較火的開源監控框架,和Zabbix不同之處在於Prometheus相對更靈活點,模組間比較解耦,比如告警模組、代理模組等等都可以選擇性配置。服務端和客戶端都是開箱即用,不需要進行安裝。zabbix則是一套安裝把所有東西都弄好,很龐大也很繁雜。
zabbix的客戶端agent可以比較方便的通過指令碼來讀取機器內資料庫、日誌等檔案來做上報。而Prometheus的上報客戶端則分為不同語言的SDK和不同用途的exporter兩種,比如如果你要監控機器狀態、mysql效能等,有大量已經成熟的exporter來直接開箱使用,通過http通訊來對服務端提供資訊上報(server去pull資訊);而如果你想要監控自己的業務狀態,那麼針對各種語言都有官方或其他人寫好的sdk供你使用,都比較方便,不需要先把資料存入資料庫或日誌再供zabbix-agent採集。
zabbix的客戶端更多是隻做上報的事情,push模式。而Prometheus則是客戶端本地也會儲存監控資料,服務端定時來拉取想要的資料。
介面來說zabbix比較陳舊,而prometheus比較新且非常簡潔,簡潔到只能算一個測試和配置平臺。要想獲得良好的監控體驗,搭配Grafana還是二者的必走之路。
安裝Prometheus:
Prometheus有很多種安裝方式,可以在官網看到,這裡只介紹下載安裝包解壓的方式,因為Prometheus是“開箱即用”的,也就是說解壓安裝包後就可以直接使用了,不需要再執行安裝程式,很方便。可以去 Prometheus的官網下載頁面 獲取最新版本的資訊,比如現在的最新版本是2.7.2,那就下載相應系統的安裝包,然後解壓
$ 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
解壓後當前目錄就會出現一個相應的資料夾,進入該資料夾,然後就可以直接執行Prometheus server了!
$ cd prometheus-2.7.2.linux-amd64 // 檢視版本 $ ./prometheus --version // 執行server $ ./prometheus --config.file=prometheus.yml
命令中的prometheus.yml檔案其實就是配置檔案,也在當前目錄下,在其中可以配置一些東西。
配置Prometheus
上文說了,prometheus.yml是配置檔案,開啟可以看到不多的幾十行文字,類似下面:
$ 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表示抓取一次資料的間隔時間,evaluation_interval表示進行告警規則檢測的間隔時間;
- alerting:告警管理器(Alertmanager)的配置,目前還沒有安裝Alertmanager;
- rule_files:告警規則有哪些;
- scrape_configs:抓取監控資訊的目標。一個job_name就是一個目標,其targets就是採集資訊的IP和埠。這裡預設監控了Prometheus自己,可以通過修改這裡來修改Prometheus的監控埠。Prometheus的每個exporter都會是一個目標,它們可以上報不同的監控資訊,比如機器狀態,或者mysql效能等等,不同語言sdk也會是一個目標,它們會上報你自定義的業務監控資訊。
Prometheus介面:
執行後,在瀏覽器訪問[機器IP:埠]就可以檢視Prometheus的介面了,這裡的機器IP是你執行Prometheus的機器,埠是上面配置檔案中配置的監控自己的埠。開啟後介面如下:

如果訪問不了,看看是不是埠沒有開啟或者允許外網訪問。
介面非常簡單(所以我們還需要Grafana),上面標籤欄中,Alerts是告警管理器,暫時還沒安裝。Graph是檢視監控項的圖表,也是訪問後的預設頁面,Status中可以檢視一些配置、監控目標、告警規則等。
在Graph頁面,由於我們預設已經監控了Prometheus自己,所以已經可以檢視一些監控圖表,比如在輸入框輸入“promhttp_metric_handler_requests_total”,執行Execute,下面的小標籤中切換到Graph就能看到“/metrics”訪問次數的折線圖。
新增機器狀態監控
我們嘗試新增第一個監控exporter——監控當前機器自身的狀態,包括硬碟、CPU、流量等。因為Prometheus已經有了很多現成的常用exporter,所以我們直接用其中的 node_exporter 。注意了,這裡名字雖然叫node_exporter,但跟nodejs沒有任何關係,在Prometheus看來,一臺機器或者說一個節點就是一個node,所以該exporter是在上報當前節點的狀態。
node_exporter本身也是一個http服務,可以供prometheus server呼叫(pull)來獲取監控的資訊,安裝方法同樣是下載安裝包後解壓直接執行:
// 下載最新版本,可以在github的release中對最新版本右鍵獲取下載連結 $ 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 // 進入解壓出的目錄 $ cd node_exporter-0.17.0.linux-amd64 // 執行監控採集服務 $ ./node_exporter
執行後可以看到在監聽9100埠。這樣就可以採集了,現在先訪問試試能不能有沒有成功執行:
$ curl http://localhost:9100/metrics
這裡也可以看出其實每個exporter本身都是一個http服務,server端會定時來訪問獲取監控資訊。
訪問成功的話,我們去prometheus的配置檔案(prometheus.yml)中,加上這個target:
scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'server' static_configs: - targets: ['localhost:9100']
可以看到,就是在scrape_configs模組中加一個job,命好名,配置好監聽的IP和埠即可,然後重新執行prometheus,在標籤欄的 Status --> Targets 中可以看到多了一個:

如果新加的target的status是“UP”的話,就說明監聽成功了。
此時去Graph中,輸入框輸入node可以發現有很多node開頭的監控項了,都是和機器狀態有關的,可以自己執行看一看。
安裝Grafana:
因為Prometheus的介面看起來非常簡單,所以我們還需要Grafana這個非常強大也是最常用的監控展示框架。
我們還是用下載二進位制包的方式來進行安裝,這種方式不需要你當前的linux使用者擁有sudo許可權,也不需要你知道root密碼。如果你有這些許可權,那就使用yum等其他直接的安裝方式吧,安裝說明見 Grafana的官方安裝頁面
我們直接下載並解壓:
$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
這個頁面給出的是最新版本的安裝命令,右上角可以選擇切換其他版本的安裝命令。
解壓後會出現 grafana-6.0.0 目錄,進入該目錄,然後就可以執行Grafana了:
$ cd grafana-6.0.0 // 啟動Grafana。 $ ./bin/grafana-server web
通過log資訊可以看到Grafana預設執行在3000埠,這個也可以通過配置檔案進行修改:建立名為 custom.ini 的配置檔案,新增到 conf 資料夾,複製 conf/defaults.ini 中定義的所有設定,然後修改自己想要修改的。
在Grafana展示監控資訊
安裝並啟動Grafana後,瀏覽器輸入 IP:3000 來訪問Grafana,管理員賬號密碼預設是admin/admin。首次登陸會讓你修改管理員密碼,然後就可以登入查看了。
在介面左邊是一豎排選項,選擇設定圖示中的Data Source,新增Prometheus的資料來源,URL就填上面你給Prometheus Server設定的ip+埠號就行了,如果沒改過且在本機執行的話,那就是localhost:9090。
此時可以新增dashboard,也就是監控面板了,在剛配好的Prometheus Data Source的設定中有一個標籤就是dashboard,我們匯入Prometheus 2.0 Stats這個面板,就能看到我們Prometheus的一些基本監控情況了,這其實就是匯入了一個別人寫好的面板配置,並且連線我們自己Prometheus的監控資料做展示。
還記得我們上面還運行了一個node exporter吧,現在我們展現一下這個監控資訊,左邊豎排點選加號圖示中的Import,來匯入其他別人寫好的面板。在 Grafana的官方面板頁面 其實可以看到很多別人配置好的面板,我們找到自己想要的面板,比如這個node exporter的:

複製右邊那個面板ID,然後在Import介面輸入ID,Load後配置好資料來源為我們的Prometheus,就可以出現我們自己機器的狀態監控面板了,很炫酷吧。
面板中的每個圖都是可以編輯的,也可以設定告警,Grafana告警支援多種方式,我們最常用的就是郵件和webhook了,所以其實不太需要用Prometheus的告警。更多的探索就自行發現吧,我也寫過兩篇Grafana相關的文章: