Prometheus(普羅米修斯),是一套開源的系統監控報警框架。它以給定的時間間隔從已配置的目標收集指標,評估規則表達式,顯示結果,並在發現某些狀況爲真時觸發警報。
做爲新一代的監控框架,Prometheus 具備如下特色:html
* 多維數據模型:由度量名稱和鍵值對標識的時間序列數據 * PromSQL:一種靈活的查詢語言,能夠利用多維數據完成複雜的查詢 * 不依賴分佈式存儲,單個服務器節點可直接工做 * 基於HTTP的pull方式採集時間序列數據 * 推送時間序列數據經過PushGateway組件支持 * 經過服務發現或靜態配置發現目標 * 多種圖形模式及儀表盤支持(grafana) * 適用於以機器爲中心的監控以及高度動態面向服務架構的監控
* 高效:單一Prometheus能夠處理數以百萬的監控指標;每秒處理數十萬的數據點。 * 易於伸縮:經過使用功能分區(sharing)+聯邦集羣(federation)能夠對Prometheus進行擴展,造成一個 邏輯集羣;Prometheus提供多種語言的客戶端SDK,這些SDK能夠快速讓應用程序歸入到Prometheus的監控當中。 * 良好的可視化:Prometheus除了自帶有Prometheus UI,Prometheus還提供了一個獨立的基於Ruby On Rails的Dashboard解決方案Promdash。 另外最新的Grafana可視化工具也提供了完整的Proetheus支持,基於Prometheus提供的API還能夠實現本身的監控可視化UI。
大體的工做流程是:node
* Prometheus server 按期從配置好的 jobs 或者 exporters 中拉 metrics,或者接收來自 Pushgateway 發過來的 metrics, 或者從其餘的 Prometheus server 中拉 metrics; * Prometheus server 在本地存儲收集到的 metrics,並運行已定義好的 alert.rules,記錄新的時間序列或者向 Alertmanager 推送警報; * Alertmanager 根據配置文件,對接收到的警報進行處理,發出告警; * 在圖形界面中,可視化採集數據;
主機名稱 | IP地址 | 安裝組件 |
---|---|---|
docker01 | 192.168.45.129 | NodeEXporter、cAdvisor、Prometheus Server、Grafana |
docker02 | 192.168.45.141 | NodeEXporter、cAdvisor |
docker03 | 192.168.45.142 | NodeEXporter、cAdvisor |
注:部署該服務,包括四個組件:Prometheus Server、Node Exporter、cAdvrisor、Grafana其做用以下:linux
* Prometheus Server: 普羅米修斯的主服務器。(端口:9090) * NodeEXporter: 負責收集Host硬件信息和操做系統信息。(端口:9100) * cAdvisor: 負責收集Host上運行的容器信息。(端口:8080) * Grafana:負責展現普羅米修斯監控界面。(端口:3000) * Alertmanager:用來接收Prometheus發送的報警信息,而且執行設置好的報警方式,報警內容(一樣也是在dockerA主機上部署,端口:9093);
各組件的關係:NodeEXporter、cAdvisor負責收集信息發送給 Prometheus server,在由 Prometheus server交給Grafana進行圖形化的顯示。如需報警,則由prometheus向Alertmanager組件發送信息!web
實驗環境,所有關閉防火牆,禁用selinux。docker
1)部署Node-EXporter收集硬件和系統信息
注:三臺dockerhost主機,所有部署Node-EXporter和cAdvisor。vim
[root@docker01 ~]# docker run -d --name node -p 9100:9100 -v /proc:/host/proc -v /sys:/host/sys -v /:/rootfs --net=host prom/node-exporter --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)" //部署node-EXporter,負責收集硬件和系統信息。 //使用prom/node-exporter 鏡像建立一個名爲node的容器,用於收集硬件和系統信息; //--net=host表示Prometheus server能夠直接與node-exporter通訊; //並映射9100端口
驗證:打開瀏覽器驗證結果
注:出現這個結果表示Node-Exporter組件安裝成功,注意:另外兩臺dockerhost主機也需安裝Node-Exporter組件組件操做徹底同樣,安裝完成後請自行打開瀏覽器驗證。瀏覽器
2)部署cAdvisor,收集節點容器信息服務器
[root@docker01 ~]# docker run -v /:/rootfs:ro -v /var/run:/var/run/:rw -v /sys:/sys:ro -v /var/lib/docker:/var/lib/docker:ro -p 8080:8080 --detach=true --name=cadvisor --net=host google/cadvisor
驗證:打開瀏覽器驗證結果
注:出現這個結果表示cAdvisor組件安裝成功,注意:另外兩臺dockerhost主機也需安裝cAdvisor組件操做徹底同樣,安裝完成後請自行打開瀏覽器驗證。微信
3)、在docker01上部署Prometheus Server服務
在部署prometheus以前,咱們須要對它的配置文件進行修改,因此咱們先運行一個容器,先將其配置文件拷貝出來。架構
[root@docker01 ~]# docker run -d -p 9090:9090 --name prometheus --net=host prom/prometheus [root@docker01 ~]# docker cp prometheus:/etc/prometheus/prometheus.yml ./ [root@docker01 ~]# vim prometheus.yml - targets: ['localhost:9090','localhost:8080','localhost:9100','192.168.45.141:8080','192.168.45.141:9100','192.168.45.142:8080','192.168.45.142:9100'] //用於指定監控本機的9090、8080、9100這三個端口,另外添加另外兩臺docker主機的8080、9100這兩個端口。 //8080端口運行的是cAdvisor服務 //9100端口運行的是node-exporter服務 //9090端口運行的就是Prometheus服務
注:這裏指定了prometheus的監控項,包括它也會監控本身本地主機的數據
[root@docker01 ~]# docker rm prometheus -f //將剛纔運行的容器刪除 prometheus [root@docker01 ~]# docker run -d -p 9090:9090 --name prometheus --net=host -v /root/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus //從新運行一個prometheus容器,將剛纔修改完成的配置文件掛載到容器中
驗證:打開瀏覽器驗證結果
3)在docker01上,部署grafana服務,用來展現prometheus收集到的數據
[root@docker01 ~]# mkdir grafana-storage [root@docker01 ~]# chmod 777 -R grafana-storage/ [root@docker01 ~]# docker run -d -p 3000:3000 --name grafana -v /root/grafana-storage:/var/lib/grafana -e "GF_SECURITY_ADMIN_PASSWORD=123.com" grafana/grafana
驗證:打開瀏覽器驗證結果
上述配置完成後,咱們就須要配置它以什麼樣的形式來給咱們展現了,能夠自定義,可是很麻煩,我選擇直接去grafana官網尋找現成的模板。如圖:
注:這裏多是這個模塊用不了,能夠去grafana官網多找點別的圖形模板,以上是第一種下載模板方式,接下來演示第二種下載模板方式。
至此web界面的監控就部署完成了!
3)、配置Peometheus監控實現報警
Prometheus的報警方式有好幾種,好比:郵箱、微信、釘釘等,本次案例採用郵箱告警的方式。接下來,咱們須要啓動 AlertManager 來接受 Prometheus 發送過來的報警信息,並執行各類方式的告警。一樣以 Docker 方式啓動AlertManager,最簡單的啓動命令以下:
(1)、運行alertmanager容器只需在docker01上操做便可以下:
[root@docker01 ~]# docker run -d --name alertmanager -p 9093:9093 prom/alertmanager //隨便運行一個容器,其目的就是將容器中服務的配置文件拿到本地 [root@docker01 ~]# docker cp alertmanager:/etc/alertmanager/alertmanager.yml . //將altermanager服務的yml配置文件複製到本地
進入qq郵箱生成受權碼:
[root@docker01 ~]# vim alertmanager.yml global: resolve_timeout: 5m smtp_from: '2567195852@qq.com' //發送者信息 smtp_smarthost: 'smtp.qq.com:465' smtp_auth_username: '2567195852@qq.com //接收者信息 smtp_auth_password: 'tdcwcwvevmqwdjgg' //使用本身qq郵箱生成的受權碼 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: '2567195852@qq.com' //發送者信息 send_resolved: true //當容器恢復正常時,也會發送一份郵件 inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance']
簡單介紹一下主要配置的做用:
* global: 全局配置,包括報警解決後的超時時間、SMTP 相關配置、各類渠道通知的 API 地址等等。 * route: 用來設置報警的分發策略,它是一個樹狀結構,按照深度優先從左向右的順序進行匹配。 * receivers: 配置告警消息接受者信息,例如經常使用的 email、wechat、slack、webhook 等消息通知方式。 * inhibit_rules: 抑制規則配置,當存在與另外一組匹配的警報(源)時,抑制規則將禁用與一組匹配的警報(目標)。
[root@docker01 ~]# docker rm -f alertmanager //將本來的alertmanager 容器刪除 [root@docker01 ~]# docker run -d --name alertmanager -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager //從新運行alertmanager 容器,並將配置文件掛載到容器中 //建議運行容器以後,使用docker ps | grep alertmanager 確保容器正常運行 //若是配置文件編寫錯誤,那麼這個容器是沒法啓動的
(2)配置alertmanager報警規則
[root@docker01 ~]# mkdir -p prometheus/rules && cd prometheus/rules //建立目錄用於存放規則的目錄 [root@dockerA rules]# vim node-up.rules //編寫規則 groups: - name: node-up //自定義名稱 rules: - alert: node-up expr: up{job="prometheus"} == 0 // job的名稱必須和prometheus配置文件中的 - job_name: 'prometheus'對應 for: 15s labels: severity: 1 team: node annotations: summary: "{{ $labels.instance }} 已中止運行超過 15s!"
注:該 rules 目的是監測 node 是否存活,expr 爲 PromQL 表達式驗證特定節點 job="node-exporter" 是否活着,for 表示報警狀態爲Pending 後等待 15s 變成 Firing 狀態,一旦變成 Firing 狀態則將報警發送到 AlertManager,labels 和 annotations 對該 alert 添加更多的標識說明信息,全部添加的標籤註解信息,以及 prometheus.yml 中 該 job 已添加 label 都會自動添加到郵件內容中,更多關於 rule 詳細配置能夠參考它的官方文檔: https://prometheus.io/docs/prometheus/latest/configuration/recording_rules
(3)關聯Prometheus
[root@docker01 ~]# vim prometheus.yml # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: - 192.168.45.129:9093 //此行將本來的內容更改成alertmanager容器的IP+端口 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" - "/usr/local/prometheus/rules/*.rules" //手動添加這一行
[root@docker01 ~]# docker rm -f prometheus //修改完配置爲文件後,須要將容器刪除,從新運行一臺新的容器 prometheus [root@docker01 ~]# docker run -d -p 9090:9090 --name prometheus --net=host -v /root/prometheus.yml:/etc/prometheus/prometheus.yml -v /root/prometheus/rules/node-up.rules:/usr/local/prometheus/rules/node-up.rules prom/prometheus //指定步驟(2)編寫的rule文件的路徑
至此開始模擬docker02節點 exporter組件失敗或將任意一臺的docker主機的容器中止運行以下圖:
OK以上能夠看郵箱收到容器中止運行的警告,但好像看的不是很直白爲了追求美觀,咱們採起設置一下報警信息的模板!
(4)、設置報警信息模板
[root@docker01 ~]# cd prometheus/ [root@docker01 prometheus]# mkdir alertmanager-tmpl [root@docker01 prometheus]# cd alertmanager-tmpl/ [root@docker01 alertmanager-tmpl]# vim email.tmpl {{ define "email.from" }}2567195852@qq.com{{ end }} //填寫本身的qq郵箱 {{ define "email.to" }}2567195852@qq.com{{ end }} //填寫本身的qq郵箱 {{ define "email.to.html" }} {{ range .Alerts }} =========start==========<br> 告警程序: prometheus_alert<br> 告警級別: {{ .Labels.severity }} 級<br> 告警類型: {{ .Labels.alertname }}<br> 故障主機: {{ .Labels.instance }}<br> 告警主題: {{ .Annotations.summary }}<br> 觸發時間: {{ .StartsAt.Format "2006-01-02 15:04:05" }} <br> =========end==========<br> {{ end }} {{ end }} //配置完成後保存退出便可
[root@docker01 alertmanager-tmpl]# cd [root@docker01 ~]# vim alertmanager.yml global: resolve_timeout: 5m smtp_from: '2567195852@qq.com' smtp_smarthost: 'smtp.qq.com:465' smtp_auth_username: '2567195852@qq.com' smtp_auth_password: 'tdbwcpvewmzgderg' //本身qq郵箱生成的受權碼 smtp_require_tls: false smtp_hello: 'qq.com' templates: //添加此行 - '/etc/alertmanager-tmpl/*.tmpl' //添加此行 route: group_by: ['alertname'] group_wait: 5s group_interval: 5s repeat_interval: 5m receiver: 'email' receivers: - name: 'email' email_configs: - to: '{{ template "email.to" }}' //必須和{{ define "email.to" }}2567195852@qq.com{{ end }} 中的對應 html: '{{ template "email.to.html" . }}' //必須和{{ define "email.to.html" }} 中的名字對應 send_resolved: true inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance'] //配置完成後保存退出便可 [root@docker01 ~]# docker rm -f alertmanger //刪除此容器 [root@docker01 ~]# docker run -d --name alertmanger -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml -v /root/prometheus/alertmanager-tmpl:/etc/alertmanager-tmpl --restart=always prom/alertmanager //運行一個新的容器
至此,新的報警模板也生成了,若是如下容器有Down的,就會給你發送新的郵件,恢復正常後,也會發送郵件,一樣,郵件中的內容格式是有誤的,可是你能夠正常接收到報警信息!