update(REQ-2516) - 新增内置钉钉告警控制
This commit is contained in:
parent
1f96e581d8
commit
0aeafbc6c3
@ -79,6 +79,8 @@ public class WorkflowEngineStarterProperties {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 开启后,会在主动给“工作流小分队”群中发送信息
|
* 开启后,会在主动给“工作流小分队”群中发送信息
|
||||||
|
* <p>
|
||||||
|
* 只针对容器环境中的应用生效
|
||||||
*/
|
*/
|
||||||
private Boolean alert = false;
|
private Boolean alert = false;
|
||||||
|
|
||||||
|
|||||||
@ -17,7 +17,7 @@ import org.slf4j.LoggerFactory;
|
|||||||
public interface BroadcastDLQReporter {
|
public interface BroadcastDLQReporter {
|
||||||
Logger log = LoggerFactory.getLogger(BroadcastDLQReporter.class);
|
Logger log = LoggerFactory.getLogger(BroadcastDLQReporter.class);
|
||||||
|
|
||||||
default void process(TopicOffset v) {
|
default void process(TopicOffset v, String dlqName) {
|
||||||
long dlqCount = v.getMaxOffset() - v.getMinOffset();
|
long dlqCount = v.getMaxOffset() - v.getMinOffset();
|
||||||
log.error("found Broadcast MQ DLQ, count: {}", dlqCount);
|
log.error("found Broadcast MQ DLQ, count: {}", dlqCount);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,7 +18,7 @@ import org.slf4j.LoggerFactory;
|
|||||||
public interface RpcDLQReporter {
|
public interface RpcDLQReporter {
|
||||||
Logger log = LoggerFactory.getLogger(RpcDLQReporter.class);
|
Logger log = LoggerFactory.getLogger(RpcDLQReporter.class);
|
||||||
|
|
||||||
default void process(TopicOffset v) {
|
default void process(TopicOffset v, String dlqName) {
|
||||||
long dlqCount = v.getMaxOffset() - v.getMinOffset();
|
long dlqCount = v.getMaxOffset() - v.getMinOffset();
|
||||||
log.error("found rpc MQ DLQ, count: {}", dlqCount);
|
log.error("found rpc MQ DLQ, count: {}", dlqCount);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,16 +30,16 @@ public class AlertBroadcastDLQReporter implements BroadcastDLQReporter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void process(TopicOffset v) {
|
public void process(TopicOffset v, String dlqName) {
|
||||||
log.warn("found DLQ");
|
log.warn("found DLQ");
|
||||||
long count = v.getMaxOffset() - v.getMinOffset();
|
long count = v.getMaxOffset() - v.getMinOffset();
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
sendDingTalk(count);
|
sendDingTalk(count, dlqName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public void sendDingTalk(Long count) {
|
public void sendDingTalk(Long count, String dlqName) {
|
||||||
DingTalkClient client = new DefaultDingTalkClient(dingtalk_robot_webhook);
|
DingTalkClient client = new DefaultDingTalkClient(dingtalk_robot_webhook);
|
||||||
OapiRobotSendRequest request = new OapiRobotSendRequest();
|
OapiRobotSendRequest request = new OapiRobotSendRequest();
|
||||||
|
|
||||||
@ -49,6 +49,7 @@ public class AlertBroadcastDLQReporter implements BroadcastDLQReporter {
|
|||||||
markdown.setText("#### [" + profile + "]环境[" + applicationName + "]发现“DLQ”数据(Rpc)\n" +
|
markdown.setText("#### [" + profile + "]环境[" + applicationName + "]发现“DLQ”数据(Rpc)\n" +
|
||||||
"> ###### 1. 如需查看详情,[请点击这里](" + findDomain() + "m) \n" +
|
"> ###### 1. 如需查看详情,[请点击这里](" + findDomain() + "m) \n" +
|
||||||
"> ###### 2. 如需调整 MQ DLQ 的监控状态: \n" +
|
"> ###### 2. 如需调整 MQ DLQ 的监控状态: \n" +
|
||||||
|
"> ###### 3. DLQ名称:" + dlqName + " \n" +
|
||||||
"[关闭监控](" + findDomain() + "m/set?status=false) \n | " +
|
"[关闭监控](" + findDomain() + "m/set?status=false) \n | " +
|
||||||
"[开启监控](" + findDomain() + "m/set?status=true) \n" +
|
"[开启监控](" + findDomain() + "m/set?status=true) \n" +
|
||||||
"> 积累条数:" + count + " \n");
|
"> 积累条数:" + count + " \n");
|
||||||
|
|||||||
@ -30,16 +30,16 @@ public class AlertRcpDLQReporter implements RpcDLQReporter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void process(TopicOffset v) {
|
public void process(TopicOffset v, String dlqName) {
|
||||||
log.warn("found DLQ");
|
log.warn("found DLQ");
|
||||||
long count = v.getMaxOffset() - v.getMinOffset();
|
long count = v.getMaxOffset() - v.getMinOffset();
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
sendDingTalk(count);
|
sendDingTalk(count, dlqName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public void sendDingTalk(Long count) {
|
public void sendDingTalk(Long count, String dlqName) {
|
||||||
DingTalkClient client = new DefaultDingTalkClient(dingtalk_robot_webhook);
|
DingTalkClient client = new DefaultDingTalkClient(dingtalk_robot_webhook);
|
||||||
OapiRobotSendRequest request = new OapiRobotSendRequest();
|
OapiRobotSendRequest request = new OapiRobotSendRequest();
|
||||||
|
|
||||||
@ -49,6 +49,7 @@ public class AlertRcpDLQReporter implements RpcDLQReporter {
|
|||||||
markdown.setText("#### [" + profile + "]环境[" + applicationName + "]发现“DLQ”数据(Rpc)\n" +
|
markdown.setText("#### [" + profile + "]环境[" + applicationName + "]发现“DLQ”数据(Rpc)\n" +
|
||||||
"> ###### 1. 如需查看详情,[请点击这里](" + findDomain() + "m) \n" +
|
"> ###### 1. 如需查看详情,[请点击这里](" + findDomain() + "m) \n" +
|
||||||
"> ###### 2. 如需调整 MQ DLQ 的监控状态: \n" +
|
"> ###### 2. 如需调整 MQ DLQ 的监控状态: \n" +
|
||||||
|
"> ###### 3. DLQ名称:" + dlqName + " \n" +
|
||||||
"[关闭监控](" + findDomain() + "m/set?status=false) \n | " +
|
"[关闭监控](" + findDomain() + "m/set?status=false) \n | " +
|
||||||
"[开启监控](" + findDomain() + "m/set?status=true) \n" +
|
"[开启监控](" + findDomain() + "m/set?status=true) \n" +
|
||||||
"> 积累条数:" + count + " \n");
|
"> 积累条数:" + count + " \n");
|
||||||
|
|||||||
@ -13,10 +13,12 @@ import org.springframework.context.SmartLifecycle;
|
|||||||
import org.springframework.core.env.Environment;
|
import org.springframework.core.env.Environment;
|
||||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
|
import static cn.axzo.workflow.common.constant.StarterConstants.K8S_POD_NAME_SPACE;
|
||||||
import static cn.axzo.workflow.common.constant.StarterConstants.MQ_GID_NAME_SEGMENT;
|
import static cn.axzo.workflow.common.constant.StarterConstants.MQ_GID_NAME_SEGMENT;
|
||||||
import static cn.axzo.workflow.starter.mq.monitor.console.WorkflowEngineStarterMQMonitorController.BROADCAST_CONSUMER_GROUP;
|
import static cn.axzo.workflow.starter.mq.monitor.console.WorkflowEngineStarterMQMonitorController.BROADCAST_CONSUMER_GROUP;
|
||||||
import static cn.axzo.workflow.starter.mq.monitor.console.WorkflowEngineStarterMQMonitorController.RPC_RETRY_CONSUMER_GROUP;
|
import static cn.axzo.workflow.starter.mq.monitor.console.WorkflowEngineStarterMQMonitorController.RPC_RETRY_CONSUMER_GROUP;
|
||||||
@ -91,6 +93,10 @@ public class WorkflowEngineStarterDefaultMQMonitor implements SmartLifecycle {
|
|||||||
|
|
||||||
private void compareDLQ(String consumerGroupName, String dqlType) {
|
private void compareDLQ(String consumerGroupName, String dqlType) {
|
||||||
log.info("current broadcast consumer group is :{}", consumerGroupName);
|
log.info("current broadcast consumer group is :{}", consumerGroupName);
|
||||||
|
String myPodNamespace = environment.getProperty(K8S_POD_NAME_SPACE);
|
||||||
|
if (!StringUtils.hasText(myPodNamespace)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
TopicStatsTable table = defaultMQAdminExt.examineTopicStats(DLQ_PREFIX + consumerGroupName);
|
TopicStatsTable table = defaultMQAdminExt.examineTopicStats(DLQ_PREFIX + consumerGroupName);
|
||||||
if (Objects.isNull(table) || CollectionUtils.isEmpty(table.getOffsetTable())) {
|
if (Objects.isNull(table) || CollectionUtils.isEmpty(table.getOffsetTable())) {
|
||||||
@ -99,9 +105,9 @@ public class WorkflowEngineStarterDefaultMQMonitor implements SmartLifecycle {
|
|||||||
table.getOffsetTable().forEach((k, v) -> {
|
table.getOffsetTable().forEach((k, v) -> {
|
||||||
if (Objects.equals(DLQ_PREFIX + consumerGroupName, k.getTopic())) {
|
if (Objects.equals(DLQ_PREFIX + consumerGroupName, k.getTopic())) {
|
||||||
if (BROADCAST.equals(dqlType)) {
|
if (BROADCAST.equals(dqlType)) {
|
||||||
broadcastDLQProcessor.process(v);
|
broadcastDLQProcessor.process(v, DLQ_PREFIX + consumerGroupName);
|
||||||
} else if (RPC.equals(dqlType)) {
|
} else if (RPC.equals(dqlType)) {
|
||||||
rpcDLQProcessor.process(v);
|
rpcDLQProcessor.process(v, DLQ_PREFIX + consumerGroupName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user