1.背景
CAT自带一个告警规则,便于对告警有一个宏观的了解。合理、灵活的监控规则可以帮助更快、更精确的发现业务线上故障。
规则解释:
- 监控对象:cat项目下,Type为URL的Transaction,且不按照Name筛选
- 监控指标:该Transaction每分钟的执行次数
- 监控时段:监控规则检测的时段,从00:00~24:00,即每天全天监控
- 监控周期:每分钟执行一次告警监控
- 持续分钟:每次监控,检查最近几分钟的数据,这里是检查最近1分钟的数据
- 告警规则:当Transaction每分钟的执行次数大于1时,命中告警
2.告警通用配置
-
告警服务器配置
只有配置为告警服务器的机器,才会执行告警逻辑;只有配置为发送服务器的机器,才会发送告警。全局系统配置-->服务端配置 对告警服务器增加<property name="alarm-machine" value="true"/>
配置、以及<property name="send-machine" value="true"/>
配置。
说明: id="default"是默认的配置信息,server id="127.0.0.1" 如下的配置是表示本机节点配置覆盖default的配置信息,比如下面的job-machine,alarm-machine,send-machine为true。
-
应用告警配置
说明:
Transaction告警
对Transaction的告警,支持的指标有次数、延时、失败率;监控周期:一分钟
配置说明:
- 项目名:要监控的项目名
- type:被监控transaction的type
- name:被监控transaction的name;如果为All,代表全部name
- 监控指标:次数、延时、失败率
- 告警规则:详情见告警规则部分
-
告警规则
目前CAT的监控规则有五个要素,请按照以下五点要素制定规则:
- 告警时间段。同一项业务指标在每天不同的时段可能有不同的趋势。设定该项,可让CAT在每天不同的时间段执行不同的监控规则。注意:告警时间段,不是监控数据的时间段,只是告警从这一刻开始进行检查数据
- 规则组合。在一个时间段中,可能指标触发了多个监控规则中的一个规则就要发出警报,也有可能指标要同时触发了多个监控规则才需要发出警报。这种关系好比电路图中的并联和串联。规则的组合合理有助于提高监控的准确度
- 监控规则类型。通过以下六种类型对指标进行监控:最大值、最小值、波动上升百分比、波动下降百分比、总和最大值、总和最小值
- 监控最近分钟数。设定时间后(单位为分钟),当指标在设定的最近的时间长度内连续触发了监控规则,才会发出警报。比如最近分钟数为3,表明连续三分钟的数组都满足条件才告警。如果分钟数为1,表示最近的一分钟满足条件就告警
- 规则与被监控指标的匹配。监控规则可以按照名称、正则表达式与监控的对象(指标)进行匹配
告警时间
- 告警时间段,08:00 - 20:00,是指告警从08:00开始进行数据检查,直到20:00
- 检查的数据是根据告警时间段和下面设置的“监控最近分钟数”来决定的
- 如果只想进行边界告警(即只判断最近的变化情况),而不是水平告警(不关心最近的几分钟时间区间内的变化趋势),可以直接设置“监控最近分钟数”为1,即为判断最后一分钟数据的情况
- 如果对告警时间精度要求较高的业务方,可以参考进行斟酌
监控条件与子条件:
一个告警规则由多个监控条件组成。一个规则下的多个监控条件为并联关系,当一个监控条件被触发,整个规则就被触发。
监控条件中的持续分钟数表示该条件的持续时间。设定时间单位为分钟。当指标在设定的时间长度内连续触发了该条规则,才会触发该监控条件。
监控条件由子条件组成。一个condition下的多个子条件为串联关系,只有当一个监控条件下的全部子条件被触发,该监控条件才被触发。
-
告警策略
告警策略:配置某种告警类型、某个项目、某个错误级别,对应的告警发送渠道,以及暂停时间。
举例:下述配置示例,说明对于Transaction告警
-
当告警级别为error时,发送渠道为邮件、短信、微信,连续告警之间的间隔为5分钟
-
当告警级别为warning时,发送渠道为邮件、微信,连续告警之间的间隔为5分钟
-
配置说明:
- type:告警的类型,可选:Transaction、Event、Business、Heartbeat
- group id属性:group可以为default,代表默认,即所有项目;也可以为项目名,代表某个项目的策略,此时default策略不会生效
- level id属性:错误级别,分为warning代表警告、error代表错误
- level send属性:告警渠道,分为mail-邮箱、weixin-微信、sms-短信
- level suspendMinute属性:连续告警的暂停时间
告警接收人
告警接收人,为告警所属项目的联系人:
- 项目组邮件:项目负责人邮件,或项目组产品线邮件,多个邮箱由英文逗号分割,不要留有空格;作为发送告警邮件、微信的依据
- 项目组号码:项目负责人手机号;多个号码由英文逗号分隔,不要留有空格;作为发送告警短信的依据。
发送邮件
说明:url为发送邮件的controller,示例代码如下:
package com.gdie.cat.rest;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.Map;
@RestController
public class EmailController {
private static final Logger log = LoggerFactory.getLogger(EmailController.class);
@PostMapping(value = "/sendEmail")
public void sendEmail(HttpServletRequest request, HttpServletResponse response) throws Exception {
Map<String, String[]> parameterMap = request.getParameterMap();
for (Object o:parameterMap.keySet() ) {
System.out.println(o+":" +parameterMap.get(o)[0].toString());
}
try {
HtmlEmail email = new HtmlEmail();
email.setHostName("smtp.139.com");
email.setCharset("utf-8");
email.addTo(parameterMap.get("to")[0]);
email.setFrom("你的邮箱");
email.setAuthentication("你的邮箱","邮箱密码");
email.setSubject(parameterMap.get("value")[0].substring(0,16));
email.setMsg(parameterMap.get("value")[0]);
email.send();
} catch (EmailException e) {
e.printStackTrace();
}
response.setStatus(200);
PrintWriter pw = response.getWriter();
pw.write("200");
pw.flush();
pw.close();
}
}
需要导入的邮件发送maven依赖如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.5</version>
</dependency>
如上配置,如果超过10次访问该项目就会触发告警机制。