美文网首页
XXL-JOB实现钉钉报警

XXL-JOB实现钉钉报警

作者: toliong | 来源:发表于2023-01-31 17:16 被阅读0次

1. 环境准备

Centos7.9
java 1.8
maven 3.0.5
xxl-job-admin 2.3.0

yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y

yum install maven -y

# vim /etc/maven/settings.xml
 <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
 </mirror>

下载安装

git clone https://gitee.com/xuxueli0323/xxl-job.git
cd xxl-job/
git checkout 2.3.0

# 初始数据库
xxl-job/doc/db/tables_xxl_job.sql

2. 修改配置

2.1 application.properties配置

path: xxl-job-admin/src/main/resources/application.properties

### web
server.port=9090

### xxl-job, datasource
spring.datasource.url=jdbc:mysql://x.x.x.x:3306/xxl_job_dev?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=xxljob_db_user
spring.datasource.password=XXLjob_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

### xxl-job, access token
xxl.job.accessToken=

# 增加钉钉配置信息
alarm.baseDingWebhook=https://oapi.dingtalk.com/robot/send?

2.2 添加DingDing通知文件

原生的xxl-job并没有钉钉报警功能,但是官方文档有写:可以很方便的集成钉钉报警功能,即新增一个实现 "com.xxl.job.admin.core.alarm.JobAlarm" 接口的告警实现即可

图片.png 图片.png

DingJobAlarm.java

路径:xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/DingJobAlarm.java

package com.xxl.job.admin.core.alarm.impl;

import com.xxl.job.admin.core.alarm.JobAlarm;
import com.xxl.job.admin.core.model.XxlJobInfo;
import com.xxl.job.admin.core.model.XxlJobLog;
import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
import com.xxl.job.core.biz.ExecutorBiz;
import com.xxl.job.core.biz.model.LogParam;
import com.xxl.job.core.biz.model.LogResult;
import com.xxl.job.core.biz.model.ReturnT;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 钉钉告警
 *
 * @author
 */
@Component
public class DingJobAlarm implements JobAlarm {

    private static Logger logger = LoggerFactory.getLogger(DingJobAlarm.class);

    @Value("${alarm.baseDingWebhook}")
    private String baseDingWebhook;

    private final RestTemplate restTemplate = new RestTemplate();

    /**
     * fail alarm
     *
     * @param info
     * @param jobLog
     * @return
     */
    @Override
    public boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog) {
        boolean alarmResult = true;
        logger.info("ding----------------");

        if(info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0){
            // 如果不包含access_token,则直接退出,调用email告警任务
            if (!info.getAlarmEmail().contains("access_token")){
                return alarmResult;
            }

            // 读取Webhook
            Set<String> dingWebhookSet = new HashSet<String>(Arrays.asList(info.getAlarmEmail().split(",")));
            Map<String, Object> map = loadEmailJobAlarmTemplate(info,jobLog);

            // 发送钉钉消息
            for (String dingWebhook: dingWebhookSet) {
                try {
                    restTemplate.postForEntity(baseDingWebhook + dingWebhook,map,Object.class);
                } catch (Exception e) {
                    logger.error(">>>>>>>>>>> xxl-job, job fail alarm email send error, JobLogId:{}", jobLog.getId(), e);
                    alarmResult = false;
                }

            }
        }

        return alarmResult;
    }

    /**
     * 封装消息内容
     * @param info
     * @param jobLog
     * @return
     */
    private static Map<String, Object> loadEmailJobAlarmTemplate(XxlJobInfo info, XxlJobLog jobLog) {

        HashMap<String, Object> requestMap = new HashMap<>();
        ExecutorBiz executorBiz = null;
        try {
            executorBiz = XxlJobScheduler.getExecutorBiz(jobLog.getExecutorAddress());
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        // 获取执行日志信息
        ReturnT<LogResult> logResult = executorBiz.log(new LogParam(jobLog.getTriggerTime().getTime(), jobLog.getId(), 1));
        String errorMsg = logResult.getContent().getLogContent();

        // 消息类型
        requestMap.put("msgtype", "text");
        // 消息内容
        String content = "【告警信息】 \t\n" +
                "负责人 : \t" + info.getAuthor() + "\t\n" +
                "任务id : \t" + info.getId() + "\t\n" +
                "任务名称 : \t" + info.getJobDesc() + "\t\n" +
                "执行器名称 : \t" + info.getExecutorHandler() + "\t\n" +
                "执行器ip : \t" + jobLog.getExecutorAddress() + "\t\n" +
                "任务参数 : \t" + jobLog.getExecutorParam() + "\t\n" +
                "LogId : \t" + jobLog.getId() + "\t\n" +
                "TriggerMsg : \t" + jobLog.getTriggerMsg().replace("<br>","\n") + "\t\n" +
                "HandleCode : \t" + jobLog.getHandleMsg() + "\t\n" +
                "报警时间 : \t" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "\t\n";

        HashMap<String, Object> map = new HashMap<>();
        map.put("content",content);
        requestMap.put("text", map);

        // 设置是否@指定人
        Map<String, Object> atmap = new HashMap<String, Object>();
        String[] authorList = info.getAuthor().split(",");
        ArrayList arrayList = new ArrayList();
        for (String author : authorList){
            if ("".equals(author) || author.split("-").length<2){
                continue;
            }
            arrayList.add(author.split("-")[1]);
        }
        if (arrayList.size() > 0){
            atmap.put("atMobiles",arrayList.toArray());
            requestMap.put("at",atmap);
        }

        return requestMap;
    }
}

3. 编译运行xxl-job-admin

编译

cd xxl-job-admin
mvn -B -Dmaven.test.skip=true clean package

运行

mkdir /opt/xxl-job-2.3.0
cp xxl-job-admin/target/xxl-job-admin-2.3.0.jar /opt/xxl-job-2.3.0
cd /opt/xxl-job-2.3.0
nohup java -jar xxl-job-admin-2.3.0.jar & 

访问

# 浏览器问: 
http://localhost:9090/xxl-job-admin/
#默认用户名与口令:
admin/123456

4. 钉钉群创建自定义机器人

图片.png

安全设置自定义关键字

图片.png

5. 页面配置通知

负责人格式为 姓名-手机号 即 李四-151XXXX1234
报警邮件为 access_token=26c54 机器人的地址

图片.png

6. 报警展示

图片.png

参考:
https://www.xuxueli.com/xxl-job/
https://blog.csdn.net/qq_31021213/article/details/125763157
https://blog.csdn.net/IT_world_/article/details/120785289
https://blog.csdn.net/xiaogang_1994/article/details/117284620
https://segmentfault.com/a/1190000039236981

相关文章

  • 开源定时任务power-job的告警实现

    一、报警接口Alarmable 二、告警实现类 多种实现,这里实现了钉钉消息、邮件和webhook三种方式。你可以...

  • SpringBoot—实现n秒内出现x个异常报警

    报警工具:SpringBoot集成钉钉报警sdk(解决Failed to introspect Class异常)[...

  • Prometheus部署

    Prometheus部署+邮箱报警+企业微信报警+钉钉报警 1 部署Prometheus server 1.1 下...

  • AlertManager 钉钉报警

    AlertManager Dingtalk 简介 用于接收AlertManager服务通知并通过钉钉机器人报警 p...

  • 配置钉钉报警

    一次性发送大量数据的时候,钉钉里面复制出来的是不带换行符的。需要点击回复才能初始化上换行符。

  • Python实现钉钉发送报警消息

    钉钉开放平台传送门:https://open.dingtalk.com 我司使用钉钉作为内部通讯工具,基本上大家在...

  • zabbix监控钉钉报警

    1,钉钉上添加机器人,复制webhook 2,找一下zabbix server 上定义的告警脚本目录 3,在/us...

  • zabbix-钉钉报警

    2020-12-09 1、获取钉钉群机器人的webhook,参考钉钉官方获取方式:https://ding-doc...

  • Zabbix设置钉钉报警

    一、注册登录钉钉 1、创建群组添加成员 2、添加机器人获取token地址 二、服务端编写脚本 1、服务端编写脚本文...

  • zabbix创建钉钉报警

    简介 家里搭建了zabbix去监控主机,邮件报警什么的都太麻烦了,所以直接使用钉钉机器人来提醒,下面是我的记录 创...

网友评论

      本文标题:XXL-JOB实现钉钉报警

      本文链接:https://www.haomeiwen.com/subject/evkbhdtx.html