博文大綱:
1、prometheus簡介
2、Prometheus組成及架構
3、部署prometheus
1)環境準備
2)部署prometheus
3)配置Peometheus監控實現報警html
Prometheus是一套開源的系統監控報警框架。它以給定的時間間隔從已配置的目標收集指標,評估規則表達式,顯示結果,並在發現某些狀況爲真時觸發警報。node
做爲新一代的監控框架,Prometheus具備如下特色 :git
- 強大的多維度數據模型:
(1)時間序列數據經過metric名和鍵值對來區分;
(2)全部的metrics均可以設置任意的多維標籤;
(3)數據模型更隨意,,不須要刻意設置爲以點分隔的字符串;
(4)能夠對數據模型進行聚合、切割和切片操做;
(5)支持雙精度浮點類型,標籤能夠設爲全unicode(統一碼);- 靈活、強大的查詢語句:在同一個查詢語句,能夠對多個 metrics 進行乘法、加法、鏈接、取分數位等操做;
- 易於管理:不依賴於分佈式存儲;
- 使用 pull 模式採集時間序列數據;
- 能夠採用 push gateway 的方式把時間序列數據推送至 Prometheus server 端;
- 能夠經過服務發現或者靜態配置去獲取監控的 targets;
- 有多種可視化圖形界面;
- 易於伸縮。;
Prometheus包含了許多組件,其中許多組件都是可選的,經常使用的組件有:github
- Prometheus Server:用於收集和存儲時間序列數據;
- Client Library:客戶端庫,爲須要監控的服務生成相應的 metrics 並暴露給 Prometheus server;
- Push Gateway:主要用於短時間的 jobs。因爲這類 jobs 存在時間較短,可能在 Prometheus 來 pull 以前就消失了。爲此,此次 jobs 能夠直接向 Prometheus server 端推送它們的 metrics;
- Exporters:用於暴露已有的第三方服務的 metrics 給 Prometheus;
- Alertmanager:從 Prometheus server 端接收到 alerts 後,會進行去除重複數據,分組,並路由到對端的接受方式,發出報警;
…………等等,還有好多,這裏就列出幾個經常使用的組件!
Prometheus官方文檔中的架構圖:web
官方的架構圖中,主要模塊塊包括:Prometheus server, exporters, Pushgateway, PromQL, Alertmanager 以及圖形界面;docker
大體的工做流程是:
(1)Prometheus server 按期從配置好的 jobs 或者 exporters 中拉 metrics,或者接收來自 Pushgateway 發過來的 metrics,或者從其餘的 Prometheus server 中拉 metrics;
(2)Prometheus server 在本地存儲收集到的 metrics,並運行已定義好的 alert.rules,記錄新的時間序列或者向 Alertmanager 推送警報;
(3)Alertmanager 根據配置文件,對接收到的警報進行處理,發出告警;
(4)在圖形界面中,可視化採集數據;vim
注意:上述三臺服務器上必須具有最基本的docker環境,上述環境的docker版本爲18.09.0!瀏覽器
上述環境所需組件的做用以下:服務器
- Prometheus server:普羅米修斯的主服務器(端口:9090);
- NodeEXporter:負責收集Host硬件信息和操做系統信息,(端口:9100);
- cAdvisor:負責收集Host上運行的容器信息(端口:8080);
- Grafana:負責展現普羅米修斯監控界面(3000);
- Alertmanager:用來接收Prometheus發送的報警信息,而且執行設置好的報警方式,報警內容(一樣也是在dockerA主機上部署,端口:9093);
各組件的關係:NodeEXporter、cAdvisor負責收集信息發送給 Prometheus server,在由 Prometheus server交給Grafana進行圖形化的顯示。如需報警,則由prometheus向Alertmanager組件發送信息!微信
實驗環境,爲了簡單起見,關閉防火牆、SELinux,實際環境中需開啓相應的端口!
NodeEXporter主要負責收集Host硬件信息和操做系統信息!
[root@dockerA ~]# 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)($|/)" //使用prom/node-exporter 鏡像建立一個名爲node的容器,用於收集硬件和系統信息; //--net=host表示Prometheus server能夠直接與node-exporter通訊; //並映射9100端口
執行完成後,客戶端使用瀏覽器進行訪問,如圖:
訪問到以上頁面表示node-exporter這個組件安裝成功!
因爲這個NodeEXporter組件須要在三臺docker host主機上,因此以上命令就須要在另外兩臺主機上都執行。執行完成後,自行使用瀏覽器訪問測試!
cAdvisor主要負責收集Host上運行的容器信息!
[root@dockerA ~]# 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這個組件安裝成功!
一樣這個cAdvisor組件也是須要在三臺docker host上所有安裝的!因此以上命令也需在另外兩臺主機上執行,執行完成後,自行測試!
Prometheus是普羅米修斯的主服務器!
在部署Prometheus以前,須要對它的配置文件進行修改,因此首先運行一個Prometheus容器將其配置文件複製到本地,便於進行修改。
[root@dockerA ~]# docker run -d -p 9090:9090 --name prometheus --net=host prom/prometheus //運行一個Prometheus容器是爲了將它的配置文件拿到本地 [root@dockerA ~]# docker cp prometheus:/etc/prometheus/prometheus.yml . //將Prometheus容器中的主配置文件複製到本地 [root@dockerA ~]# vim prometheus.yml //編輯主配置文件 - targets: ['localhost:9090','localhost:8080','localhost:9100','192.168.1.2:8080','192.168.1.2:9100','192.168.1.3:8080','192.168.1.3:9100'] //這項本來是存在的,只需修改便可! //用於指定監控本機的9090、8080、9100這三個端口,另外添加另外兩臺docker主機的8080、9100這兩個端口。 //8080端口運行的是cAdvisor服務 //9100端口運行的是node-exporter服務 //9090端口運行的就是Prometheus服務 [root@dockerA ~]# docker rm prometheus -f //將剛纔運行的容器刪除 prometheus [root@dockerA ~]# docker run -d -p 9090:9090 --name prometheus --net=host -v /root/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus //從新運行一個prometheus容器,將剛纔修改完成的配置文件掛載到容器中
客戶端訪問測試:
grafana主要負責展現普羅米修斯監控界面,給咱們提供良好的圖形化界面!
[root@dockerA ~]# mkdir grafana-storage [root@dockerA ~]# chmod 777 -R grafana-storage //建立一個目錄,賦予777的權限 [root@dockerA ~]# docker run -d -p 3000:3000 --name grafana -v /root/grafana-storage:/var/lib/grafana -e "GF_SECURITY_ADMIN_PASSWORD=123.com" grafana/grafana //「-e」選項表示修改容器內部的環境變量,將admin用戶的密碼更改成123.com;
客戶端訪問測試:
上述配置完成後,咱們就須要配置它以什麼樣的形式來給咱們展現了,能夠自定義,可是很麻煩,我選擇直接去grafana官網尋找現成的模板。如圖:
將grafana官方的模板導入到咱們的grafana容器提供的web頁面中,方法有兩種方式:
在grafana官網選擇本身喜歡的模板,點擊進入,如圖:
下載後,回到本身搭建的grafana容器提供的web頁面中,如圖:
可是仔細看的話,會發現這個模板有些信息都檢測不到,因此這裏就是爲了展現一種方式導入模板的方式。我的建議推薦使用第二種方式!
選擇合適的模板後,記錄其ID號,如圖:
記錄下模板的ID號以後,一樣回到本身搭建的grafana容器提供的web頁面中,如圖:
至此web界面的監控就部署完成了!
Prometheus的報警方式有好幾種,好比:郵箱、微信、釘釘等,本次案例採用郵箱告警的方式。
Alertmanager組件主要是用來接收Prometheus發送的報警信息,而且執行設置好的報警方式,報警內容;
只需在dockerA主機上部署便可!方法以下:
[root@dockerA ~]# docker run -d --name alertmanager -p 9093:9093 prom/alertmanager //隨便運行一個容器,其目的就是將容器中服務的配置文件拿到本地 [root@dockerA ~]# docker cp alertmanager:/etc/alertmanager/alertmanager.yml . //將altermanager服務的yml配置文件拿到本地 [root@dockerA ~]# vim alertmanager.yml //編輯配置文件 global: resolve_timeout: 5m smtp_from: '1454295320@qq.com' #發送者信息 smtp_smarthost: 'smtp.qq.com:465' smtp_auth_username: '1454295320@qq.com' #接收者信息 smtp_auth_password: 'gfuxsudyqyulbaad' #使用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: '1454295320@qq.com' //發送者信息 send_resolved: true //當容器恢復正常時,也會發送一份郵件 inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance'] //配置文件中經常使用須要修改的地方已經作了備註
alertmanager.yml配置文件中一級字段:
- global:全局配置(包括報警解決的超時時間、SMTP相關配置、各類渠道通知的API地址等新消息);
- route:用來設置報警的分發策略;
- receivers:配置告警消息接收者信息;
- inhibit_rules:抑制規則配置,當存在與另外一組匹配的警報時,抑制規則將僅用於一組匹配的;
[root@dockerA ~]# docker rm -f alertmanager //將本來的alertmanager 容器刪除 [root@dockerA ~]# docker run -d --name alertmanager -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager //從新運行alertmanager 容器,並將配置文件掛載到容器中 //建議運行容器以後,使用docker ps | grep alertmanager 確保容器正常運行 //若是配置文件編寫錯誤,那麼這個容器是沒法啓動的
[root@dockerA ~]# 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!"
能夠根據以上配置文件進行修改,若想本身編寫報警規則,能夠參考它的官方文檔,如圖:
[root@dockerA ~]# vim prometheus.yml 8 alerting: 9 alertmanagers: 10 - static_configs: 11 - targets: 12 - 192.168.1.1:9093 //此行將本來的內容更改成alertmanager容器的IP+端口 13 14 # Load rules once and periodically evaluate them according to the global 'evaluat ion_interval'. 15 rule_files: 16 - "/usr/local/prometheus/rules/*.rules" //這一行須要手動添加,指定容器內的路徑 [root@dockerA ~]# docker rm -f prometheus //修改完配置爲文件後,須要將容器刪除,從新運行一臺新的容器 [root@dockerA ~]# 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文件的路徑,
爲防止格式可能會出現錯誤,附上截圖一張,以下:
至此,若是prometheus頁面中的target有異常(好比宕機),那麼就會給你的郵箱發送報警信息。
我手動停掉容器,收到的郵件以下:
爲了追求美觀,咱們採起設置一下報警信息的模板!
[root@dockerA ~]# cd prometheus [root@dockerA prometheus]# mkdir alertmanager-tmpl [root@dockerA prometheus]# cd alertmanager-tmpl/ [root@dockerA prometheus]# vim email.tmpl {{ define "email.from" }}1454295320@qq.com{{ end }} {{ define "email.to" }}1454295320@qq.com{{ end }} {{ 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 "2019-08-04 16:58:15" }} <br> =========end==========<br> {{ end }} {{ end }} [root@dockerA ~]# vim alertmanager.yml global: resolve_timeout: 5m smtp_from: '1454295320@qq.com' smtp_smarthost: 'smtp.qq.com:465' smtp_auth_username: '1454295320@qq.com' smtp_auth_password: 'flnuwdktcbzwffag' 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" }}' //必須和模板中對應 html: '{{ template "email.to.html" . }}' //必須和模板中對應 send_resolved: true inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance'] [root@dockerA ~]# docker rm alertmanager -f //刪除容器 [root@dockerA ~]# docker run -d --name alertmanager -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml -v /root/prometheus/alertmanager-tmpl:/etc/alertmanager-tmpl prom/alertmanager //建立容器本地建立的模板文件 //建立完成後,肯定容器是正常運行
至此,新的報警模板也生成了,若是如下容器有Down的,就會給你發送新的郵件,恢復正常後,也會發送郵件,一樣,郵件中的內容格式是有誤的,可是你能夠正常接收到報警信息,若想要更改其報警模板,能夠參考官方文檔
郵箱收到的報警信息以下:
比本來的效果要好不少!就簡單介紹一下這一個吧,有興趣能夠參考官網的文檔,自行進行編寫!
————————————本文到此結束,感謝閱讀————————————