1. 程式人生 > 實用技巧 >promethues + alertmanager 監控centos7.4 主機 systemd 服務 (20201203)

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服務停止了,就不會發送郵件

暫時記錄這麼多…………