捕获全局异常推送至钉钉群

场景描述

在现有异常捕获的基础上加入异常捕获并推送钉钉群机器人,因为我们项目中使用的全局异常捕获是组件提供的包,所以我们不能自定义全局异常处理类,因为会覆盖掉组件包中的异常处理逻辑(这部分视公司使用特性而定,可能包含AJAX请求、Zipkin链路日志处理)。所以我们要使用java语言类的继承特性,继承组件包,重写日志捕获方法,调用父类包中的日志处理逻辑,加上我们自己的扩展,以此完成该功能。

本项目中异常处理器

/**
 * @Author: zhangdc
 * @Date: 2021/5/27 18:30
 */
@Component
public class GlobalExceptionHandler extends 组件全局异常处理器 {

    @Autowired
    private DingTalkTool dingTalkTool;

    //是否启用环境配置
    @Value("${xxx.xxx.dingTalkEnable}")
    private Boolean dingTalkIsEnable;

    @Override
    protected ModelAndView doResolveHandlerMethodException(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, Exception e) {
        //调用父类的默认处理逻辑
        ModelAndView modelAndView = super.doResolveHandlerMethodException(request, response, handlerMethod, e);
        //加上我们自己的扩展
        //是否启用钉钉群机器人异常推送
        if (Boolean.TRUE.equals(dingTalkIsEnable)) {
            try {
                //推送钉钉机器人通知
                dingTalkTool.sendDingTalkMsg();
            } catch (ApiException apiException) {
                apiException.printStackTrace();
            }
        }
        return modelAndView;
    }

}

dingTalk工具

/**
 * @Author: zhangdc
 * @Date: 2021/5/26 15:30
 */
@Component
@Slf4j
public class DingTalkTool {

    //zipkinURL
    @Value("${xxx.xxx.zipkinURL}")
    private String zipkinURL;

    //Webhook
    @Value("${xxx.xxx.dingTalkWebhook}")
    private String dingTalkWebhook;

    //阿波罗配置信息获取
    private static final ConfigUtil CONFIG = ApolloInjector.getInstance(ConfigUtil.class);

    private static final String DATEFORMAT = "yyyy-MM-dd HH:mm:ss";

    private static final String MSGTYPE = "markdown";

    private static final String TITLE = "监控报警通知";

    public void sendDingTalkMsg() throws ApiException {

        //url为钉钉机器人webHook地址
        DefaultDingTalkClient client = new DefaultDingTalkClient(dingTalkWebhook);
        //构建钉钉消息
        OapiRobotSendRequest request = buildMeaages();
        //发送请求到钉钉
        OapiRobotSendResponse response = client.execute(request);
        log.info("=====================钉钉机器人发送消息{}", response.getErrcode());

    }

    private OapiRobotSendRequest buildMeaages() {
        OapiRobotSendRequest request = new OapiRobotSendRequest();
        //通过阿波罗获取环境信息
        Env env = CONFIG.getApolloEnv();
        //获取链路
        String traceId = ZipkinUtils.getTraceId(null);
        //获取当前线程用户信息
        UserInfoEntity userInfo = LoginDataHelper.getUserInfo();
        //获取当前请求对象
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest req = attributes.getRequest();

        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat(DATEFORMAT);

        request.setMsgtype(MSGTYPE);
        //初始化发送的markdown信息
        OapiRobotSendRequest.Markdown markdown = new OapiRobotSendRequest.Markdown();
        markdown.setTitle(TITLE);
        markdown.setText("## 监控报警通知\n" +
                "\n" +
                "> 环境:\n" + env + "\n" +
                "\n" +
                "> 请求方式:\n" + req.getMethod() + "\n" +
                "\n" +
                "> 请求地址:\n" + req.getRequestURI() + "\n" +
                "\n" +
                "> 操作人:" + userInfo.getPersonName() + "\n" +
                "\n" +
                "> email:\n" + userInfo.getEmail() + "\n" +
                "\n" +
                "> 异常时间:\n" + sdf.format(date) + "\n" +
                "\n" +
                "> zipkinURL:\n" + zipkinURL + traceId);
        request.setMarkdown(markdown);
        return request;
    }
}

至此我们已经实现了将异常信息推送至钉钉群的功能,并且包含了开关、多环境的切换,可配置化增强。

以下是钉钉机器人截图:
在这里插入图片描述

在C#中,要将文本推送钉钉群,你可以利用钉钉的官方API或者第三方库,如DingTalk.NET。首先,你需要注册一个钉钉开发者账号并获取应用的access_token和app_key。以下是基本步骤: 1. **安装依赖**: - 在你的项目中安装`钉钉.NET SDK`,可以使用NuGet包管理器添加 `钉钉.DingTalk`。 ```shell Install-Package DingTalk.DingTalk ``` 2. **配置API凭证**: - 将你的`access_token`和`app_key`保存起来,通常会存储在应用程序设置或者配置文件中,作为安全策略,不应直接硬编码在代码中。 3. **创建实例并发送消息**: ```csharp using DingTalkGroup = DingTalkGroup.Model; using DingTalkClient = DingTalkGroup.Client; // 初始化钉钉客户端 var accessToken = "your_access_token"; var appKey = "your_app_key"; var client = new DingTalkClient(accessToken, appKey); // 创建群组信息 var groupId = "your_group_id"; // 群聊ID var content = "你要推送的文字内容"; // 构建消息对象 var dingTalkMessage = new DingTalkGroup.TextMessage { Text = content, ToUserIds = new[] { groupId }, AtAll = false }; // 发送消息 try { var response = await client.Message.SendAsync(dingTalkMessage); if (response.IsSuccess) { Console.WriteLine("消息已成功发送到钉钉群"); } else { Console.WriteLine($"推送失败: {response.ErrorCode} - {response.ErrorMsg}"); } } catch (Exception ex) { Console.WriteLine($"推送异常: {ex.Message}"); } ``` 4. **处理错误**: - 推送过程中可能会遇到网络问题、认证失效等问题,需要适当地捕获异常并处理。 记得在实际操作前检查官方文档,因为API细节可能会有所变动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值