java项目实现钉钉异常告警实时监控

最近有个小伙伴问我,我们的项目核心业务的地方总是有异常,虽然有打印日志,但不能立马通知我;所以今天我就教大家如何实现异常报警实时提醒

1.需要有钉钉

自己新建的企业用户

2.建一个群,需要有三人以上;点击机器人



3.自定义机器人里面设置key和秘钥


bash 复制代码
key


3.发送消息的java代码

bash 复制代码
@Slf4j
public class MessageWarningUtils {

    public static void sendMessage(String error, String token, String secretKey) {
        try {
            OapiRobotSendRequest request = new OapiRobotSendRequest();
            OapiRobotSendRequest.Markdown markdown = new OapiRobotSendRequest.Markdown();
            sendMarkdown(request, markdown, error);
            DingTalkClient client = new DefaultDingTalkClient(token + sign(secretKey));
            OapiRobotSendResponse response = client.execute(request);
            if (response != null && response.getErrcode() != 0) {
                throw new CustomException("系统触发钉钉流控!");
            }
        } catch (Exception e) {
            log.error("系统发送钉钉消息失败=", e);
        }
    }

    private static String sign(String dingTalkSecretKey) {
        try {
            Long timestamp = System.currentTimeMillis();
            String stringToSign = timestamp + "\n" + dingTalkSecretKey;
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(new SecretKeySpec(dingTalkSecretKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
            byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8));
            String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
            return "&timestamp=" + timestamp + "&sign=" + sign;
        } catch (Exception e) {
            log.error("系统钉钉消息提醒签名异常=", e);
        }
        return "";
    }


    /**
     * 发送markdown文档格式
     */
    public static void sendMarkdown(OapiRobotSendRequest request, OapiRobotSendRequest.Markdown markdown, String error) {
        request.setMsgtype("markdown");
        markdown.setTitle("平台告警");
        markdown.setText(
                "### @所有人 \n" +
                        "### **异常信息:** " + error + "\n\n"
        );

        OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
        at.setIsAtAll(false);
        List<String> mobiles = new ArrayList<>();
        mobiles.add("所有人");
        at.setAtUserIds(mobiles);
        request.setAt(at);
        request.setMarkdown(markdown);
    }
}

4.获取钉钉的key和签名

建机器人的时候,有截图 key和签名,放在你的项目配置文件里面就可以拿到了

bash 复制代码
@Component
public class DingDingConfig {

    @Resource
    private Environment environment;

    public String getToken() {
        return environment.getProperty("dingding.warning.token");
    }

    public String getSecretKey() {
        return environment.getProperty("dingding.warning.secretKey");
    }

    public String getToken2() {
        return environment.getProperty("dingding.warning2.token");
    }

    public String getSecretKey2() {
        return environment.getProperty("dingding.warning2.secretKey");
    }
}

5.测试异常消息发送

bash 复制代码
@Resource
    private DingDingConfig dingDingConfig;

    public static void main(String[] args) {
        try {
            throw new RuntimeException("我就故意报错");
        }catch (Exception e){
            MessageWarningUtils.sendMessage("应付账单下载异常=" + e, dingDingConfig.getToken(), dingDingConfig.getSecretKey());
        }
    }

dingDingConfig 有可能报错,你重新设置下就好了

6.结果

有问题,请留言讨论

项目发消息的过程中有可能会报IP白名单问题,大家可以去百度的钉钉的相关配置下,设置下就好了

相关推荐
向阳2561 分钟前
SpringBoot+vue前后端分离整合sa-token(无cookie登录态 & 详细的登录流程)
java·vue.js·spring boot·后端·sa-token·springboot·登录流程
巷北夜未央7 分钟前
Python每日一题(14)
开发语言·python·算法
XiaoLeisj18 分钟前
【MyBatis】深入解析 MyBatis XML 开发:增删改查操作和方法命名规范、@Param 重命名参数、XML 返回自增主键方法
xml·java·数据库·spring boot·sql·intellij-idea·mybatis
风象南19 分钟前
SpringBoot实现数据库读写分离的3种方案
java·spring boot·后端
振鹏Dong25 分钟前
策略模式——本质是通过Context类来作为中心控制单元,对不同的策略进行调度分配。
java·策略模式
ChinaRainbowSea34 分钟前
3. RabbitMQ 的(Hello World) 和 RabbitMQ 的(Work Queues)工作队列
java·分布式·后端·rabbitmq·ruby·java-rabbitmq
雾月5535 分钟前
LeetCode 914 卡牌分组
java·开发语言·算法·leetcode·职场和发展
Y.O.U..1 小时前
今日八股——C++
开发语言·c++·面试
melck1 小时前
liunx日志查询常用命令总结
java·服务器·网络
守护者1701 小时前
JAVA学习-练习试用Java实现“实现一个Hadoop程序,使用Hive进行复杂查询和数据筛查”
java·学习