**前置文章:**[Centos7.6安装Prometheus(普罗米修斯)监控](https://www.xiaoleizhang.com/index.php/archives/10/ "Centos7.6安装Prometheus(普罗米修斯)监控") **环境配置** 相比之前的,这边新增了一个Alertmanager服务器 |服务器|IP地址| | :------------: | :------------: | |Prometheus服务器|10.60.147.101| |被监控服务器|10.60.242.157| |grafana服务器|10.60.15.202| |Alertmanager服务器|10.60.26.191| ------------ ------------ # 一、Alertmanager简介 Alertmanager是一个独立的告警模块,接收Prometheus等客户端发来的警报,之后通过分组、删除重复等处理,并将它们通过路由发送给正确的接收器;告警方式可以按照不同的规则发送给不同的模块负责人,Alertmanager支持Email, Slack,等告警方式, 也可以通过webhook接入钉钉等国内IM工具。 Prometheus的警报分为两个部分。Prometheus服务器中的警报规则将警报发送到Alertmanager。该Alertmanager 然后管理这些警报,包括沉默,抑制,聚集和通过的方法,如电子邮件发出通知,对呼叫通知系统,以及即时通讯平台。 **分组** 分组将类似性质的警报分类为单个通知。当许多系统同时发生故障并且可能同时触发数百到数千个警报时,此功能特别有用。 示例:发生网络分区时,群集中正在运行数十个或数百个服务实例。您有一半的服务实例不再可以访问数据库。Prometheus中的警报规则配置为在每个服务实例无法与数据库通信时为其发送警报。结果,数百个警报被发送到Alertmanager。 作为用户,人们只希望获得一个页面,同时仍然能够准确查看受影响的服务实例。因此,可以将Alertmanager配置为按警报的群集和警报名称分组警报,以便它发送一个紧凑的通知。 警报的分组,分组通知的时间以及这些通知的接收者由配置文件中的路由树配置。 **沉默** 沉默是一种简单的特定时间静音提醒的机制。一种沉默是通过匹配器来配置,就像路由树一样。传入的警报会匹配RE,如果匹配,将不会为此警报发送通知。 在Alertmanager的Web界面中配置沉默。 **抑制** 抑制是指当警报发出后,停止重复发送由此警报引发其他错误的警报的机制。 例如,当警报被触发,通知整个集群不可达,可以配置Alertmanager忽略由该警报触发而产生的所有其他警报,这可以防止通知数百或数千与此问题不相关的其他警报。 抑制机制可以通过Alertmanager的配置文件来配置。 **Alert的三种状态:** 1. pending:警报被激活,但是低于配置的持续时间。这里的持续时间即rule里的FOR字段设置的时间。改状态下不发送报警。 2. firing:警报已被激活,而且超出设置的持续时间。该状态下发送报警。 3. inactive:既不是pending也不是firing的时候状态变为inactive **prometheus触发一条告警的过程:** prometheus--->触发阈值--->超出持续时间--->alertmanager--->分组|抑制|静默--->媒体类型--->邮件|钉钉|微信等。 ![prometheus触发一条告警的过程.png](https://www.xiaoleizhang.com/usr/uploads/2021/11/124821611.png) # 二、安装Alertmanager Alertmanager安装包下载地址:https://prometheus.io/download/#alertmanager ![下载alertmanager.png](https://www.xiaoleizhang.com/usr/uploads/2021/11/2099706880.png) 下载后,上传至Alertmanager服务器 ```shell [root@10-60-26-191 ~]# ll total 24528 -rw-r--r-- 1 root root 25115445 Nov 9 15:36 alertmanager-0.23.0.linux-amd64.tar.gz [root@10-60-26-191 ~]# ``` 然后解压重命名 ```shell tar -zxvf alertmanager-0.23.0.linux-amd64.tar.gz -C /usr/local/ mv /usr/local/alertmanager-0.23.0.linux-amd64 /usr/local/alertmanager ``` 把Alertmanager做成Service ```shell vim /etc/systemd/system/alertmanager.service ``` 内容如下 ```shell [Unit] Description=Alertmanager After=network-online.target [Service] Restart=on-failure ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml [Install] WantedBy=multi-user.target ``` 启动服务以及设置开机自启 ```shell systemctl daemon-reload systemctl start alertmanager systemctl enable alertmanager systemctl status alertmanager ``` 确认端口(9093) ```shell [root@10-60-26-191 ~]# netstat -nltup|grep 9093 tcp6 0 0 :::9093 :::* LISTEN 4053/alertmanager [root@10-60-26-191 ~]# ``` # 三、编辑相关配置文件 ## 1、编辑alertmanager的配置文件 ```shell vim /usr/local/alertmanager/alertmanager.yml ``` 内容如下 ```shell global: #全局配置 resolve_timeout: 5m smtp_smarthost: 'smtp.qq.com:465' #smtp服务器的地址 我这里使用的是qq的 smtp_from: '2047456003@qq.com' #发送邮件使用的邮箱 smtp_auth_username: '2047456003@qq.com' #用于发送邮件时登录邮箱服务器的邮箱地址 smtp_auth_password: 'fvz**********edg' #邮箱授权码 可以在qq邮箱设置中获取 smtp_require_tls: false templates: - '/usr/local/alertmanager/template/default.tmpl' #发送邮件的模板 不需要的话可以不配置的 但是Alertmanager默认模板告警项不直观 且时间是UTC时间查看不方便 route: #默认路由规则 group_by: ['alertname'] group_wait: 30s #组等待同组告警默认等待30s group_interval: 1m #当一个新的告警组被创建时,需要等待'group_wait'后才发送初始通知。这样可以确保在发送等待前能聚合更多具有相同标签的告警,最后合并为一个通知发送 repeat_interval: 5m #告警发送间隔时间 receiver: 'mail' receivers: - name: 'mail' #发送方式 email_configs: #接受方的邮箱 - to: 'Xiaolei_Zhang_@outlook.com' send_resolved: true #是否发送恢复告警 html: '{{ template "default.html" . }}' #模板的配置规则 如果不想配置的这里可以忽略 headers: { Subject: "{{ .GroupLabels.SortedPairs.Values }} [{{ .Status | toUpper }}:{{ .Alerts.Firing | len }}]" } inhibit_rules: #告警抑制规则 - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance'] ``` ## 2、编辑alertmanager的模板文件 ```shell mkdir /usr/local/alertmanager/template vim /usr/local/alertmanager/template/default.tmpl ``` 内容如下 ```shell {{ define "default.html" }} {{- if gt (len .Alerts.Firing) 0 -}} [{{ .Status | toUpper }}:{{ .Alerts.Firing | len }}] {{ range $i, $alert := .Alerts }} 告警节点:{{ index $alert.Labels "instance" }} 告警服务:{{ index $alert.Labels "alertname" }} 报警详情:{{ index $alert.Annotations "summary" }} 开始时间:{{ $alert.StartsAt.Local }} {{ end }} {{ end }} {{- if gt (len .Alerts.Resolved) 0 -}} [{{ .Status | toUpper }}:{{ .Alerts.Resolved | len }}] {{ range $i, $alert := .Alerts }} 恢复节点:{{ index $alert.Labels "instance" }} 恢复服务:{{ index $alert.Labels "alertname" }} 状 态:{{ index $alert.Status }} 开始时间:{{ $alert.StartsAt.Local }} 恢复时间:{{ $alert.EndsAt.Local }} {{ end }} {{ end }} {{- end }} ``` 配置完成后可以使用自带的工具检查下格式 ```shell [root@10-60-26-191 ~]# cd /usr/local/alertmanager/ [root@10-60-26-191 alertmanager]# ./amtool check-config alertmanager.yml Checking 'alertmanager.yml' SUCCESS Found: - global config - route - 1 inhibit rules - 1 receivers - 1 templates SUCCESS [root@10-60-26-191 alertmanager]# ``` 3、重启下alertmanager服务 ```shell systemctl restart alertmanager.service ``` 查看进程是否正常运行 ```shell [root@10-60-26-191 alertmanager]# ps -ef | grep aler root 4318 1 1 14:56 ? 00:00:00 /usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml root 4327 3942 0 14:56 pts/0 00:00:00 grep --color=auto aler [root@10-60-26-191 alertmanager]# ``` ## 3、在prometheus服务器上添加配置 到Prometheus服务器(即10.60.147.101)上编辑Prometheus的配置文件 ```shell vim /usr/local/prometheus/prometheus.yml ``` 内容如下,根据需求自行修改下 ```shell # 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: alertmanagers: - static_configs: - targets: - '10.60.26.191:9093' #alertmanager服务器IP:9093 # - alertmanager:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: - "rules/*_rules.yml" #比之前新增告警规则配置文件 - "rules/*_alerts.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=` to any timeseries scraped from this config. - job_name: "prometheus" # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ["10.60.147.101:9090"] - job_name: 'node1' static_configs: - targets: ['10.60.242.157:9100'] - job_name: "alertmanager" #为alertmanager新增一个job_name static_configs: - targets: ['10.60.26.191:9093'] ``` 改完配置文件后,重启下Prometheus服务 ```shell systemctl restart prometheus.service ``` 配置没问题的话 就可以在prometheus界面看到Alertmanager ![prometheus界面可以看到Alertmanager.png](https://www.xiaoleizhang.com/usr/uploads/2021/11/1815221511.png) ## 4、在prometheus服务器上配置告警规则 分为两个文件: node_alerts.yml这个主要配置告警的阈值和发送的文本 node_rules.yml主要配置告警的规则 创建目录,编辑配置文件 ```shell mkdir /usr/local/prometheus/rules vim /usr/local/prometheus/rules/node_rules.yml ``` node_rules.yml的内容如下 ```shell groups: - name: node_rules rules: - record: instance:node_cpu_usage expr: 100 - avg(irate(node_cpu_seconds_total{mode="idle"}[1m])) by (instance) * 100 labels: metric_type: CPU_monitor - record: instance:node_1m_load expr: node_load1 labels: metric_yepe: load1m_monitor - record: instance:node_mem_usage expr: 100 - (node_memory_MemAvailable_bytes)/(node_memory_MemTotal_bytes) * 100 labels: metric_type: Memory_monitor - record: instance:node_root_partition_predit expr: node_filesystem_free_bytes{device="/dev/vda1", mountpoint="/"}/(1024*1024*1024) labels: metric_type: root_partition_monitor ``` 继续编辑node_alerts.yml ```shell vim /usr/local/prometheus/rules/node_alerts.yml ``` 内容如下 ```shell groups: - name: node_alerts rules: - alert: CPU使用率 expr: instance:node_cpu_usage > 80 for: 1m labels: severity: warning annotations: summary: 主机 {{ $labels.instance }} 的 CPU使用率持续1分钟超出阈值,当前为 {{humanize $value}} % - alert: 系统一分钟负载 expr: instance:node_1m_load > 20 for: 1m labels: severity: warning annotations: summary: 主机 {{ $labels.instance }} 的 1分负载超出阈值,当前为 {{humanize $value}} - alert: 内存使用率 expr: instance:node_mem_usage > 80 for: 1m annotations: summary: 主机 {{ $labels.instance }} 的 内存 使用率持续1分钟超出阈值,当前为 {{humanize $value}} % - alert: 系统盘磁盘使用 expr: instance:node_root_partition_predit < 10 for: 1m annotations: summary: 主机 {{ $labels.instance }} 的 根分区 剩余可用空间只有 {{humanize $value}}GB,,请及时扩容和清理空间!!!!! ``` 配置完成后,再重启一下Prometheus服务。 ```shell systemctl restart prometheus.service ``` 访问prometheus界面即可查看配置的规则 ![prometheus界面查看配置的规则.png](https://www.xiaoleizhang.com/usr/uploads/2021/11/2141970994.png) 同时也可以看告警的状态 ![prometheus界面查看告警.png](https://www.xiaoleizhang.com/usr/uploads/2021/11/1380240901.png) # 四、测试 压测下cpu看下是否可以正常收到告警 stress -c 2 -t 100000 stress是一款压力测试工具,可以用它来对系统CPU,内存,以及磁盘IO生成负载。 常用选项: -c, -cpu N 产生 N 个进程,每个进程都反复不停的计算随机数的平方根 -t, -timeout N 在 N 秒后结束程序 到被监控服务器上,可能需要安装下stress ```shell yum install -y stress ``` 开始对cpu进行压测 ```shell stress -c 2 -t 100000 ``` prometheus查看告警规则已经变为pending状态 证明已经检测到这个告警 ![prometheus查看告警规则已经变为pending状态.png](https://www.xiaoleizhang.com/usr/uploads/2021/11/4108640856.png) 根据配置一分钟会如果没有恢复会变为firing状态 ![prometheus查看告警规则已经变为firing状态.png](https://www.xiaoleizhang.com/usr/uploads/2021/11/982663692.png) 稍等三十秒,即可收到告警邮件 ![Alertmanager告警邮件.png](https://www.xiaoleizhang.com/usr/uploads/2021/11/1166139796.png) 取消压测后,会收到恢复邮件 ![Alertmanager恢复邮件.png](https://www.xiaoleizhang.com/usr/uploads/2021/11/3140381401.png) 最后修改:2022 年 01 月 09 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏