promethues + alertmanager 監控centos7.4 主機 systemd 服務 (20201203)
注: 個人學習記錄
官網:https://prometheus.io/
下載地址:https://prometheus.io/download/
文件:https://prometheus.io/docs/introduction/overview/
環境:
192.168.11.153 Prometheus +alertmanager # prometheus服務端和報警
192.168.11.114 node-export # 被監控主機
安裝prometheus服務端
1. 在192.168.11.153安裝prometheus服務端
[root@jenkins soft]# wget https://github.com/prometheus/prometheus/releases/download/v2.23.0/prometheus-2.23.0.linux-amd64.tar.gz # 下載軟體 [root@jenkins soft]# tar -xf prometheus-2.23.0.linux-amd64.tar.gz # 解壓縮 [root@jenkins soft]# mv prometheus-2.23.0.linux-amd64 /usr/local/prometheus/ # 移動到/usr/local/下叫prometheus目錄
2. 檢視配置檔案等
[root@jenkins soft]# cd /usr/local/prometheus/ # 進入prometheus目錄
# prometheus: 可執行程式,GO語言編寫,已經打包好的,可以直接執行
# prometheus.yml: prometheus配置檔案
# promtool: promethues檢查工具
# 此配置檔案是經過修改過後的配置檔案,添加了規則檔案存放路徑和檔案動態發現node配置,註釋了靜態發現。配置了於aletermanger的連線。
[root@jenkins prometheus]# 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: # alertmanager配置檔案 alertmanagers: - static_configs: - targets: # 地址 - 127.0.0.1:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # 建立告警規則存放檔案 - "rules/*.yml" # - "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'] - job_name: 'test_cluster' # 建立一個job file_sd_configs: # 此job基於檔案動態新增node - files: ['/usr/local/prometheus/sd_config/*.yml'] # 動態新增node的檔案路徑 refresh_interval: 5s #- job_name: 'test_docker' # static_configs: # 靜態新增node # - targets: ['192.168.11.114:9100'] # labels: # name: docker
3. 將Prometheus新增進systemd進行管理
[root@jenkins prometheus]# cat /usr/lib/systemd/system/prometheus.service [Unit] Description=prometheus.service [Service] ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml # 啟動指定配置檔案 Restart=on-failure [Install] WantedBy=multi-user.target
4. 啟動prometheus
[root@jenkins prometheus]# systemctl start prometheus [root@jenkins prometheus]# ss -antulp | grep :9090 tcp LISTEN 0 128 :::9090 :::* users:(("prometheus",pid=2249,fd=9))
5. 瀏覽器訪問prometheus
http://192.168.11.153:9090/
# 可以在這個介面使用promeSQL檢視監控的資料,後面再說。
#Status------->Service Discovery 檢視發現的被監控端的機器
# Status------->Targets 檢視被監控的機器的狀態
# Status------->Rules 檢視配置的告警規則
# Status------->Configuration 檢視prometheus的配置檔案
# Graph 可以編輯promeSQL,檢視收集到的資料,可以做sql除錯,也可以用圖形化展示;不過圖形化展示建議配合grafna做。
# Alerts 可以檢視告警的狀態
# 至此,Prometheus服務端安裝完畢,會自動監控自己本身。
# 安裝node-export,Prometheus資料採集有不同的採集工具,export是官方給出的採集node資料的工具,另外官方網站還給出了很多基於服務的採集工具,例如:consul_export、mysql_export等等
1. 在192.168.11.114上安裝node_export
[root@localhost soft]# wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz # 下載 [root@localhost soft]# tar -xf node_exporter-1.0.1.linux-amd64.tar.gz # 解壓 [root@localhost soft]# mv node_exporter-1.0.1.linux-amd64/ /usr/local/node_exporter/ # 移動到/usr/local/下
2. 檢視目錄檔案
# node_export 可執行檔案,可以直接啟動
# node_export --help 可以檢視更多關於node_export的用法,比如開啟某個資料採集,有些是預設禁用了的
3. 將node_export配置到systemd進行管理,我們將監控sshd,nginx,docker服務,所以開啟systemd的資料採集,預設是關閉的狀態
[root@localhost node_exporter]# cat /usr/lib/systemd/system/node_exporter.service [Unit] Description=prometheus.node1 [Service] ExecStart=/usr/local/node_exporter/node_exporter --collector.systemd --collector.systemd.unit-whitelist=(nginx|docker|sshd).service # 開啟systemd的資料採集,以及新增監控的白名單,支援正則表示式 Restart=on-failure [Install] WantedBy=multi-user.target
4. 啟動服務
[root@localhost ~]# systemctl start node_exporter.service [root@localhost ~]# ss -antulp | grep :9100 tcp LISTEN 0 128 :::9100 :::* users:(("node_exporter",pid=1745,fd=3))
# 可以通過http://192.168.11.114:9100/metrics 檢視監控到的資料資訊
# 至此,被監控端node_expor安裝完成
# prometheus配置檔案配置檔案服務發現或者靜態,本次配置的檔案發現node主機。
1. 修改prometheus配置檔案
# 在prometheus.yaml中新增 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'] - job_name: 'test_cluster' # 建立一個job file_sd_configs: # 此job基於檔案動態新增node - files: ['/usr/local/prometheus/sd_config/*.yml'] # 動態新增node的檔案路徑 refresh_interval: 5s # 隔 5s檢查一次檔案是否有新增或刪除
2.檢查prometheus配置檔案是否有錯誤
[root@jenkins prometheus]# ./promtool check config prometheus.yml
3. 根據prometheus配置檔案中配置的檔案發現路徑建立檔案,上面配置的*.yml是因為支援萬用字元
[root@jenkins prometheus]# cat /usr/local/prometheus/sd_config/node.yml - targets: ['192.168.11.114:9100'] #labels: # 可以設定標籤 # name: docker - targets: ['192.168.11.153:9090'] #labels: # name: prometheus
3. 沒有錯誤可重新載入配置檔案,也可以重啟prometheus
[root@jenkins prometheus]# ps -aux | grep prometheus root 2249 0.1 3.5 1051844 66460 ? Ssl 10:36 0:36 /usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml root 2865 0.0 0.0 112824 984 pts/0 S+ 15:55 0:00 grep --color=auto prometheus [root@jenkins prometheus]# kill -hup 2249 # kill -hup 加上PID
4. 在prometheus的web頁面Status----->Service Discovery檢視是否發現了192.168.11.114:9100的node
5. 在Status----->Targets可以檢視當前發現的node狀態是否是正常的,up為正常
# 還可以更具上面Endpoint的連線,檢視收集的資料
6. 在Prometheus上利用sql檢視node的CPU的資料
CPU使用率:
# irate 平均
100-irate(node_cpu_seconds_total{name="docker",mode="idle"}[5m])*100
記憶體使用率:
100-(node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes)/node_memory_MemTotal_bytes*100
/分割槽磁碟使用率:
100-(node_filesystem_free_bytes{mountpoint="/",fstype=~"ext4|xfs"}/node_filesystem_size_bytes{mountpoint="/",fstype=~"ext4|xfs"}*100)
# 能檢視到資料,證明11.114的資料是採集成功了的,也可用旁邊的Graph用圖形來展示,當然promtheus的圖形展示能裡比較弱,建議使用grafna配合使用,監控主機基礎資訊,可以使用Grafna的模板ID為:9276模板
# 安裝alertmanager,實現郵件報警
1. 安裝alertmanager,修改alertmanager配置檔案,啟動。
2. 在prometheus配置檔案中,配置alertmanager和prometheus通訊。
3. 在prometheus配置檔案中建立告警規則。
1. 在192.168.11.153機器上部署alertmanager
[root@jenkins soft]# wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz [root@jenkins soft]# tar -xf alertmanager-0.21.0.linux-amd64.tar.gz [root@jenkins soft]# mv alertmanager-0.21.0.linux-amd64 /usr/local/alertmanager/
# alertmanager 程式打包好的啟動檔案
#alertmanager.yml 配置檔案
# amtool 檢查工具
# 加入systemd管理
[root@jenkins alertmanager]# cat /usr/lib/systemd/system/alertmanager.service [Unit] Description=alertmanager.service [Service] ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml Restart=on-failure [Install] WantedBy=multi-user.target
啟動
[root@jenkins ~]# systemctl start alertmanager.service [root@jenkins ~]# ss -antulp | grep aler udp UNCONN 0 0 :::9094 :::* users:(("alertmanager",pid=2282,fd=7)) tcp LISTEN 0 128 :::9093 :::* users:(("alertmanager",pid=2282,fd=8)) tcp LISTEN 0 128 :::9094 :::* users:(("alertmanager",pid=2282,fd=3))
2. 在prometheus配置檔案中,配置alertmanager和prometheus通訊。
[root@jenkins ~]# cd /usr/local/prometheus/ [root@jenkins prometheus]# vim prometheus.yml # Alertmanager configuration alerting: # alertmanager配置檔案 alertmanagers: - static_configs: - targets: # 地址 - 127.0.0.1:9093
3. 在prometheus配置檔案中建立告警規則。
[root@jenkins ~]# cd /usr/local/prometheus/ [root@jenkins prometheus]# vim prometheus.yml # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # 建立告警規則存放檔案 - "rules/*.yml" # - "first_rules.yml" # - "second_rules.yml" [root@jenkins prometheus]# mkdir rules/ [root@jenkins prometheus]# cd rules/ [root@jenkins rules]# cat systemd.yml groups: - name: docker rules: - alert: docker_systemd_down # 告警聚合的名稱依據 expr: node_systemd_unit_state{name="docker.service", state="inactive", type="notify"} == 1 for: 1m labels: severity: 災難 # 告警級別 annotations: summary: "Instance {{ $labels.name }} 停止工作" description: "{{ $labels.instance }}的{{ $labels.name }} 已經停止1分鐘以上" - alert: sshd_systemd_down expr: node_systemd_unit_state{name="sshd.service", state="inactive", type="notify"} == 1 for: 1m labels: severity: 災難 annotations: summary: "Instance {{ $labels.name }} 停止工作" description: "{{ $labels.instance }}的{{ $labels.name }} 已經停止1分鐘以上" - alert: nginx_systemd_down expr: node_systemd_unit_state{name="nginx.service", state="inactive", type="notify"} == 1 for: 1m labels: severity: 災難 annotations: summary: "Instance {{ $labels.name }} 停止工作" description: "{{ $labels.instance }}的{{ $labels.name }} 已經停止1分鐘以上"
配置altermanager配置檔案
global: # 全域性的配置 resolve_timeout: 5m # 解析的超時時間 smtp_smarthost: 'smtp.qq.com:465' smtp_from: '[email protected]' smtp_auth_username: '[email protected]' smtp_auth_password: 'fyevrip5jesahai' smtp_require_tls: false route: # 將告警具體怎麼傳送 group_by: ['alertname'] # 根據標籤進行分組 group_wait: 10s # 傳送告警等待時間 group_interval: 10s # 傳送告警郵件的間隔時間 repeat_interval: 1h # 重複的告警傳送時間 receiver: 'email' # 接收者是誰 receivers: # 將告警傳送給誰 - name: 'email' email_configs: - to: '[email protected]' inhibit_rules: # 抑制告警 - source_match: severity: 'critical' # 當收到同一臺機器傳送的critical時候,遮蔽掉warning型別的告警 target_match: severity: 'warning' equal: ['alertname', 'severity', 'instance'] # 根據這些標籤來定義抑制
檢查altermanager和Prometheus的配置檔案,看看是否有報錯,是否有發現規則
[root@jenkins alertmanager]# ./amtool check-config alertmanager.yml Checking 'alertmanager.yml' SUCCESS Found: - global config - route - 1 inhibit rules - 1 receivers - 0 templates [root@jenkins prometheus]# ./promtool check config prometheus.yml Checking prometheus.yml SUCCESS: 2 rule files found Checking rules/rules.yml SUCCESS: 1 rules found Checking rules/systemd.yml SUCCESS: 3 rules found
# 沒有報錯,並且發現了報警規則,可以重啟prometheus和altermanager服務
[root@jenkins prometheus]# systemctl restart prometheus.service alertmanager.service
# 登陸prometheus的web頁面,檢視是否有規則等
# 之後可以測試郵件報警,停掉docker服務
# 停止docker服務後,不會立即傳送報警郵件,可以看到當前的狀態已經是PENDING,這個時候altermanager已經收到prometheus的報告,說docker服務已經掛掉了,等待狀態變為FIRING的時候,才會傳送郵件
# altermanager報警會經過幾個階段:
# 收到告警資訊的時候,會根據我們配置檔案中配置的等待時間,在等待時間內如果恢復了,將不傳送告警郵件;在等待時間內如果有相同類似的告警,將組合到一封郵件中傳送
# altermanager告警有幾個過程,從收到告警後,會內部進行分組,抑制,或者靜默的處理,等待時間過了,告警沒有恢復,才會下發郵件。
# 收到報警郵件
告警收斂(分組、抑制、靜默)
分組:group,將類似性質的警報分類為單個通知
抑制:inhibition,當警報發出後,停止重複傳送由此警報引發的其它報警
靜默:silence,是一種簡單的特定的時間靜音提醒機制
# 靜默可以在altermanager的文字頁面去配置,當維護某個服務的時候,知道要報警,會收到郵件,而又不想收郵件的時候,可以配置靜默
http://192.168.11.153:9093 # 訪問alertmanager的地址
# New Silence建立靜默
# 這樣靜默後,比如docker服務停止了,就不會發送郵件
暫時記錄這麼多…………