Spring Boot Admin 插件 增加 钉钉通知

实现钉钉通知

DingTalkNotifier.java

package com.notifier;

import java.util.HashMap;
import java.util.Map;

import org.springframework.context.expression.MapAccessor;
import org.springframework.expression.Expression;
import org.springframework.expression.ParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate;

import de.codecentric.boot.admin.server.domain.entities.Instance;
import de.codecentric.boot.admin.server.domain.entities.InstanceRepository;
import de.codecentric.boot.admin.server.domain.events.InstanceEvent;
import de.codecentric.boot.admin.server.notify.AbstractStatusChangeNotifier;
import reactor.core.publisher.Mono;

public class DingTalkNotifier extends AbstractStatusChangeNotifier {
	private static final String DEFAULT_MESSAGE = "*#{instance.registration.name}* (#{instance.id}) is *#{event.statusInfo.status}**";
    
	private final SpelExpressionParser parser = new SpelExpressionParser();
    private RestTemplate restTemplate = new RestTemplate();
    private String webhookToken;
    private String atMobiles;
    private String msgtype = "markdown";
    private String title = "服务告警";
    private Expression message;

    public DingTalkNotifier(InstanceRepository repository) {
        super(repository);
        this.message = parser.parseExpression(DEFAULT_MESSAGE, ParserContext.TEMPLATE_EXPRESSION);
    }
    
    @Override
    protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
        return Mono.fromRunnable(() -> restTemplate.postForEntity(webhookToken, createMessage(event, instance),Void.class));
    }

    
    private HttpEntity<Map<String, Object>> createMessage(InstanceEvent event,Instance instance) {
        Map<String, Object> messageJson = new HashMap<>();
        HashMap<String, String> params = new HashMap<>();
        params.put("text", this.getMessage(event, instance));
        params.put("title", this.title);
        messageJson.put("atMobiles", this.atMobiles);
        messageJson.put("msgtype", this.msgtype);
        messageJson.put(this.msgtype, params);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        return new HttpEntity<>(messageJson, headers);
    }

    private String getAtMobilesString(String s) {
        StringBuilder atMobiles = new StringBuilder();
        String[] mobiles = s.split(",");
        for (String mobile : mobiles) {
            atMobiles.append("@").append(mobile);
        }
        return atMobiles.toString();
    }

    private String getMessage(InstanceEvent event,Instance instance) {
    	 Map<String, Object> root = new HashMap<>();
         root.put("event", event);
         root.put("instance", instance);
         root.put("lastStatus", getLastStatus(event.getInstance()));
         StandardEvaluationContext context = new StandardEvaluationContext(root);
         context.addPropertyAccessor(new MapAccessor());
         return message.getValue(context, String.class);
    }

    public void setRestTemplate(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    public String getWebhookToken() {
        return webhookToken;
    }

    public void setWebhookToken(String webhookToken) {
        this.webhookToken = webhookToken;
    }

    public String getAtMobiles() {
        return atMobiles;
    }

    public void setAtMobiles(String atMobiles) {
        this.atMobiles = atMobiles;
    }

    public String getMsgtype() {
        return msgtype;
    }

    public void setMsgtype(String msgtype) {
        this.msgtype = msgtype;
    }

    public Expression getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = (Expression) this.parser.parseExpression(message, ParserContext.TEMPLATE_EXPRESSION);
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

	
}

DingTalkNotifierConfiguration.java

package com.notifier;

import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import de.codecentric.boot.admin.server.config.AdminServerNotifierAutoConfiguration.CompositeNotifierConfiguration;
import de.codecentric.boot.admin.server.config.AdminServerNotifierAutoConfiguration.NotifierTriggerConfiguration;
import de.codecentric.boot.admin.server.domain.entities.InstanceRepository;

@Configuration
@ConditionalOnProperty(
        prefix = "spring.boot.admin.notify.dingtalk",
        name = {"webhook-token"}
)
@AutoConfigureBefore({NotifierTriggerConfiguration.class, CompositeNotifierConfiguration.class})
public class DingTalkNotifierConfiguration {
    @Bean
    @ConditionalOnMissingBean
    @ConfigurationProperties(prefix = "spring.boot.admin.notify.dingtalk")
    public DingTalkNotifier dingTalkNotifier(InstanceRepository repository) {
        return new DingTalkNotifier(repository);
    }

}

application.yml

spring:
  boot:
    admin:
		notify:
	        dingtalk:
	          enabled: true
	          webhook-token: https://oapi.dingtalk.com/robot/send?access_token=xxxxx

启动完成钉钉消息推送了。

 restarts.sh

#!/bin/bash
echo 当前工作目录如下
pwd
echo 关闭正在运行的服务
ps -ef|grep 'java'|grep 'spring'|grep 'springboot_admin'|grep -v 'grep'|awk '{print $2}'|xargs -tI {} kill -9 {} 

echo 备份日志文件
logbase=/data/log/springboot_admin

echo 启动服务-后台运行
mkdir -p $logbase
touch $logbase/spring.log
nohup java -Xms1024m -Xmx1024m -DLOG_PATH=$logbase -jar springboot_admin-0.0.1-SNAPSHOT.jar  1>/dev/null 2>&1 &

#结束动态日志输出(60秒之后)
sleep 60 && ps -ef|grep 'tail'|grep 'springboot_admin'|grep -v 'grep'|awk '{print $2}'|xargs -tI {} kill -9 {} &

echo 动态输出新服务日志
tail -f $logbase/spring.log

echo 滚动日志已关闭

如果要修改端口和钉钉的地址,请修改

nohup java -Xms1024m -Xmx1024m -DLOG_PATH=$logbase -jar springboot_admin-0.0.1-SNAPSHOT.jar  1>/dev/null 2>&1 &

为:

nohup java -Xms1024m -Xmx1024m -DLOG_PATH=$logbase -jar springboot_admin-0.0.1-SNAPSHOT.jar --server.port=9090 --spring.boot.admin.notify.dingtalk.webhook-url='钉钉Webhook 全连接'    1>/dev/null 2>&1 &

Guess you like

Origin blog.csdn.net/Allure_LoveU/article/details/121360682