怎么实现钉钉告警的功能?

时间:2022-12-26 08:50:59


                           怎么实现钉钉告警的功能?



一,【前言】


     作为架构组成员之一,为了更好的维护集团几十个系统,做了一个日志搜集告警系统---"统一告警平台"; 可以设置方式在规定时间错误次数达到多少就提醒相关的人.

       需求: 事项告警通知.  

           怎么实现钉钉告警的功能?


二,【详情】


实现方式: 有短信, 钉钉,邮件等等.

再三思考: 短信是要收费的, 邮件不是很及时用的通信工具, 所以考虑先用钉钉进行告警通知.



先目睹为空一下,最终显示展示:

                             怎么实现钉钉告警的功能?


实体类  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进行后台系统日志的一个搜集工作, 最后将这个告警提示给相关的人和 交流群.
    这个通知群的话是通过钉钉机器人来实现的, 那么什么是钉钉机器人呢?请期待下一博文.

   下阶段进阶目标: 实现可以 @ 某人, 这样会更加的高效.


       

                          怎么实现钉钉告警的功能?