feat(sj_1.0.0):

1、告警新增Webhook
2、asyncSendMessage抽象放父类
This commit is contained in:
wodeyangzipingpingwuqi 2024-05-07 16:33:43 +08:00
parent af8521e068
commit e4fe69d870
11 changed files with 132 additions and 46 deletions

View File

@ -0,0 +1,29 @@
package com.aizuda.snailjob.common.core.alarm.attribute;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
/**
* @author: opensnail
* @date : 2024-05-07 16:13
*/
@Data
@Slf4j
public class WebhookAttribute {
/**
* webhook
*/
private String webhookUrl;
/**
* 请求类型
*/
private Integer contentType;
/**
* 秘钥
*/
private String secret;
}

View File

@ -2,10 +2,7 @@ package com.aizuda.snailjob.common.core.alarm.strategy;
import com.aizuda.snailjob.common.core.alarm.Alarm;
import com.aizuda.snailjob.common.core.alarm.SnailJobAlarmFactory;
import com.aizuda.snailjob.common.core.context.SpringContext;
import com.aizuda.snailjob.common.core.util.EnvironmentUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.env.Environment;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
@ -17,10 +14,17 @@ import java.util.concurrent.TimeUnit;
*/
public abstract class AbstractAlarm<T> implements Alarm<T>, InitializingBean {
protected static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 10, 1, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
protected static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 10, 1, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
@Override
public void afterPropertiesSet() throws Exception {
SnailJobAlarmFactory.register(this);
}
@Override
public boolean asyncSendMessage(T t) {
threadPoolExecutor.execute(() -> syncSendMessage(t));
return true;
}
@Override
public void afterPropertiesSet() throws Exception {
SnailJobAlarmFactory.register(this);
}
}

View File

@ -21,12 +21,6 @@ public class DingdingAlarm extends AbstractAlarm<AlarmContext> {
return AlarmTypeEnum.DING_DING.getValue();
}
@Override
public boolean asyncSendMessage(AlarmContext context) {
threadPoolExecutor.execute(() -> syncSendMessage(context));
return true;
}
@Override
public boolean syncSendMessage(AlarmContext context) {
DingDingAttribute dingDingAttribute = JsonUtil.parseObject(context.getNotifyAttribute(), DingDingAttribute.class);

View File

@ -30,12 +30,6 @@ public class EmailAlarm extends AbstractAlarm<AlarmContext> {
return AlarmTypeEnum.EMAIL.getValue();
}
@Override
public boolean asyncSendMessage(AlarmContext alarmContext) {
threadPoolExecutor.execute(() -> syncSendMessage(alarmContext));
return true;
}
@Override
public boolean syncSendMessage(AlarmContext alarmContext) {
if (Objects.isNull(mailAccount)) {
@ -43,11 +37,16 @@ public class EmailAlarm extends AbstractAlarm<AlarmContext> {
return false;
}
String notifyAttribute = alarmContext.getNotifyAttribute();
EmailAttribute emailAttribute = JsonUtil.parseObject(notifyAttribute, EmailAttribute.class);
String text = alarmContext.getText();
text = text.replaceAll("\n", "<br/>");
MailUtils.send(mailAccount, emailAttribute.getTos(), alarmContext.getTitle(), text, true);
try {
String notifyAttribute = alarmContext.getNotifyAttribute();
EmailAttribute emailAttribute = JsonUtil.parseObject(notifyAttribute, EmailAttribute.class);
String text = alarmContext.getText();
text = text.replaceAll("\n", "<br/>");
MailUtils.send(mailAccount, emailAttribute.getTos(), alarmContext.getTitle(), text, true);
} catch (Exception e) {
SnailJobLog.LOCAL.error("发送email消息失败:", e);
return false;
}
return true;
}

View File

@ -43,13 +43,6 @@ public class LarkAlarm extends AbstractAlarm<AlarmContext> {
return AlarmTypeEnum.LARK.getValue();
}
@Override
public boolean asyncSendMessage(AlarmContext context) {
threadPoolExecutor.execute(() -> syncSendMessage(context));
return true;
}
@Override
public boolean syncSendMessage(AlarmContext context) {
try {

View File

@ -33,12 +33,6 @@ public class QiYeWechatAlarm extends AbstractAlarm<AlarmContext> {
return AlarmTypeEnum.WE_COM.getValue();
}
@Override
public boolean asyncSendMessage(AlarmContext context) {
threadPoolExecutor.execute(() -> syncSendMessage(context));
return true;
}
@Override
public boolean syncSendMessage(AlarmContext context) {
try {

View File

@ -0,0 +1,73 @@
package com.aizuda.snailjob.common.core.alarm.strategy;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.aizuda.snailjob.common.core.alarm.AlarmContext;
import com.aizuda.snailjob.common.core.alarm.attribute.WebhookAttribute;
import com.aizuda.snailjob.common.core.enums.AlarmTypeEnum;
import com.aizuda.snailjob.common.core.enums.ContentTypeEnum;
import com.aizuda.snailjob.common.core.util.JsonUtil;
import com.aizuda.snailjob.common.log.SnailJobLog;
import lombok.Builder;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author: opensnail
* @date : 2024-05-07 10:15
*/
@Component
@RequiredArgsConstructor
public class WebhookAlarm extends AbstractAlarm<AlarmContext> {
@Override
public Integer getAlarmType() {
return AlarmTypeEnum.WEBHOOK.getValue();
}
@Override
public boolean syncSendMessage(AlarmContext alarmContext) {
WebhookAttribute webhookAttribute = JsonUtil.parseObject(alarmContext.getNotifyAttribute(), WebhookAttribute.class);
for (int i = 0; i < 2; i++) {
try {
WebhookMessage webhookMessage = WebhookMessage.builder().text(alarmContext.getTitle()).build();
HttpRequest post = HttpUtil.createPost(webhookAttribute.getWebhookUrl());
HttpRequest request = post.body(JsonUtil.toJsonString(webhookMessage), ContentTypeEnum.valueOf(webhookAttribute.getContentType()).getMediaType().toString())
.header("secret", webhookAttribute.getSecret());
HttpResponse execute = request.execute();
if (execute.isOk()) {
return true;
}
SnailJobLog.LOCAL.info("发送Webhook告警结果. webHook:[{}],结果: [{}]", webhookAttribute.getWebhookUrl(), execute.body());
break;
} catch (Exception e) {
SnailJobLog.LOCAL.error("发送Webhook告警异常. webHook:[{}]", webhookAttribute, e);
}
}
return true;
}
@Data
@Builder
private static class WebhookMessage {
private String text;
}
@Override
public boolean asyncSendMessage(List<AlarmContext> alarmContexts) {
for (AlarmContext alarmContext : alarmContexts) {
asyncSendMessage(alarmContext);
}
return true;
}
}

View File

@ -27,6 +27,11 @@ public enum AlarmTypeEnum {
* 飞书
*/
LARK(4),
/**
* Webhook
*/
WEBHOOK(5),
;
private final int value;

View File

@ -1,4 +1,4 @@
package com.aizuda.snailjob.server.common.enums;
package com.aizuda.snailjob.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;

View File

@ -103,7 +103,7 @@ public abstract class AbstractAlarm<E extends ApplicationEvent, A extends AlarmI
List<NotifyConfig> notifyConfigs = accessTemplate.getNotifyConfigAccess().list(
new LambdaQueryWrapper<NotifyConfig>()
.eq(NotifyConfig::getNotifyStatus, StatusEnum.YES.getStatus())
.in(NotifyConfig::getSystemTaskType, getSystemTaskType())
.in(NotifyConfig::getSystemTaskType, getSystemTaskType().stream().map(i -> i.getType()).collect(Collectors.toList()))
.eq(NotifyConfig::getNotifyScene, getNotifyScene())
.in(NotifyConfig::getNamespaceId, namespaceIds)
.in(NotifyConfig::getGroupName, groupNames)

View File

@ -2,16 +2,11 @@ package com.aizuda.snailjob.server.job.task.support.executor.workflow;
import cn.hutool.core.util.StrUtil;
import com.aizuda.snailjob.common.core.constant.SystemConstants;
import com.aizuda.snailjob.common.core.enums.JobOperationReasonEnum;
import com.aizuda.snailjob.common.core.enums.JobTaskBatchStatusEnum;
import com.aizuda.snailjob.common.core.enums.JobTaskStatusEnum;
import com.aizuda.snailjob.common.core.enums.StatusEnum;
import com.aizuda.snailjob.common.core.enums.WorkflowNodeTypeEnum;
import com.aizuda.snailjob.common.core.enums.*;
import com.aizuda.snailjob.common.core.util.JsonUtil;
import com.aizuda.snailjob.common.log.SnailJobLog;
import com.aizuda.snailjob.server.common.rpc.okhttp.RequestInterceptor;
import com.aizuda.snailjob.server.common.dto.CallbackConfig;
import com.aizuda.snailjob.server.common.enums.ContentTypeEnum;
import com.aizuda.snailjob.server.common.dto.JobLogMetaDTO;
import com.aizuda.snailjob.server.job.task.support.WorkflowTaskConverter;
import com.aizuda.snailjob.server.model.dto.CallbackParamsDTO;