一灰灰blog 一灰灰blog
首页
  • InfluxDB
  • MongoDB
  • MySql
  • 基础系列
  • DB系列
  • 搜索系列
  • MQ系列
  • WEB系列
  • 中间件
  • 运维
  • SpringSecurity
  • SpringCloud
  • QuickAlarm
  • QuickCrawer
  • QuickFix
  • QuickMedia
  • QuickSpi
  • QuickTask
  • 分类
  • 标签
  • 归档
  • 收藏
  • 关于
GitHub (opens new window)

一灰灰blog

资深搬运工
首页
  • InfluxDB
  • MongoDB
  • MySql
  • 基础系列
  • DB系列
  • 搜索系列
  • MQ系列
  • WEB系列
  • 中间件
  • 运维
  • SpringSecurity
  • SpringCloud
  • QuickAlarm
  • QuickCrawer
  • QuickFix
  • QuickMedia
  • QuickSpi
  • QuickTask
  • 分类
  • 标签
  • 归档
  • 收藏
  • 关于
GitHub (opens new window)
  • QuickAlarm

    • 1. 报警系统QuickAlarm设计总纲
    • 2. 报警系统QuickAlarm之报警执行器的设计与实现
    • 3. 报警系统QuickAlarm之报警规则的设定与加载
    • 5. 报警系统QuickAlarm之频率统计及接口封装
    • 6. 报警系统QuickAlarm使用手册
    • 7. 报警系统QuickAlarm之默认报警规则扩展
    • Quick-Alarm 钉钉报警支持
      • II. 其他
        • 1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
        • 2. 声明
        • 3. 扫描关注
  • QuickCrawer

  • QuickFix

  • QuickMedia

  • QuickSpi

  • QuickTask

  • Quick开源系列
  • QuickAlarm
一灰灰
2019-12-25

Quick-Alarm 钉钉报警支持

Quick-Alarm时隔一年半,新增钉钉报警支持,在原有的项目基础上,新增报警规则比较简单;下面介绍一下实现与使用姿势

# 1. 钉钉报警支持

Quick-Alarm系统提供基于SPI方式进行报警方式的扩展,当我们需要新增一种报警方式时,实现接口IExecute,并注册spi文件即可

所以我们的DingdingExecute实现如下

public class DingdingExecute implements IExecute {

    @Override
    public void sendMsg(List<String> users, String title, String msg) {
        for (String user : users) {
            DingdingPublisher.sendMessage(title, msg, user);
        }
    }
}
1
2
3
4
5
6
7
8
9

具体的钉钉推送,抽象了一个辅助类,关于钉钉机器人的使用姿势,可以参考一下官方文档: 获取自定义机器人webhook (opens new window)

从官方文档中,调用钉钉机器人,实际上就是向一个特定的url,发送post请求;http请求工具这里选择了 OkHttp 这个库,具体实现代码如下

public class DingdingPublisher {
    private static final String TEMPLATE = "title:\t%s\n\ncontent:\t%s";
    private static final Logger logger = LoggerFactory.getLogger(DingdingPublisher.class);
    private static final String DING_TALK_URL = "https://oapi.dingtalk.com/robot/send?access_token=";
    private static final MediaType JSON;
    private static OkHttpClient okHttpClient;

    static {
        okHttpClient = new OkHttpClient();
        JSON = MediaType.get("application/json; charset=utf-8");
    }

    public static void sendMessage(String title, String content, String token) {
        String msg = String.format(TEMPLATE, title, content);

        try {
            doPost(msg, token);
        } catch (Exception e) {
            logger.error("failed to publish msg: {} to DingDing! {}", msg, e);
        }
    }

    public static String doPost(String msg, String token) throws IOException {
        RequestBody body = RequestBody.create(buildTextMsgBody(msg), JSON);

        try (Response response = okHttpClient
                .newCall(new Request.Builder().url(DING_TALK_URL + token).post(body).build()).execute()) {
            return response.body().string();
        }
    }

    private static String buildTextMsgBody(String content) {
        JSONObject msg = new JSONObject();
        msg.put("msgtype", "text");
        JSONObject text = new JSONObject();
        text.put("content", content);
        msg.put("text", text);
        return msg.toJSONString();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

上面基本上就完成了一个报警器的代码实现,接下来别忘了需要注册,在资源目录下,新建文件夹 META-INF/services(注意上面是两层目录), 添加文件com.hust.hui.alarm.core.execut.api.IExecute, 文件内容如下

com.hust.hui.alarm.plugin.dingding.DingdingExecute
1

# 2. 测试使用

使用钉钉报警时,需要先有一个自定义的钉钉机器人,可以在一个群里面申请,会获得一个token;然后将这个token 配置到我们的预警规则里面

{
    "XXX,YYY": {
        "level": "LOG",
        "autoIncEmergency": true,
        "max": 30,
        "min": 3,
        "threshold": [
            {
                "level": "DINGDING",
                "threshold": 10,
                "max": 12,
                "users": [
                    "请用实际的token替换!!!"
                ]
            }
        ],
        "users": [
            "yihui"
        ]
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

在上面的配置中,所以我们需要在users里面填写你的机器人token,这个需要额外注意;

此外新版的钉钉机器人有三种安全校验方式

  • 关键词:需要你的报警内容中,包含对应的关键字
  • 加签:暂时不支持这种场景,感觉意义不大
  • ip白名单:确保使用的机器ip在白名单内部
public static void main(String[] args) throws InterruptedException {
    // 测试异常升级的case
    // 计数 [10 - 12) 钉钉报警
    for (int i = 0; i < 40; i++) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                AlarmWrapper.getInstance().sendMsg("YYY", "异常报警升级测试");
            }
        }).start();
    }

    Thread.sleep(1000 * 600);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 3. 相关信息

相关博文

  1. 报警系统QuickAlarm总纲 (opens new window)
  2. 报警系统QuickAlarm之报警执行器的设计与实现 (opens new window)
  3. 报警系统QuickAlarm之报警规则的设定与加载 (opens new window)
  4. 报警系统QuickAlarm之报警规则解析 (opens new window)
  5. 报警系统QuickAlarm之频率统计及接口封装 (opens new window)
  6. 报警系统QuickAlarm使用手册 (opens new window)
  7. 报警系统QuickAlarm之默认报警规则扩展 (opens new window)

项目源码

  • https://github.com/liuyueyi/quick-alarm (opens new window)

# II. 其他

# 1. 一灰灰Blog (opens new window): https://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

# 2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

  • 微博地址: 小灰灰Blog (opens new window)
  • QQ: 一灰灰/3302797840

# 3. 扫描关注

一灰灰blog

QrCode

编辑 (opens new window)
#QuickAlarm
上次更新: 2021/10/15, 19:56:22
7. 报警系统QuickAlarm之默认报警规则扩展
Java动手写爬虫:一、实现一个最简单爬虫

← 7. 报警系统QuickAlarm之默认报警规则扩展 Java动手写爬虫:一、实现一个最简单爬虫→

最近更新
01
【WEB系列】从0到1实现自定义web参数映射器
01-23
02
【WEB系列】如何支持下划线驼峰互转的传参与返回
01-17
03
【DB系列】Mybatis之批量插入的几种姿势
01-11
更多文章>
Theme by Vdoing | Copyright © 2017-2022 一灰灰Blog
MIT License | 鄂ICP备18017282号 |
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×