xucj
5 years ago
3 changed files with 143 additions and 0 deletions
@ -0,0 +1,17 @@ |
|||||||
|
## SDK下载 |
||||||
|
|
||||||
|
#### Java SDK 下载 |
||||||
|
下载SDK: https://open-doc.dingtalk.com/microapp/faquestions/vzbp02 |
||||||
|
|
||||||
|
## 配置项 |
||||||
|
|
||||||
|
#### bootstrap.yml |
||||||
|
|
||||||
|
``` |
||||||
|
spring: |
||||||
|
boot: |
||||||
|
admin: |
||||||
|
notify: |
||||||
|
dingtalk: |
||||||
|
webhook-token: ${Your DingDing Robot Token} |
||||||
|
``` |
@ -0,0 +1,123 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2015-2025, Jeckxu All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are met: |
||||||
|
* |
||||||
|
* Redistributions of source code must retain the above copyright notice, |
||||||
|
* this list of conditions and the following disclaimer. |
||||||
|
* Redistributions in binary form must reproduce the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer in the |
||||||
|
* documentation and/or other materials provided with the distribution. |
||||||
|
* Neither the name of the jeckxu.net developer nor the names of its |
||||||
|
* contributors may be used to endorse or promote products derived from |
||||||
|
* this software without specific prior written permission. |
||||||
|
* Author: Jeckxu (chinajeckxu@163.com) |
||||||
|
*/ |
||||||
|
package org.springblade.admin.config; |
||||||
|
|
||||||
|
import com.dingtalk.api.DefaultDingTalkClient; |
||||||
|
import com.dingtalk.api.DingTalkClient; |
||||||
|
import com.dingtalk.api.request.OapiRobotSendRequest; |
||||||
|
import com.taobao.api.ApiException; |
||||||
|
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.domain.events.InstanceStatusChangedEvent; |
||||||
|
import de.codecentric.boot.admin.server.notify.AbstractEventNotifier; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springframework.beans.factory.annotation.Value; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
import reactor.core.publisher.Mono; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* DingTalk Notice |
||||||
|
* Can you find these packages ? , Plase Read DINGDING_README.md |
||||||
|
* {@code com.dingtalk.api.DefaultDingTalkClient} |
||||||
|
* {@code com.dingtalk.api.DingTalkClient} |
||||||
|
* {@code com.dingtalk.api.request.OapiRobotSendRequest} |
||||||
|
* {@code com.taobao.api.ApiException} |
||||||
|
* @author jeckxu |
||||||
|
*/ |
||||||
|
@Component |
||||||
|
@Slf4j |
||||||
|
public class CustomNotifier extends AbstractEventNotifier { |
||||||
|
|
||||||
|
/** |
||||||
|
* massage template |
||||||
|
*/ |
||||||
|
private static final String template = "服务名:%s(%s) n状态:%s(%s) n服务ip:%s"; |
||||||
|
|
||||||
|
@Value("${spring.boot.admin.notify.dingtalk.webhook-token}") |
||||||
|
private String dingTalkToken; |
||||||
|
|
||||||
|
|
||||||
|
public CustomNotifier(InstanceRepository repository) { |
||||||
|
super(repository); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected Mono<Void> doNotify(InstanceEvent event, Instance instance) { |
||||||
|
return Mono.fromRunnable(() -> { |
||||||
|
if (event instanceof InstanceStatusChangedEvent) { |
||||||
|
log.info("Instance {} ({}) is {}", instance.getRegistration().getName(), event.getInstance(), |
||||||
|
((InstanceStatusChangedEvent) event).getStatusInfo().getStatus()); |
||||||
|
|
||||||
|
|
||||||
|
String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus(); |
||||||
|
String messageText = null; |
||||||
|
switch (status) { |
||||||
|
// 健康检查没通过
|
||||||
|
case "DOWN": |
||||||
|
log.info("发送 健康检查没通过 的通知!"); |
||||||
|
messageText = String.format(template, instance.getRegistration().getName(),event.getInstance(), ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus(),"健康检查没通过",instance.getRegistration().getServiceUrl()); |
||||||
|
this.sendMessage(messageText); |
||||||
|
break; |
||||||
|
// 服务离线
|
||||||
|
case "OFFLINE": |
||||||
|
log.info("发送 服务离线 的通知!"); |
||||||
|
messageText = String.format(template, instance.getRegistration().getName(),event.getInstance(), ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus(),"服务离线",instance.getRegistration().getServiceUrl()); |
||||||
|
this.sendMessage(messageText); |
||||||
|
break; |
||||||
|
//服务上线
|
||||||
|
case "UP": |
||||||
|
log.info("发送 服务上线 的通知!"); |
||||||
|
messageText = String.format(template, instance.getRegistration().getName(),event.getInstance(), ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus(),"服务上线",instance.getRegistration().getServiceUrl()); |
||||||
|
this.sendMessage(messageText); |
||||||
|
break; |
||||||
|
// 服务未知异常
|
||||||
|
case "UNKNOWN": |
||||||
|
log.info("发送 服务未知异常 的通知!"); |
||||||
|
messageText = String.format(template, instance.getRegistration().getName(),event.getInstance(), ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus(),"服务未知异常",instance.getRegistration().getServiceUrl()); |
||||||
|
this.sendMessage(messageText); |
||||||
|
break; |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
} else { |
||||||
|
log.info("Instance {} ({}) {}", instance.getRegistration().getName(), event.getInstance(), |
||||||
|
event.getType()); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* massage send |
||||||
|
* @param messageText |
||||||
|
*/ |
||||||
|
private void sendMessage(String messageText){ |
||||||
|
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/robot/send?access_token="+dingTalkToken); |
||||||
|
OapiRobotSendRequest request = new OapiRobotSendRequest(); |
||||||
|
request.setMsgtype("text"); |
||||||
|
OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text(); |
||||||
|
text.setContent(messageText); |
||||||
|
request.setText(text); |
||||||
|
|
||||||
|
try { |
||||||
|
client.execute(request); |
||||||
|
} catch (ApiException e) { |
||||||
|
log.info("[ERROR] sendMessage", e); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue