DevOps 运维提醒 钉钉 机器人 群通知

简介: DevOps 运维提醒 钉钉 机器人 群通知

应用系统在碰到运行异常等情况时,发送预警消息@群内相关人员,可以及时发出问题,观察对问题的响应情况

 

1. 创建一个群(可以是公司内部群)

2. 添加机器人

 

 

 

 

 

 

 

 

自定义机器人安全设置: https://open.dingtalk.com/document/robots/customize-robot-security-settings

设置说明:https://open.dingtalk.com/document/org/application-types

 

 

{
    "at": {
        "atMobiles":[
            "手机号"
        ],
        "atUserIds":[
            ""
        ],
        "isAtAll": false
    },
    "text": {
        "content":"【业务报警】接口发生异常,请及时处理,如果加了自定义关键词,内容必须包括关键词,消息才能发出"
    },
    "msgtype":"text"
}

 

 

 

https://open.dingtalk.com/document/robots/push-message

https://open.dingtalk.com/document/group/custom-robot-access

https://open.dingtalk.com/document/resourcedownload/download-server-sdk

DT研究院 https://gitee.com/dt_research_institute

 

代码实现:

package com.vipsoft.dingtalk.rpc;
import com.vipsoft.dingtalk.entity.dingtalk.request.RobotMessage; 
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
 * 需要在启动项中添加 @EnableFeignClients(basePackages = {"com.vipsoft"})
*/
@FeignClient(name = "vipsoft-dingtalk", url = "${dingtalk.rebot-url}")
public interface IDingtalkService {
    /**
     * 发送预警信息
     * SendSmsInfo.TemplateParam = 文本
     * @return
     */
    @PostMapping(value = "/robot/send")
    String sendMessage(@RequestParam Map<String, Object> headerParam, @RequestBody RobotMessage param); 
}
RobotMessage
package com.vipsoft.dingtalk.entity.dingtalk.request;
import java.io.Serializable;
public class RobotMessage implements Serializable {
    private String msgtype;
    private RobotAtInfo at;
    private RobotContentInfo text;
    public String getMsgtype() {
        return msgtype;
    }
    public void setMsgtype(String msgtype) {
        this.msgtype = msgtype;
    }
    public RobotAtInfo getAt() {
        return at;
    }
    public void setAt(RobotAtInfo at) {
        this.at = at;
    }
    public RobotContentInfo getText() {
        return text;
    }
    public void setText(RobotContentInfo text) {
        this.text = text;
    }
}

RobotAtInfo

package com.vipsoft.dingtalk.entity.dingtalk.request;
import java.io.Serializable;
import java.util.List;
public class RobotAtInfo implements Serializable {
    private List<String> atMobiles;
    public List<String> getAtMobiles() {
        return atMobiles;
    }
    public void setAtMobiles(List<String> atMobiles) {
        this.atMobiles = atMobiles;
    }
}

RobotContentInfo

package com.vipsoft.dingtalk.entity.dingtalk.request;
import java.io.Serializable; 
public class RobotContentInfo implements Serializable {
    private String content;
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
}

Test

@SpringBootTest
class VipsoftDingTalkTests {
    Logger logger = LoggerFactory.getLogger(this.getClass());
 
    @Autowired
    IDingtalkService dingtalkService;
    @Test
    void sendMessage() {
        String result = "";
        Long timestamp = System.currentTimeMillis();
        List<String> phoneNoList = new ArrayList<>();
        String[] phoneNoStr = "25988888888,35988888888".split(",");
        for (String phoneNo : phoneNoStr) {
            phoneNoList.add(phoneNo);
        }
        String content = "【业务预警】 调用开放平台,推送消息接口异常";
        if (ObjectUtil.isNotEmpty(phoneNoList)) {
            Map<String, Object> map = new HashMap<>();
            map.put("access_token", "2471310a60b56329c47c0e5f202af16b89XXXXXXXXXXXXXXXXXX");
            map.put("timestamp", timestamp);
            map.put("sign", sign(timestamp));
            
            RobotAtInfo atInfo=new RobotAtInfo();
            atInfo.setAtMobiles(phoneNoList);
            RobotContentInfo contentInfo=new RobotContentInfo();
            contentInfo.setContent(content);
            RobotMessage param=new RobotMessage();
            param.setMsgtype("text");
            param.setAt(atInfo);
            param.setText(contentInfo);
            result = dingtalkService.sendMessage(map, param);
        }
        logger.info(result);
    }
    public String sign(Long timestamp) {
        try {
            String appSecret = "SECfd5138XXXXXXXXXXXXXXXXXXXXXXXX";
            String stringToSign = timestamp + "\n" + appSecret;
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(new SecretKeySpec(appSecret.getBytes("UTF-8"), "HmacSHA256"));
            byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
            return new String(Base64.encodeBase64(signData));
        } catch (Exception ex) {
            return "";
        }
    }
}

 

目录
相关文章
|
10天前
|
运维 Devops 持续交付
自动化运维的魔法:打造高效DevOps流水线
【10月更文挑战第34天】在数字化时代的浪潮中,DevOps成为企业追求敏捷、高效和稳定的关键。本文将通过一个真实案例,展示如何构建一个高效的DevOps流水线,实现从代码提交到部署的全自动化流程。我们将探讨流水线设计的哲学、工具选择以及面临的挑战,并分享实际的代码示例和操作步骤,帮助读者理解自动化运维的精髓。
27 2
|
16天前
|
运维 Devops 测试技术
自动化运维的魔法——打造高效的DevOps流程
【10月更文挑战第28天】在数字化浪潮不断推进的今天,企业对运维效率的追求如同古人探索魔法一般充满好奇与渴望。本文将带你走进自动化运维的世界,揭秘如何通过DevOps实践,实现从代码到部署的无缝连接,提升企业的IT运营效能。我们将一起探索自动化工具的选择与配置,以及如何构建一个既能快速响应业务需求,又能保障系统稳定性的高效流程。
|
20天前
|
运维 Prometheus 监控
自动化运维之路:从脚本到DevOps
【10月更文挑战第25天】在数字化时代的浪潮中,运维不再是简单的服务器管理,而是成为了企业竞争力的核心。本文将带你走进自动化运维的世界,探索如何通过技术手段提升效率和稳定性,以及实现快速响应市场的能力。我们将一起学习如何从基础的脚本编写进化到全面的DevOps实践,包括工具的选择、流程的优化以及文化的建设。无论你是运维新手还是资深专家,这篇文章都将为你提供有价值的见解和实用的技巧。
18 3
|
1月前
|
人工智能 运维 Devops
自动化运维之路:从脚本到DevOps的转变
【10月更文挑战第7天】在这篇文章中,我们将一起探索自动化运维的演变历程,从最初的简单脚本到现代的DevOps实践。我们将深入理解自动化如何改变了运维工作的本质,并讨论实现这一转变的关键技术和策略。文章将不包含代码示例,而是聚焦于理念、工具和方法论的介绍,旨在为读者提供一个全面的自动化运维框架视图。
|
1月前
|
运维 监控 Devops
自动化运维的魔法:打造高效DevOps流水线
【10月更文挑战第6天】 在现代软件开发的快节奏中,自动化运维成为提高效率、保障质量的重要手段。本文将带你了解如何构建高效的DevOps流水线,从持续集成到部署,再到监控和反馈,我们将一步步揭开自动化运维的神秘面纱。你将学习到如何通过代码和工具的结合,实现软件交付过程的自动化,以及如何通过这一流程提升团队的协作和响应速度。让我们开始探索自动化运维的奇妙之旅吧!
|
1月前
|
运维 Devops jenkins
自动化运维之路:从脚本到DevOps
【9月更文挑战第31天】在数字化时代的浪潮中,运维不再是单纯的系统维护,而是企业竞争力的加速器。本文将带你领略自动化运维的演变历程,从最初的脚本编写到现代DevOps实践的转变,揭示如何通过持续集成和持续交付(CI/CD)实现运维的高效与创新。我们将一起探索工具的选择、流程的优化以及文化的培养,让运维工作变得既简单又强大。
|
2月前
|
运维 Devops 大数据
自动化运维之路:从脚本到DevOps的转变
【9月更文挑战第24天】在数字化时代的浪潮中,企业对运维的要求越来越高。本文将探讨如何通过自动化工具和DevOps文化,提升运维效率,确保系统的稳定性和安全性。我们将一起走进自动化运维的世界,了解其背后的理念和技术实现,以及它如何改变我们的工作方式。
49 2
|
2月前
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
203 3
|
2月前
|
运维 Devops jenkins
自动化运维之路:从脚本到DevOps
【9月更文挑战第11天】随着技术的快速发展,传统的手动运维方式已无法满足现代企业的需求。本文将引导你了解如何通过自动化工具和DevOps实践来提升运维效率,确保系统的高可用性和快速迭代。我们将从基础的脚本编写出发,逐步深入到DevOps的核心理念和实践,让你的运维工作变得更加高效和可靠。
|
2月前
|
运维 Devops jenkins
自动化运维:打造高效DevOps流水线
【8月更文挑战第44天】本文将通过深入浅出的方式,带你构建一个自动化的DevOps流水线,提升开发和部署效率。从基础概念到实际操作,我们一步步剖析如何实现代码提交、自动测试、构建、部署的全过程自动化。你将学会使用Jenkins、Git、Docker等工具,并结合Shell脚本编写,完成一个完整的自动化流程。文章末尾附有完整的示例代码,助你快速上手实践。