從零開始搭建Prometheus+Grafana+AlertManager+Node-exporter自動監控報警系統(非docker方式安裝:推薦)


一:前言

一個服務上線了后,你想知道這個服務是否可用,需要監控。假如線上出故障了,你要先於顧客感知錯誤,你需要監控。還有對數據庫,服務器的監控,等等各層面的監控。
近年來,微服務架構的流行,服務數越來越多,監控指標變得越來越多,所以監控也變得越來越復雜,需要新的監控系統適應這種變化。

以前我們用zabbix,StatsD監控,但是隨着容器化,微服務的流行,我們需要新的監控系統來適應這種變化。於是監控項目Prometheus就應運而生。

二:Prometheus介紹

介紹

Prometheus是一款基於時序數據庫的開源監控告警系統,它是SoundCloud公司開源的,SoundCloud的服務架構是微服務架構,他們開發了很多微服務,由於服務太多,傳統的監控已經無法滿足它的監控需求,於是他們在2012就着手開發新的監控系統。Prometheus的原作者Matt T. Proud在2012年加入SoundCloud公司,他之前服務於Google公司,他從google的監控系統Borgmon中獲取靈感,與另外一名工程師Julius Volz合作開發了開源監控系統Prometheus。(總之感覺是因為有了這個前google工程師到來,才有能力開發了Prometheus)。后來其他開發人員陸續加入了這個項目,並在 SoundCloud 內部繼續開發,最終於 2015 年 1 月將其發布。后來在2016年,SoundCloud把它捐獻給了雲原生基金會(Cloud Native Computing Foundation),在它下面繼續孵化。

Prometheus是用go語言開發。它的很多理念跟google的SRE不謀而合。所以有時間,可以去看看google SRE那本書,可以更好的理解Prometheus。

主要特性(功能)

  • 多維數據模型(時序由 metric 名字和 k/v 的labels構成)
  • 靈活的查詢語言(PromQL
  • 無依賴的分布式存儲;單節點服務器都是自治的
  • 采用 http 協議,使用pull模式拉取數據,簡單易懂
  • 監控目標,可以采用服務發現和靜態配置方式
  • 支持多種統計數據模型和界面展示。可以和Grafana結合展示。

三:Prometheus架構原理

架構

來自官方的一張架構圖

圖片來自: https://prometheus.io/docs/introduction/overview/

主要模塊:

  • the main Prometheus Server,主要用於抓取數據和存儲時序數據,另外還提供查詢和 Alert Rule 配置管理。就是數據的采集和存儲,用PromQL查詢,報警配置。
  • client libraries,用於對接Prometheus Server,用於對接Prometheus Server,可以查詢和上報數據。
  • push gateway,用於批量,短期的監控數據的匯報總節點,主要用於業務數據匯報等。
  • 各種匯報數據的 exporters,例如匯報機器數據的node_exporter,匯報MondogDB信息的 MongoDB_exporter 等等。
  • 用於高級通知管理的 alertmanager 。
  • 各種各樣的支持工具

怎么采集監控數據

要采集目標的監控數據,首先就要在被采集目標地方安裝采集組件,這種采集組件被稱為Exporter。prometheus.io官網上有很多這種exporter,官方 exporter列表

采集完了怎么傳輸到Prometheus?

采集了數據,要傳輸給prometheus。怎么做?
Exporter 會暴露一個HTTP接口,prometheus通過Pull模式的方式來拉取數據,會通過HTTP協議周期性抓取被監控的組件數據。
不過prometheus也提供了一種方式來支持Push模式,你可以將數據推送到Push Gateway,prometheus通過pull的方式從Push Gateway獲取數據。

主要流程

  1. Prometheus server定期從靜態配置的 targets 或者服務發現的 targets 拉取數據(zookeeper,consul,DNS SRV Lookup等方式)
  2. 當新拉取的數據大於配置內存緩存區的時候,Prometheus會將數據持久化到磁盤,也可以遠程持久化到雲端。
  3. Prometheus通過PromQL、API、Console和其他可視化組件展示數據。Prometheus支持很多方式圖表可視化,比如Grafana,自帶的Promdash。它還提供HTTP API的查詢方式,自定義輸出。
  4. Prometheus 可以配置rules,然后定時查詢數據,當條件觸發的時候,會將alert推送到配置的Alertmanager。
  5. Alertmanager收到告警的時候,會根據配置,聚合,去重,降噪,最后發出警告。

四:安裝Prometheus

要整好prometheus監控系統,還是有很多軟件需要安裝。
安裝的主要組件如下:

  • Prometheus Server
  • 被監控對象exporter組件
  • 數據可視化工具 Grafana
  • 數據上報網關 push gateway
  • 告警系統 Alertmanager

第1種:直接安裝

wget https://github.com/prometheus/prometheus/releases/download/v2.19.2/prometheus-2.19.2.linux-amd64.tar.gz

解壓:

tar xvfz prometheus-2.19.2.linux-amd64.tar.gz

運行啟動:

cd ./prometheus-2.19.2.linux-amd64
./prometheus --version
./prometheus --config.file=prometheus.yml &

第2種:docker鏡像安裝(不推薦,詳情請百度)

查看web界面

在瀏覽器上輸入 http://192.168.184.128:9090/ , 如果顯示下面的web界面,說明promethdus啟動成功:

五:Exporter采集監控信息

前面已經講過,如果要監控服務器或者應用程序的各種信息,比如cpu、內存、網卡流量等等。就要在監控目標上安裝指標收集程序,並暴露HTTP接口供Prometheus拉取數據,這個指標收集程序就是Exporter。不同的指標需要不同的Exporter收集。

這種Exporter需要自己寫嗎?
一般不需要,官網上已經有大量的Exporter,上面我們已經列出過官網的Exporter清單 地址。
而且有的軟件已經集成了Prometheus的Exporter,也就是說軟件本身就提供了Prometheus需要的各種指標數據。最典型的就是k8s,他們是雲原生基金會的第一和第二個項目。

如果需要特殊的監控,可能就要你自己寫Exporter了。

實例: node-exporter監控服務器

上面prometheus已經安裝好了,現在來安裝一個Exporter監控實例。

來安裝一個監控服務器主機cpu、內存和磁盤等信息的exporter,直接用node-exporter。它主要用於收集類 UNIX 系統的信息。

步驟:

1.先修改prometheus.yml信息,

Copy
global:
  scrape_interval: 15s
  external_labels:
    monitor: 'first-monitor' scrape_configs: - job_name: prometheus scrape_interval: 5s static_configs: - targets: ['127.0.0.1:9090'] - targets: ['127.0.0.1:9100'] # 這里開始增加的監控信息 labels: group: 'local-node-exporter' 

2.安裝並啟動node-exporter:

  進入官網下載:https://prometheus.io/download/

 

 

 

 

 

 

解壓后執行下面命令:

systemctl daemon-reload

systemctl start node_exporter

systemctl restart node_exporter

3.先用ps -ef | grep prometheus查出端口號,kill -9 殺掉,然后重啟prometheus:./prometheus --config.file=prometheus.yml & 。然后在瀏覽器上直接輸入: http://192.168.184.128:9090/targets。或者,你在界面上點擊 Status 菜單 -> Targets 菜單,來瀏覽metrics信息。

瀏覽器輸出的web界面如下:

 

 

 

 

 

 

可以看到里面有一個 9100 端口的 metrics 連接,點進去后,就可以看到一些采集信息。
說明剛才配置的node-exporter已經加入到prometheus的targets中了。如下圖:

查看監控信息

點擊web界面最上面的菜單 Graph

選擇下面的 Graph,然后我們選擇一個 node_memory_Active_bytes 來看一看,

然后點擊 Execute 按鈕 , 就會出來如下圖所示圖形:

六:可視化系統:Grafana

上面我們通過Prometheus自帶的UI,查看不同指標視圖,但是它的功能很簡單。如果需要強大的展示系統,能定制不同指標的面板,支持不同類型的展示方式,如曲線圖、熱點圖,TopN等,那么grafana比較合適。它可以對promethdus數據進行可視化的展示。

grafana是一個大型可視化系統,功能強大,可以創建自己的自定義面板,支持多種數據來源,
比如:OpenTSDB、Elasticsearch、Prometheus 等,可以到官網去查看支持的數據源種類,而且它插件也很多。

安裝

官網安裝文檔,它有不同平台安裝的Doc。
我選擇比較簡單的一種,命令如下:

wget https://dl.grafana.com/oss/release/grafana-8.0.6-1.x86_64.rpm

sudo yum install grafana-8.0.6-1.x86_64.rpm

然后啟動:

sudo systemctl daemon-reload
sudo systemctl start grafana-server
sudo systemctl status grafana-server
sudo systemctl enable grafana-server

 

我們在瀏覽器上看看界面,輸入下面地址:

http://192.168.184.128:3000/login

然后輸入初始密碼 admin/admin 登錄進入。

 

grafana設置

增加prometheus數據源並展示

1.點擊如下圖的Data Source:

2.點擊 Add data source 按鈕后,出來下面界面:

3.鼠標移到 Prometheus 上,點擊 Select 按鈕:

4.prometheus相關設置:

 

 

 

 

 

 

最主要設置獲取數據的HTTP URL。

5.點擊 save&test 按鈕,它會提示你是否設置成功。

6.設置Dashboards

7.回到home

8:點擊 prometheus

9:出來很多圖表展示

其他dashboard模板設置

grafana不僅有我們上面設置的那些圖表模板,它還有其他很多模板,我們也可以設置。
官方模板dashboard 地址

比如我們查找node exportet的模板,https://grafana.com/grafana/dashboards?search=node%20exporter,有一個模板 downloads 比較多,

它的地址為:
https://grafana.com/grafana/dashboards/8919

我們在grafana上來設置這個dashboard,import進來:

可以填寫id和url,我們填寫id,為 8919:

點擊 load 出來下面界面:

然后選擇prometheus-1,點擊 import, 出來如下圖的界面:

 

 

 

 

 

 

七、告警通知

 

 

 

 

我們已經能夠對收集的數據,通過grafana展示出來了,能查看數據。想一想,系統還缺失什么功能?

監控最重要的目的是什么?

  • 第一:監控系統是否正常
  • 第二:系統不正常時,可以告知相關人員及時的排查和解除問題,這就是告警通知

所以,還缺一個告警通知的模塊。
prometheus的告警機制由2部分組成:

  1. 告警規則
    prometheus會根據告警規則rule_files,將告警發送給Alertmanager
  2. 管理告警和通知
    模塊是Alertmanager。它負責管理告警,去除重復的數據,告警通知。通知方式有很多如Email、HipChat、Slack、WebHook等等。

配置

1.告警規則配置

告警文檔地址:告警規則官方文檔

我們新創建一個規則文件:alert_rules.yml,把它和prometheus.yml放在一起,官方有一個模板 Templating,直接copy過來:

Copy
groups:
- name: example
  rules:

  # Alert for any instance that is unreachable for >5 minutes. - alert: InstanceDown expr: up == 0 for: 5m labels: severity: page annotations: summary: "Instance {{ $labels.instance }} down" description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes." # Alert for any instance that has a median request latency >1s. - alert: APIHighRequestLatency expr: api_http_request_latencies_second{quantile="0.5"} > 1 for: 10m annotations: summary: "High request latency on {{ $labels.instance }}" description: "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)" 

上面規則文件大意:就是創建了2條alert規則 alert: InstanceDown 和 alert: APIHighRequestLatency :

  • InstanceDown 就是實例宕機(up==0)觸發告警,5分鍾后告警(for: 5m);
  • APIHighRequestLatency 表示有一半的 API 請求延遲大於 1s 時(api_http_request_latencies_second{quantile="0.5"} > 1)觸發告警

更多rules規則說明,請看這里 recording_rules

然后把alrt_rules.yml添加到prometheus.yml 里:

 

 

 

 

 

然后在瀏覽器上查看,rules是否添加成功,在瀏覽器上輸入地址 http://192.168.184.128:9090/rules

也可以查看alers情況,點擊菜單 Alerts:

 

 

 

 

告警通知配置

alertmanager配置:
官方配置文檔,官方配置例子

在上面我們可以看到alerts頁面的告警信息,但是怎么通知到研發和業務相關人員呢?這里以QQ郵箱為例,這個就是由Alertmanager完成,先配置alertmanager文件 alertmanager.yml,

global:
  resolve_timeout: 5m
  smtp_from: 'xxxxxxxx@qq.com'
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_auth_username: 'xxxxxxxx@qq.com'
  smtp_auth_password: 'xxxxxxxxxxxxxxx'
  smtp_require_tls: false
  smtp_hello: 'qq.com'
route:
  group_by: ['alertname']
  group_wait: 5s
  group_interval: 5s
  repeat_interval: 5m
  receiver: 'email'
receivers:
- name: 'email'
  email_configs:
  - to: 'xxxxxxxx@qq.com'
  send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
  target_match:
      severity: 'warning'
  equal: ['alertname', 'dev', 'instance']

 

 

啟動alertmanager服務:

./alertmanager --config.file=alertmanager.yml &

在瀏覽器上輸入 : http://192.168.184.128:9093,出現下面界面:

prometheus配置:
在promethdus加上下面的配置,

Copy
alerting:
  alertmanagers:
    - static_configs:
      - targets: ['127.0.0.1:9093'] 

重啟prometheus。

最后一步,測試告警發郵件。
之前配置了9100端口的報警信息,這個端口是node_exporter默認端口(node_exporter所在服務器ip這里我實際改為了:10.4.3.8)

 

 

現在停止node-exporter,執行命令:systemctl stop node-exporter,過一會兒就能收到報警郵件

 

 

再重新啟動:systemctl start node-exporter,又會收到郵件

 

 

 大功告成!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM