prometheus本身不支持告警功能,主要通過插件alertmanage來實現告警。AlertManager用於接收Prometheus發送的告警並對於告警進行一系列的處理后發送給指定的用戶。
prometheus觸發一條告警的過程:
prometheus--->觸發閾值--->超出持續時間--->alertmanager--->分組|抑制|靜默--->媒體類型--->郵件|釘釘|微信等。
配置alertmanager
- 安裝alertmanager。https://github.com/prometheus/alertmanager/releases/download/v0.16.2/alertmanager-0.16.2.linux-amd64.tar.gz
- 配置告警信息 vim alertmanager.yml
global: resolve_timeout: 5m smtp_smarthost: 'smtp.163.com:25' smtp_from: 'xxx@163.com' smtp_auth_username: 'xxx@163.com' smtp_auth_password: 'xxxxxx' smtp_require_tls: false route: # route用來設置報警的分發策略 group_by: ['alertname'] # 采用哪個標簽來作為分組依據 group_wait: 10s # 組告警等待時間。也就是告警產生后等待10s,如果有同組告警一起發出 group_interval: 10s # 兩組告警的間隔時間 repeat_interval: 20m # 重復告警的間隔時間,減少相同郵件的發送頻率 receiver: 'default-receiver' # 設置默認接收人 routes: # 可以指定哪些組接手哪些消息 - receiver: 'default-receiver' continue: true group_wait: 10s - receiver: 'fping-receiver' group_wait: 10s match_re: #根據標簽分組,匹配標簽dest=szjf的為fping-receiver組 dest: szjf receivers: - name: 'default-receiver' email_configs: - to: 'xxxxxxxx@qq.com' - name: "fping-receiver" webhook_configs: - url: 'http://127.0.0.1:9095/dingtalk' send_resolved: true
注意:之前報警了但是郵件一直沒有發送出去,# telnet smtp.163.com 25發現也不通,發現是騰訊雲做了限制,需要點擊25端口解封。
啟動alertmanage
# ./amtool check-config alertmanager.yml # 檢查配置
Checking 'alertmanager.yml' SUCCESS
Found:
- global config
- route
- 0 inhibit rules
- 1 receivers
- 0 templates
# ./alertmanager --config.file='alertmanager.yml' # 啟動
web ui查看 : http://alertmanager_ip:9093
配置prometheus與alertmanager通信
# vim prometheus.yml
alerting:
alertmanagers: # 配置alertmanager
- static_configs: - targets: - 127.0.0.1:9093 #alertmanager服務器ip端口 rule_files: # 告警規則文件 - 'rules/*.yml'
配置報警規則rules
# vim rules/node.yml
groups:
- name: test rules: - alert: 內存使用率過高 expr: 100-(node_memory_Buffers_bytes+node_memory_Cached_bytes+node_memory_MemFree_bytes)/node_memory_MemTotal_bytes*100 > 30 for: 1m # 告警持續時間,超過這個時間才會發送給alertmanager labels: severity: warning annotations: summary: "Instance {{ $labels.instance }} 內存使用率過高" description: "{{ $labels.instance }} of job {{$labels.job}}內存使用率超過80%,當前使用率[{{ $value }}]." - alert: cpu使用率過高 expr: 100-avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)*100 > 0 for: 1m labels: severity: warning annotations: summary: "Instance {{ $labels.instance }} cpu使用率過高" description: "{{ $labels.instance }} of job {{$labels.job}}cpu使用率超過80%,當前使用率[{{ $value }}]."
# 盡可能把詳細告警信息寫入summary標簽值,因為告警短信/郵件/釘釘發送的內容使用了summary標簽中的值。
檢查告警規則,重啟prometheus
# ./promtool check rules rules/node.yml
Checking rules/node.yml
SUCCESS: 2 rules found
amtool 管理工具可以查看:
# ./amtool alert --alertmanager.url=http://localhost:9093 Alertname Starts At Summary 內存使用率過高 2019-04-09 13:14:45 CST Instance 192.168.1.12:9100 內存使用率過高
在prometheus界面的alert可以看到告警狀態。
- 綠色表示正常。
- 紅色狀態為 PENDING表示alerts 還沒有發送至 Alertmanager,因為rules里面配置了for: 1m。
- 1分鍾后狀態由 PENDING 變為 FIRING,此時,prometheus才將告警發給alertmanager,在 Alertmanager 中可以看到有一個 alert。
收到郵件:
告警收斂(分組,抑制,靜默)
- 分組(group): 將類似性質的警報合並為單個通知。
group_by: ['alertname'] # 以標簽作為分組依據 group_wait: 10s # 分組報警等待時間 group_interval: 10s # 發送組告警間隔時間 repeat_interval: 1h # 重復告警發送間隔時間
- 抑制(inhibition): 當警報發出后,停止重復發送由此警報引發的其他警報。可以消除冗余告警
inhibit_rules: - source_match: # 當此告警發生,其他的告警被抑制 severity: 'critical' target_match: # 被抑制的對象 severity: 'warning' equal: ['id', 'instance']
- 靜默(silences): 是一種簡單的特定時間靜音的機制。例如:服務器要升級維護可以先設置這個時間段告警靜默。
靜默在alertmanager的web界面silence里面配置,create silence。
配置完成后可以看到
在這期間就收不到報警郵件了。