首页 > 编程语言 >钉钉通知-java异常告警

钉钉通知-java异常告警

时间:2024-07-07 19:42:03浏览次数:15  
标签:java String 通知 builder private content requestDTO import 告警

效果

 

 

 

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.exceptions.ExceptionUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLEncoder;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@Service
public class DingMsgService {

    @Value("${config.dingtalk.secret}")
    private String dingtalkSecret;

    @Value("${config.dingtalk.webhook}")
    private String dingtalkWebhook;

    public void sendDingTalkMsg(Exception ex, String requestURI) {
        StringBuilder builder = StrUtil.builder();
        builder.append("发生时间:[" + DateUtil.now() + "]\n");
        builder.append("发生环境:[" + SpringUtil.getActiveProfile() + "]\n");
        builder.append("请求地址:[" + requestURI + "]\n");
        builder.append("异常信息:[" + ExceptionUtil.getMessage(ex) + "]\n");
        StackTraceElement[] stackTrace = ex.getStackTrace();
        for (StackTraceElement element : stackTrace) {
            if (!element.getClassName().contains("yunkeji")) {
                continue;
            }
            builder.append(
                    element.getFileName()
                            + "#"
                            + element.getMethodName()
                            + "#"
                            + element.getLineNumber()
                            + "\n");
        }
        String content = builder.toString();
        // 钉钉最大只能发送2000个字符
        if (content.length() >= 1990) {
            content = content.substring(0, 1990);
        }
        DingTalkSendMsgRequestDTO requestDTO = new DingTalkSendMsgRequestDTO();
        requestDTO.setSecret(dingtalkSecret);
        requestDTO.setWebhook(dingtalkWebhook);
        requestDTO.setContent(content);

        // 消息内容
        Map<String, String> contentMap = new HashMap<>();
        contentMap.put("content", requestDTO.getContent());
        // 通知人
        Map<String, Object> atMap = new HashMap<>();
        // 1.是否通知所有人
        atMap.put("isAtAll", true);
        // 2.通知具体人的手机号码列表
        atMap.put("atMobiles", "18683661017");
        Map<String, Object> reqMap = new HashMap<>();
        reqMap.put("msgtype", "text");
        //        JSONObject set =
        //                JSONUtil.createObj()
        //                        .set("title", SpringUtil.getActiveProfile() + "-" + title)
        //                        .set("text", content);

        reqMap.put("text", contentMap);
        reqMap.put("at", atMap);
        requestDTO.setContent(JSONUtil.toJsonStr(reqMap));

        try {
            String secret = requestDTO.getSecret();
            // 获取系统时间戳
            long timestamp = Instant.now().toEpochMilli();
            // 拼接
            String stringToSign = timestamp + "\n" + secret;
            // 使用HmacSHA256算法计算签名
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
            byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
            // 进行Base64 encode 得到最后的sign,可以拼接进url里
            String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
            // 钉钉机器人地址(配置机器人的webhook)
            String dingUrl = requestDTO.getWebhook() + "&timestamp=" + timestamp + "&sign=" + sign;

            String result = HttpUtil.post(dingUrl, requestDTO.getContent());
            log.info("re={}", result);
        } catch (Exception e) {
            log.error("钉钉推送消息出现异常", e);
        }
    }

    @Data
    public static class DingTalkSendMsgRequestDTO {
        private String secret;
        private String webhook;
        private String content;
        private boolean isAtAll;
    }
}

 

标签:java,String,通知,builder,private,content,requestDTO,import,告警
From: https://www.cnblogs.com/xyzxy/p/18288831

相关文章

  • Java计算机毕业设计美容机构管理系统(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着人们生活水平的提高和美容意识的增强,美容行业迎来了前所未有的发展机遇。然而,传统的美容机构管理模式往往存在效率低下、信息孤岛、顾客体验不佳......
  • Java计算机毕业设计酒店管理网站(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展,酒店行业作为旅游产业链中的关键环节,面临着日益激烈的市场竞争和多元化的客户需求。传统的酒店管理模式已难以满足现代顾客对于......
  • Google Java Style Guide深度解读:打造优雅的代码艺术
    在软件工程的世界里,代码不仅仅是实现功能的工具,它也是团队之间沟通的桥梁,是软件质量和可维护性的直接反映。GoogleJavaStyleGuide作为一套广受认可的编码规范,不仅定义了代码的书写规则,更深刻地影响着Java开发者的思维方式和编码习惯。本文将深入解析GoogleJavaStyleGuide......
  • Java日期时间操作工具类:DateTimeUtil
    在Java开发中,处理日期和时间是一个常见的需求,无论是数据库查询、日志记录还是业务逻辑处理,都离不开对日期时间的精确操作。Java自JDK8起引入了新的日期时间API,如java.time包下的LocalDate,LocalTime,LocalDateTime,ZonedDateTime等,这些API相比之前的java.util.Date和java.t......
  • Java String操作工具类:StrUtil
    在日常的Java开发中,字符串(String)是最常用的数据类型之一。无论是数据处理、文本分析还是界面展示,都离不开对字符串的精细操作。然而,尽管Java标准库提供了丰富的字符串处理方法,但在实际项目中,我们常常需要一些更高级、更便捷的字符串操作功能。为此,本文将介绍一个自定义的字符串......
  • 【Java探索之旅】多态:重写、动静态绑定
    文章目录......
  • 【Java探索之旅】初识多态_概念_实现条件
    文章目录......
  • java面向对象
    java面向对象面向对象程序设计OOP(ObjectOrientedProgramming)对象的特征——属性对象的每个属性都有特定的值对象的操作——方法对象:描述客观事物的具体实体类class(自定义数据类型)引用数据类性:一组具有相同属性的对象集合是对象的抽象,对象是类的具体publiccla......
  • Java基础——继承与多态
    Java基础——继承与多态方法重写构造方法不能被重写publicclassFpet{Stringname;inthealth;intlove;publicvoidprint(){System.out.println("宠物的自白:");System.out.println("我的名字是"+this.getName()+"健康度是"+t......
  • Java--阶段练习(汽车租赁)
    阶段练习面向对象的设计过程1.分析需求2.找名词(类,属性)父类:汽车:品牌,车牌,日租金子类:轿车:型号客车:座位数汽车业务类汽车租赁管理类3.动词(方法)汽车类(计算租金)汽车业务类(初始化车信息,提供租赁服务)汽车租赁管理类(入口和系统界面)4.优化设计父子类的关系:汽车类—>......