怎么实现钉钉告警的功能?
一,【前言】
作为架构组成员之一,为了更好的维护集团几十个系统,做了一个日志搜集告警系统---"统一告警平台"; 可以设置方式在规定时间错误次数达到多少就提醒相关的人.
需求: 事项告警通知.
二,【详情】
实现方式: 有短信, 钉钉,邮件等等.
再三思考: 短信是要收费的, 邮件不是很及时用的通信工具, 所以考虑先用钉钉进行告警通知.
先目睹为空一下,最终显示展示:
实体类 AlarmMsgEntity---用于获取相关的参数:
package com.hwl.ulap.domain.model.alarm;import com.hwl.ulap.domain.model.alarm.type.WarnType;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import lombok.extern.log4j.Log4j2;import java.io.Serializable;@Log4j2@Data@NoArgsConstructor@AllArgsConstructorpublic class AlarmMsgEntity implements Serializable { //startTimeprivate Long id; private Integer sum; private String projectName; private Integer alarmType; private WarnType type; private Integer category; private Long alarmTime; private Integer status; private Integer retryTimes; private String receiveGroup; private String receiveGroupName; private String created;}
具体的Service实现代码展示:
package com.hwl.ulap.domain.model.alarm;import com.hwl.common.DateUtil;import com.hwl.ulap.domain.model.alarm.type.AlarmLevelType;import lombok.extern.log4j.Log4j2;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.HttpClients;import org.apache.http.util.EntityUtils;import org.springframework.stereotype.Service;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController;import java.io.IOException;import java.util.Date;@Service@Log4j2@RestController@RequestMapping("/alarm/service")public class AlarmMsgService { //发送具体内容 public static final String msg_template = "{ \"msgtype\": \"text\", \"text\": {\"content\": \"告警信息:%s;\n %s-系统项目;\n 错误数量:%s;\n 出错时间:%s,\n 请尽快排查处理!\" }}"; private HttpClient httpclient = HttpClients.createDefault(); //定义是否要发送开关 private boolean openAlarm = true; //发送业务逻辑, 发送三次失败后重发 并记录日志 public void sendSMS(AlarmMsgEntity entity) { if (openAlarm) { boolean isok = sendMsg(entity); if (!isok) { for (int i = entity.getRetryTimes(); i < 3; entity.setRetryTimes(entity.getRetryTimes() + 1)) { if (sendMsg(entity)) { break; } } } else { log.info("<=sendSMS=>ok"); } } else { log.info("<=sendSMS=>openAlarm is false."); } } //发送内容获取其中参数 private String createMsgContext(AlarmMsgEntity alarmMsg) { return String.format(msg_template, AlarmLevelType.valueOf(alarmMsg.getAlarmType()).getName(), alarmMsg.getProjectName(), alarmMsg.getSum(), DateUtil.format(new Date(alarmMsg.getAlarmTime()))); } //发送告警通知 private boolean sendMsg(AlarmMsgEntity entity) { String msgValue = createMsgContext(entity); HttpPost httppost = new HttpPost(entity.getReceiveGroup()); httppost.addHeader("Content-Type", "application/json; charset=utf-8"); httppost.setEntity(new StringEntity(msgValue, "utf-8")); log.info("=sendSMS=>msg=" + msgValue); HttpResponse response = null; try { response = httpclient.execute(httppost); String result = EntityUtils.toString(response.getEntity(), "utf-8"); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { log.info("<=sendSMS=>send ok ,msg=" + result); } else { log.error("<=sendSMS=>send error ,status={} ,msg=" + result, response.getStatusLine().getStatusCode()); } } catch (IOException e) { log.error("<=sendSMS=>error:", e); return false; } return true; } @RequestMapping(value = "/getOpenAlarm", method = {RequestMethod.GET, RequestMethod.POST}) public String getOpenAlarm() { return "Current OpenAlarm is :"+openAlarm; } @RequestMapping(value = "/setOpenAlarm/{openAlarm}", method = {RequestMethod.GET, RequestMethod.POST}) public String setOpenAlarm(@PathVariable boolean openAlarm) { this.openAlarm = openAlarm; return "Current OpenAlarm is :"+openAlarm; }}
三,【小结】
博客是用文字来整理生命的工具!
这个告警功能提示是最后的一个现实, 前面还要用SpringBoot框架, ES, flume和ZK进行后台系统日志的一个搜集工作, 最后将这个告警提示给相关的人和 交流群.
这个通知群的话是通过钉钉机器人来实现的, 那么什么是钉钉机器人呢?请期待下一博文.
下阶段进阶目标: 实现可以 @ 某人, 这样会更加的高效.