钉钉机器人报警设置

news2024/12/23 22:33:37

钉钉机器人报警设置

1. 钉钉机器人相关设置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kMcD3TbA-1670856713399)(C:\Users\maido\AppData\Roaming\Typora\typora-user-images\image-20221212223824730.png)]

2. 添加机器人

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R8PLHOhD-1670856713401)(C:\Users\maido\AppData\Roaming\Typora\typora-user-images\image-20221212224028100.png)]

3. 选择自定义机器人

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-My0CyJOP-1670856713404)(C:\Users\maido\AppData\Roaming\Typora\typora-user-images\image-20221212224147798.png)]

4. 选择一个安全标签

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WxgwCe3k-1670856713405)(C:\Users\maido\AppData\Roaming\Typora\typora-user-images\image-20221212224209899.png)]

5. 添加完生成一个webhook

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6NWyeS8E-1670856713407)(C:\Users\maido\AppData\Roaming\Typora\typora-user-images\image-20221212224250346.png)]

参考文档

6. java 代码

package com.cjpension.ppmshttpbaffle.aspect;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.net.NetUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @ClassName ExceptionLogAspect
 * @Description TODO
 * @Author maido
 * @Date 21:11 2022/12/12
 * @Version 1.0
 **/
@Slf4j
@Aspect
@Configuration
@Profile(value = {"dev", "test"})
public class ExceptionLogAspect {

    @Value("${spring.application.name}")
    private String appName;

    @Value("${spring.profiles.active}")
    private String profile;

    private static AtomicInteger indexAtomic = new AtomicInteger(0);

    public static List devList = new ArrayList<>();


    static {
        devList.add("2d5a9cdcf81fcee5217fc1f2e54fa195e49be806890dccff11c2adf80be624a1");
        devList.add("f8350591d9375c7d59327c9847d2dbd6f57b49f56ce29b5ba55fff9aa399cb7a");
        devList.add("c7ba03a7c91e28b6939b85c1d7a1df5fa710fd2050e0cdd9a59fa5553598e124");
        devList.add("12b3e0cde929b61a18dba4cba42a3a7faaeaf5100d3d12990f767e8a1912487e");
        devList.add("fb78ad45cc0eccdab32bfce839abac2020fd61e6837f28690ab6ca5494db1a5a");
        devList.add("33828b1bd0602eddadcc91c4e01d063777812a410d52c3df6a5a2c07b214299f");
        devList.add("0b44dc7e46b2c80cc84c5d49be75b9a9c1642bc1b73a9d144ce6ce6c176e2310");
        devList.add("5785eafe2cfbf3065bc3c0f827becacd0245ed520d978189f56beab9248b62e9");
        devList.add("0d0d145ccadee55f5ed4ca0b274c0b1e4d7019a195d284f3531f72b31c10f6c3");
    }

    /**
     * 轮训获取token
     */
    public String getToken() {
        if (indexAtomic.get() >= devList.size()) {
            indexAtomic.set(0);
        }


        return (String) devList.get(indexAtomic.getAndIncrement());
    }

    /**
     * 切入点
     */
    @Pointcut("within(@org.springframework.web.bind.annotation.RestController *) ||" +
            "within(@org.springframework.stereotype.Controller *)")
    public void log() {
    }


    @AfterThrowing(value = "log()", throwing = "e")
    public void sendErrorLog(JoinPoint joinPoint, Exception e) {
        if(isSkip(e)){
            return;
        }
        // 获取推送内容
        String content = buildMsg(e, joinPoint);
        // https://oapi.dingtalk.com/robot/send?access_token=d2b5318b162ddda8b366fc9e786090a7b58b30f8f79e72ea6612b7829a930257
        String result = HttpUtil.post("https://oapi.dingtalk.com/robot/send?access_token=" + getToken(),
                content);
        log.info("error log push to dingding result : {}" ,result);
    }

    /**
     * 是否跳过
     */
    private boolean isSkip(Exception e) {
        List<String> skipList = new ArrayList<>();

        String exceptionName = e.getClass().getName();
        if(skipList.contains(exceptionName)){
            return true;
        }
        return false;
    }


    private String buildMsg(Exception e,JoinPoint joinPoint) {
        StringBuilder sb = new StringBuilder(
                "{ \"msgtype\":\"markdown\",\"markdown\":{\"title\":\"错误日志报警\",\"text\":\"");
        sb.append("<font color=red size=72>错误日志通知</font>").append("\n\n");
        sb.append("时间: ").append(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")).append("\n\n");
        sb.append("项目名称: ").append(appName).append("\n\n");
        sb.append("环境: ").append(profile).append("\n\n");
        sb.append("服务IP: ").append(NetUtil.getLocalhostStr()).append("\n\n");
        sb.append("请求方法名: ").append(joinPoint.getSignature().getDeclaringTypeName()).append(".").append(joinPoint.getSignature().getName()).append("\n\n");
        sb.append("请求参数: ").append(JSONObject.toJSONString(joinPoint.getArgs()).replace("}","")
                .replace("{","").replace("[","").replace("]","")
                .replace("\"","")).append("\n\n");
        sb.append("具体信息: ").append(e.getClass().getName()).append(" ");
        if (e.getStackTrace() != null) {
            StackTraceElement[] stackTraces = e.getStackTrace();
            sb.append(e.getMessage()).append("\n");
            int i = 0;
            for (StackTraceElement stackTrace : stackTraces) {
                //只打印00行的堆栈
                if (i < 20) {
                    sb.append(stackTrace.toString()).append("\n");
                } else {
                    break;
                }
                i++;
            }
        } else {
            sb.append(e.getMessage());
        }
        sb.append("\"},\"at\":{\"atMobiles\":[],\"isAtAll\":false}}");
        return sb.toString();
    }

}

7. 消息类型及数据格式

7.1 text

{
    "at": {
        "atMobiles":[
            "180xxxxxx"
        ],
        "atUserIds":[
            "user123"
        ],
        "isAtAll": false
    },
    "text": {
        "content":"我就是我, @XXX 是不一样的烟火"
    },
    "msgtype":"text"
}
参数参数类型是否必填说明
msgtypeString消息类型,此时固定为:text。
contentString消息内容。
atMobilesArray被@人的手机号。注意 在content里添加@人的手机号,且只有在群内的成员才可被@,非群内成员手机号会被脱敏。
atUserIdsArray被@人的用户userid。注意 在content里添加@人的userid。
isAtAllBoolean是否@所有人。

7.2 link类型

{
    "msgtype": "link", 
    "link": {
        "text": "这个即将发布的新版本,创始人xx称它为红树林。而在此之前,每当面临重大升级,产品经理们都会取一个应景的代号,这一次,为什么是红树林", 
        "title": "时代的火车向前开", 
        "picUrl": "", 
        "messageUrl": "https://www.dingtalk.com/s?__biz=MzA4NjMwMTA2Ng==&mid=2650316842&idx=1&sn=60da3ea2b29f1dcc43a7c8e4a7c97a16&scene=2&srcid=09189AnRJEdIiWVaKltFzNTw&from=timeline&isappinstalled=0&key=&ascene=2&uin=&devicetype=android-23&version=26031933&nettype=WIFI"
    }
}
参数参数类型是否必填说明
msgtypeString消息类型,此时固定为:link。
titleString消息标题。
textString消息内容。如果太长只会部分展示。
messageUrlString点击消息跳转的URL,打开方式如下:移动端,在钉钉客户端内打开PC端默认侧边栏打开希望在外部浏览器打开,请参考消息链接说明
picUrlString图片URL。

image.png

7.3 markdown类型

{
     "msgtype": "markdown",
     "markdown": {
         "title":"杭州天气",
         "text": "#### 杭州天气 @150XXXXXXXX \n > 9度,西北风1级,空气良89,相对温度73%\n > ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"
     },
      "at": {
          "atMobiles": [
              "150XXXXXXXX"
          ],
          "atUserIds": [
              "user123"
          ],
          "isAtAll": false
      }
 }
参数类型是否必填说明
msgtypeString消息类型,此时固定为:markdown。
titleString首屏会话透出的展示内容。
textStringmarkdown格式的消息。
atMobilesArray被@人的手机号。注意 在text内容里要有@人的手机号,只有在群内的成员才可被@,非群内成员手机号会被脱敏。
atUserIdsArray被@人的用户userid。注意 在content里添加@人的userid。
isAtAllBoolean是否@所有人。

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小蓝本 第一本 《因式分解技巧》 第五章 十字相乘 笔记(第五天)

小蓝本 第一本 《因式分解技巧》 第五章 十字相乘 笔记&#xff08;第五天&#xff09;前言十字相乘研究对象类型普通二次三项式基本形式分解步骤注意二次齐次式基本形式分组步骤注意系数和为0的普通二次三项式习题5题目题解前言 今天的干货来了&#xff0c;十字相乘。 十字相…

【JS】事件基础

JavaScript事件基础事件的概述事件三要素常见的事件事件的调用在script标签中调用在元素中调用鼠标事件onclick事件onmouseover和onmouseoutonmousedown和onmouseup页面事件onloadonbeforeunloadthis其他事件事件的概述 事件操作是JavaScript的核心。 用户进行操作时&#xff0…

疫情在家用Python搞副业,也能月入10000+

下班副业实现经济自由的时候&#xff0c;你还在床上躺着&#xff0c;天天摆烂吗&#xff1f;这样的生活真的是你想要的吗&#xff1f; 疫情在家接一些Python相关的小单子&#xff0c;既能给自己练手&#xff0c;还能赚是真香 从零基础开始真的一台电脑和一部手机就可以✅ 一…

NC65 计算人员离退休的天数和日期(数据库 sql server)

最近公司需要人力资源部需要写一张报表&#xff0c;计算人员距离退休的天数和日期&#xff0c;现附上自己写是sql脚本&#xff08;仅供参考&#xff09;&#xff0c;如下&#xff1a; select a.pk_psndoc,--员工信息主键a.code …

程序员快速成长的核心原则

如何快速成长、持续成长、提升技术&#xff0c;是每一个程序员都绕不开的话题。 当你还在困惑职业发展方向时&#xff0c;别人已经找好了接单平台开始兼职&#xff1b;当你还在苦恼bug修不好时&#xff0c;别人已经可以承接整个软件外包项目了&#xff1b;当你还在思考怎么让技…

MongoDB 命令行操作

通过 MongoDB 数据库安装详细教程 安装完成了MongoDB&#xff0c;MySQL数据库是通过sql命令操作数据&#xff0c;而MongoDB是通过类Javascript函数的查询方式进行数据库的操作&#xff0c;在使用MongoDB来操作数据库之前先来简单的了解MongoDB操作注意&#xff1a; MongoDB数据…

使用线性光耦合器的模拟隔离

介绍 模拟隔离仍然广泛应用于电机驱动、功率监测等&#xff0c;其中应用通常使用廉价的模拟电压控制来进行速度、强度或其他调整。 HCNR201/200模拟光耦合器通常被添加到&#xff0c;用于隔离应用电路的前端模块中的模拟信号。光耦合器将放置在模拟输入和A/D转换器之间&#…

C++list

1. list的介绍及使用 1.1 list的介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其…

外包出去找工作被歧视,投几个简历都说介意外包,不考虑外包。

说起外包这个话题&#xff0c;一直是职场的热门话题。 关于外包&#xff0c;最多被人讨论的就是歧视方面的。比如&#xff0c;关于门禁权限方面的歧视、关于语言交流上的歧视、关于福利上的歧视等等。 01 外包被歧视的情况确实存在 网传有一腾讯外包员工在脉脉上吐槽自己遭受…

python--内置高阶函数、异常处理;模块与包以及python基础部分的总结

文章目录一、内置高阶函数二、异常处理异常处理机制抛出异常三、模块与包python基础部分的总结一、sort()与sorted()函数的区别二、深拷贝和浅拷贝、is与四、基础部分的脑图总括一、内置高阶函数 map()函数 reduce()函数 filter()函数 sorted()函数 #排序 二、异常处理 Indent…

java基础巩固-宇宙第一AiYWM:为了维持生计,测试篇预热【单元测试、性能测试、灰度发布与回滚】~整起

单元测试【就像买保险&#xff0c;希望自己不要用上】是重构的保护网&#xff1a;单元测试可以为重构提供信心&#xff0c;降低重构的成本。我们要像重视生产代码那样&#xff0c;重视单元测试【元测试&#xff08;Unit Testing&#xff09;是针对程序模块&#xff08;软件设计…

协同过滤CF

算法提出 如果让推荐系统领域的从业者选出业界影响力最大、应用最广泛的模型&#xff0c;那么笔者认为90%的从业者会首选协同过滤。1992年, Xerox的研究中心开发了一种基于协同过滤的邮件筛选系统&#xff0c;用以过滤一些用户不感兴趣的无用邮件。2003 年&#xff0c;Amazon …

MySQL数据表的基础知识

目录 一、增 二、查 a、全列查询 b、指定列查询 c、查询字段为表达式 d、别名查询 e、对查询结果进行去重 f、排序 ​g、条件查询 三、改 四、删 以下操作均以student表为基础&#xff1a; 一、增 insert into 表名 values(...); 例如&#xff1a;新增张三同学的…

举个栗子!Tableau 技巧(247):用震波图(Seismogram)查看数据变化

震波图&#xff08;Seismogram&#xff09;是一种像地震波或声波的图表&#xff0c;通常用于表达数据的变化。乍一看&#xff0c;它有点像 蝴蝶图&#xff08;旋风图&#xff09;&#xff0c;数据都分布在轴的零点两侧&#xff0c;但其实两者完全不同。 如下震波图&#xff0c…

Stm32旧版库函数6——ov2640 串口显示图像 串口中断 使用旧版库 模拟IIC

/******************************************************************************* // // 使用单片机STM32F100C8T6 8 // 晶振&#xff1a;8.00M // 编译环境 Keil uVision4 // 在3.3V的供电环境下&#xff0c;就能运行 // 波特率 115200 // 使用&#xff1a;STM32F100C…

SpringCloud Config 分布式配置中心

分步式系统面临配置问题&#xff1a; 微服务意味着要将单体应用中的业务拆分成一个个子服务&#xff0c;每个服务的粒度相对较小&#xff0c;因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行&#xff0c;所以一套集中式的、动态的配置管理设施是必不…

浅谈电气火灾监控系统在煤矿高层公寓中的应用分析

摘要&#xff1a; 煤矿高层公寓做为人员高度密集场所&#xff0c;使用的电器种类繁多&#xff0c;一旦发生电气火灾事故&#xff0c; 其严重性和危害性远高于其它场所。文章通过对煤矿公寓电气线路火灾主要形式的分析&#xff0c;对电气火灾监 控系统在煤矿公寓电气火灾预防及…

NLG解码策略

NLG解码策略 自然语言生成&#xff08;Natural Language Generation&#xff0c;简称NLG&#xff09;&#xff0c;是自然语言处理领域的一个重要分支&#xff0c;在文本摘要生成任务中&#xff0c;另一个重要的分支是自然语言理解&#xff08;Natural Language Understanding&…

传奇GOM引擎版本架设

传奇GOM引擎版本架设 传奇GOM引擎版本我们架设游戏需要用到的工具&#xff1a; 版本&#xff08;游戏类型服务端&#xff09;、DBC2000&#xff08;游戏数据库&#xff09;、RAR&#xff08;解压工具&#xff09;、传奇客户端、服务器、网盘 先把这些架设工具准备好&#xff…

性能测试——

目录 测试的分类 性能测试的指标 性能测试需求分析 ​编辑 性能测试计划及方案 ​编辑​编辑 测试用例设计及执行 梳理系统架构 压力测试报告 测试的分类 性能测试的指标 性能测试需求分析 性能测试计划及方案 测试用例设计及执行 估算系统的qps要了解什么&#xff1a; 系…