前面四篇博客,分别介绍了 Prometheus、Grafana、SpringBoot埋点、Prometheus集成Consul,本次将介绍 Prometheus怎么实现自动告警,Alertmanager组件,对监控信息实现告警处理,已发送邮件、企业微信等方式通知接收人
1.前三篇博客分别介绍了 Prometheus 、Grafana、与 SpringBoot 集成
下载 AlertManager 组件,下载地址:https://prometheus.io/download/
Prometheus-server负责存取服务监控信息,通过 PromQL 聚合监控信息,通过告警规则,让 Alertmanager 组件处理告警信息,可以已邮件、企业微信、web_hook等方式处理告警信息
2.开始集成
- 1.在prometheus组件下,新建 orderservice_alert_rules.yml 设置告警规则,通过PromQL查询匹配 ------ 服务是否下线,10分钟内服务内部的错误率是否大于20%,内容如下:
groups:
- name: orderservice-alert-rule
rules:
- alert: HttpOrderServiceDown
expr: sum(up{job="orderservice-prometheus"}) == 0
for: 1m
labels:
severity: critical
- alert: ErrorRateHigh
expr: sum(rate(requests_error_total{job="orderservice-prometheus", status="500"}[10m])) / sum(rate(requests_total{job="orderservice-prometheus"}[10m])) > 0.2
for: 1m
labels:
severity: major
annotations:
summary: "High Error Rate detected"
description: "Error Rate is above 2% (current value is: {{ $value }}"
- 2.在 prometheus.yml文件下,引用 orderservice_alert_rules.yml 告警规则配置,并开启 alertmanagers
alerting:
alertmanagers:
- static_configs:
- targets:
# alertmanage default start port 9093
- localhost:9093
rule_files:
- "orderservice_alert_rules.yml"
- 3.在 Alertmanager文件夹的 alertmanager.yml 配置中,添加发送邮件配置
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.qq.com:25'
smtp_from: 'email address'
smtp_auth_username: 'email address'
smtp_auth_password: 'password'
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 1m
repeat_interval: 1m
receiver: 'mail-receiver'
receivers:
- name: 'mail-receiver'
email_configs:
- to: 'email address'
- 4.基于前篇博客的web项目上,添加全局异常拦截器,捕获异常后,发送 metrics 信息
/**
* 全局统一异常处理
* 捕获异常,产生异常时,统一返回错误信息
*/
@ControllerAdvice
public class CustomExceptionHandler {
@Autowired
MeterRegistry registry;
private Counter counter;
@PostConstruct
private void init(){
counter = registry.counter("requests_error_total","status","500");
}
@ResponseBody
@ExceptionHandler(value = Exception.class)
public String handle(Exception e) {
counter.increment();//记录系统出错总数
return "error , message : " + e.getMessage();
}
}
- 5.在 OrderController 中,添加 error 接口,访问该接口时主动触发异常,让全局异常器拦截,并生产 metrics 信息
@RequestMapping("/error")
public String error(){
if(true){
throw new RuntimeException("主动报错");
}
return "controller error";
}
- 6.启动 Consul、Prometheus、Alertmanage、2个服务(网关、order-service)
- 7.测试,验证
我们设置了两个告警规则是:1.服务是否下线,2.10分钟内服务内部的错误率是否大于20%
先测试第二个,先访问正常的接口:order/hello、order/zhuyu,再访问主动抛异常的接口:order/error,然后在 prometheus UI http://localhost:9090/alerts 界面上观察alerts的状态,随着访问 order/error 次数的增加,错误率的升高,order/error,http://localhost:9090/alerts中,ErrorRateHigh的颜色发生了变化,且数字变为 1 active,表示激活了该告警规则,点击可以查看详细信息,我这边的 value 是1,表示错误率已经达到 100%,大于了之前设置的 0.2,因此会触发告警组件,Alertmanager组件接收到告警信息后,会通过配置的处理方式进行处理,现在是已邮件的形式,因此我的邮箱会接收到告警信息
访问 alertmanager 组件的UI界面,也能看到接收了一条告警信息
如果你也是用qq邮箱,请开通 smtp 服务,不知道怎么开通的可以百度下