update(REQ-2516) - 新增内置钉钉告警控制

This commit is contained in:
wangli 2024-06-19 13:49:42 +08:00
parent 1f96e581d8
commit 0aeafbc6c3
6 changed files with 20 additions and 10 deletions

View File

@ -79,6 +79,8 @@ public class WorkflowEngineStarterProperties {
/**
* 开启后会在主动给工作流小分队群中发送信息
* <p>
* 只针对容器环境中的应用生效
*/
private Boolean alert = false;

View File

@ -17,7 +17,7 @@ import org.slf4j.LoggerFactory;
public interface BroadcastDLQReporter {
Logger log = LoggerFactory.getLogger(BroadcastDLQReporter.class);
default void process(TopicOffset v) {
default void process(TopicOffset v, String dlqName) {
long dlqCount = v.getMaxOffset() - v.getMinOffset();
log.error("found Broadcast MQ DLQ, count: {}", dlqCount);
}

View File

@ -18,7 +18,7 @@ import org.slf4j.LoggerFactory;
public interface RpcDLQReporter {
Logger log = LoggerFactory.getLogger(RpcDLQReporter.class);
default void process(TopicOffset v) {
default void process(TopicOffset v, String dlqName) {
long dlqCount = v.getMaxOffset() - v.getMinOffset();
log.error("found rpc MQ DLQ, count: {}", dlqCount);
}

View File

@ -30,16 +30,16 @@ public class AlertBroadcastDLQReporter implements BroadcastDLQReporter {
}
@Override
public void process(TopicOffset v) {
public void process(TopicOffset v, String dlqName) {
log.warn("found DLQ");
long count = v.getMaxOffset() - v.getMinOffset();
if (count > 0) {
sendDingTalk(count);
sendDingTalk(count, dlqName);
}
}
@SneakyThrows
public void sendDingTalk(Long count) {
public void sendDingTalk(Long count, String dlqName) {
DingTalkClient client = new DefaultDingTalkClient(dingtalk_robot_webhook);
OapiRobotSendRequest request = new OapiRobotSendRequest();
@ -49,6 +49,7 @@ public class AlertBroadcastDLQReporter implements BroadcastDLQReporter {
markdown.setText("#### [" + profile + "]环境[" + applicationName + "]发现“DLQ”数据(Rpc)\n" +
"> ###### 1. 如需查看详情,[请点击这里](" + findDomain() + "m) \n" +
"> ###### 2. 如需调整 MQ DLQ 的监控状态: \n" +
"> ###### 3. DLQ名称" + dlqName + " \n" +
"[关闭监控](" + findDomain() + "m/set?status=false) \n | " +
"[开启监控](" + findDomain() + "m/set?status=true) \n" +
"> 积累条数:" + count + " \n");

View File

@ -30,16 +30,16 @@ public class AlertRcpDLQReporter implements RpcDLQReporter {
}
@Override
public void process(TopicOffset v) {
public void process(TopicOffset v, String dlqName) {
log.warn("found DLQ");
long count = v.getMaxOffset() - v.getMinOffset();
if (count > 0) {
sendDingTalk(count);
sendDingTalk(count, dlqName);
}
}
@SneakyThrows
public void sendDingTalk(Long count) {
public void sendDingTalk(Long count, String dlqName) {
DingTalkClient client = new DefaultDingTalkClient(dingtalk_robot_webhook);
OapiRobotSendRequest request = new OapiRobotSendRequest();
@ -49,6 +49,7 @@ public class AlertRcpDLQReporter implements RpcDLQReporter {
markdown.setText("#### [" + profile + "]环境[" + applicationName + "]发现“DLQ”数据(Rpc)\n" +
"> ###### 1. 如需查看详情,[请点击这里](" + findDomain() + "m) \n" +
"> ###### 2. 如需调整 MQ DLQ 的监控状态: \n" +
"> ###### 3. DLQ名称" + dlqName + " \n" +
"[关闭监控](" + findDomain() + "m/set?status=false) \n | " +
"[开启监控](" + findDomain() + "m/set?status=true) \n" +
"> 积累条数:" + count + " \n");

View File

@ -13,10 +13,12 @@ import org.springframework.context.SmartLifecycle;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.Objects;
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.starter.mq.monitor.console.WorkflowEngineStarterMQMonitorController.BROADCAST_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) {
log.info("current broadcast consumer group is :{}", consumerGroupName);
String myPodNamespace = environment.getProperty(K8S_POD_NAME_SPACE);
if (!StringUtils.hasText(myPodNamespace)) {
return;
}
try {
TopicStatsTable table = defaultMQAdminExt.examineTopicStats(DLQ_PREFIX + consumerGroupName);
if (Objects.isNull(table) || CollectionUtils.isEmpty(table.getOffsetTable())) {
@ -99,9 +105,9 @@ public class WorkflowEngineStarterDefaultMQMonitor implements SmartLifecycle {
table.getOffsetTable().forEach((k, v) -> {
if (Objects.equals(DLQ_PREFIX + consumerGroupName, k.getTopic())) {
if (BROADCAST.equals(dqlType)) {
broadcastDLQProcessor.process(v);
broadcastDLQProcessor.process(v, DLQ_PREFIX + consumerGroupName);
} else if (RPC.equals(dqlType)) {
rpcDLQProcessor.process(v);
rpcDLQProcessor.process(v, DLQ_PREFIX + consumerGroupName);
}
}
});