From 9867847110f958f34f4d0ae088d4f72f3eb678b4 Mon Sep 17 00:00:00 2001 From: zqr10159 Date: Mon, 10 Jul 2023 22:41:45 +0800 Subject: [PATCH 01/17] [alert]add ServerChan Alert. --- .../hertzbeat/alert/AlerterProperties.java | 5 + .../ServerChanAlertNotifyHandlerImpl.java | 103 ++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 manager/src/main/java/org/dromara/hertzbeat/manager/component/alerter/impl/ServerChanAlertNotifyHandlerImpl.java diff --git a/alerter/src/main/java/org/dromara/hertzbeat/alert/AlerterProperties.java b/alerter/src/main/java/org/dromara/hertzbeat/alert/AlerterProperties.java index 1dba74cc3c3..050aa87081f 100644 --- a/alerter/src/main/java/org/dromara/hertzbeat/alert/AlerterProperties.java +++ b/alerter/src/main/java/org/dromara/hertzbeat/alert/AlerterProperties.java @@ -65,6 +65,11 @@ public class AlerterProperties { */ private String discordNotifyUrl = "https://discord.com/api/v9/channels/%s/messages"; + /** + * ServerChan Notify url + */ + private String serverChanNotifyUrl = "https://sctapi.ftqq.com/key.send"; + /** * 告警评估时间间隔起始基数 每下一次乘2 单位毫秒 * base of alert eval interval time, unit:ms. The next time is 2 times the previous time. diff --git a/manager/src/main/java/org/dromara/hertzbeat/manager/component/alerter/impl/ServerChanAlertNotifyHandlerImpl.java b/manager/src/main/java/org/dromara/hertzbeat/manager/component/alerter/impl/ServerChanAlertNotifyHandlerImpl.java new file mode 100644 index 00000000000..46f7eb85e48 --- /dev/null +++ b/manager/src/main/java/org/dromara/hertzbeat/manager/component/alerter/impl/ServerChanAlertNotifyHandlerImpl.java @@ -0,0 +1,103 @@ +package org.dromara.hertzbeat.manager.component.alerter.impl; + +import lombok.Data; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.hertzbeat.common.entity.alerter.Alert; +import org.dromara.hertzbeat.common.entity.manager.NoticeReceiver; +import org.dromara.hertzbeat.manager.support.exception.AlertNoticeException; +import org.springframework.http.*; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Slf4j +public class ServerChanAlertNotifyHandlerImpl extends AbstractAlertNotifyHandlerImpl{ + /** + * 发送报警通知 + * + * @param receiver Notification configuration information 通知配置信息 + * @param alert Alarm information 告警信息 + * @throws AlertNoticeException when send receiver error + */ + @Override + public void send(NoticeReceiver receiver, Alert alert) throws AlertNoticeException { + try { + ServerChanAlertNotifyHandlerImpl.ServerChanWebHookDto serverChanWebHookDto = new ServerChanAlertNotifyHandlerImpl.ServerChanWebHookDto(); + ServerChanAlertNotifyHandlerImpl.MarkdownDTO markdownDTO = new ServerChanAlertNotifyHandlerImpl.MarkdownDTO(); + markdownDTO.setText(renderContent(alert)); + markdownDTO.setTitle(bundle.getString("alerter.notify.title")); + serverChanWebHookDto.setMarkdown(markdownDTO); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity httpEntity = new HttpEntity<>(serverChanWebHookDto, headers); + String webHookUrl = alerterProperties.getServerChanNotifyUrl() + receiver.getAccessToken(); + ResponseEntity responseEntity = restTemplate.postForEntity(webHookUrl, + httpEntity, CommonRobotNotifyResp.class); + if (responseEntity.getStatusCode() == HttpStatus.OK) { + assert responseEntity.getBody() != null; + if (responseEntity.getBody().getErrCode() == 0) { + log.debug("Send ServerChan webHook: {} Success", webHookUrl); + } else { + log.warn("Send ServerChan webHook: {} Failed: {}", webHookUrl, responseEntity.getBody().getErrMsg()); + throw new AlertNoticeException(responseEntity.getBody().getErrMsg()); + } + } else { + log.warn("Send ServerChan webHook: {} Failed: {}", webHookUrl, responseEntity.getBody()); + throw new AlertNoticeException("Http StatusCode " + responseEntity.getStatusCode()); + } + } catch (Exception e) { + throw new AlertNoticeException("[ServerChan Notify Error] " + e.getMessage()); + } + } + + /** + * 通知类型 + * + * @return 通知类型 + */ + @Override + public byte type() { + return 12; + } + + /** + * Get the Thymeleaf template name + * 获取Thymeleaf模板名称 + * + * @return Thymeleaf模板名称 + */ + @Override + protected String templateName() { + return "alertNotifyServerChan"; + } + + @Data + private static class ServerChanWebHookDto { + private static final String MARKDOWN = "markdown"; + + /** + * 消息类型 + */ + private String msgtype = MARKDOWN; + + /** + * markdown消息 + */ + private ServerChanAlertNotifyHandlerImpl.MarkdownDTO markdown; + + } + + @Data + private static class MarkdownDTO { + /** + * 消息内容 + */ + private String text; + /** + * 消息标题 + */ + private String title; + } + +} From ff56e5716fdcf1b58a7b8730384eb1552262df2d Mon Sep 17 00:00:00 2001 From: zqr10159 Date: Wed, 12 Jul 2023 15:28:41 +0800 Subject: [PATCH 02/17] Support sending alert to ServerChan --- .../hertzbeat/alert/AlerterProperties.java | 2 +- .../common/entity/manager/NoticeReceiver.java | 7 ++++ .../ServerChanAlertNotifyHandlerImpl.java | 36 +++++-------------- .../templates/alertNotifyServerChan.txt | 7 ++++ web-app/src/app/pojo/NoticeReceiver.ts | 3 +- .../alert-notice/alert-notice.component.html | 13 +++++++ .../alert-notice/alert-notice.component.ts | 3 ++ web-app/src/assets/i18n/en-US.json | 2 ++ web-app/src/assets/i18n/zh-CN.json | 2 ++ web-app/src/assets/i18n/zh-TW.json | 2 ++ 10 files changed, 47 insertions(+), 30 deletions(-) create mode 100644 manager/src/main/resources/templates/alertNotifyServerChan.txt diff --git a/alerter/src/main/java/org/dromara/hertzbeat/alert/AlerterProperties.java b/alerter/src/main/java/org/dromara/hertzbeat/alert/AlerterProperties.java index 050aa87081f..82c17b3b65b 100644 --- a/alerter/src/main/java/org/dromara/hertzbeat/alert/AlerterProperties.java +++ b/alerter/src/main/java/org/dromara/hertzbeat/alert/AlerterProperties.java @@ -68,7 +68,7 @@ public class AlerterProperties { /** * ServerChan Notify url */ - private String serverChanNotifyUrl = "https://sctapi.ftqq.com/key.send"; + private String serverChanNotifyUrl = "https://sctapi.ftqq.com/%s.send"; /** * 告警评估时间间隔起始基数 每下一次乘2 单位毫秒 diff --git a/common/src/main/java/org/dromara/hertzbeat/common/entity/manager/NoticeReceiver.java b/common/src/main/java/org/dromara/hertzbeat/common/entity/manager/NoticeReceiver.java index c0dc853f508..633b3626c0c 100644 --- a/common/src/main/java/org/dromara/hertzbeat/common/entity/manager/NoticeReceiver.java +++ b/common/src/main/java/org/dromara/hertzbeat/common/entity/manager/NoticeReceiver.java @@ -188,6 +188,13 @@ public class NoticeReceiver { @Column(length = 300) private String smnTopicUrn; + @Schema(title = "serverChanToken : The notification method is valid for ServerChan", + description = "访问token : 通知方式为Server酱有效", + example = "SCT193569TSNm6xIabdjqeZPtOGOWcvU1e", accessMode = READ_WRITE) + @Length(max = 300) + @Column(length = 300) + private String serverChanToken; + @Schema(title = "The creator of this record", description = "此条记录创建者", example = "tom", accessMode = READ_ONLY) @CreatedBy diff --git a/manager/src/main/java/org/dromara/hertzbeat/manager/component/alerter/impl/ServerChanAlertNotifyHandlerImpl.java b/manager/src/main/java/org/dromara/hertzbeat/manager/component/alerter/impl/ServerChanAlertNotifyHandlerImpl.java index 46f7eb85e48..d6f06d037f2 100644 --- a/manager/src/main/java/org/dromara/hertzbeat/manager/component/alerter/impl/ServerChanAlertNotifyHandlerImpl.java +++ b/manager/src/main/java/org/dromara/hertzbeat/manager/component/alerter/impl/ServerChanAlertNotifyHandlerImpl.java @@ -24,24 +24,17 @@ public class ServerChanAlertNotifyHandlerImpl extends AbstractAlertNotifyHandler public void send(NoticeReceiver receiver, Alert alert) throws AlertNoticeException { try { ServerChanAlertNotifyHandlerImpl.ServerChanWebHookDto serverChanWebHookDto = new ServerChanAlertNotifyHandlerImpl.ServerChanWebHookDto(); - ServerChanAlertNotifyHandlerImpl.MarkdownDTO markdownDTO = new ServerChanAlertNotifyHandlerImpl.MarkdownDTO(); - markdownDTO.setText(renderContent(alert)); - markdownDTO.setTitle(bundle.getString("alerter.notify.title")); - serverChanWebHookDto.setMarkdown(markdownDTO); + serverChanWebHookDto.setTitle(bundle.getString("alerter.notify.title")); + serverChanWebHookDto.setDesp(renderContent(alert)); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity httpEntity = new HttpEntity<>(serverChanWebHookDto, headers); - String webHookUrl = alerterProperties.getServerChanNotifyUrl() + receiver.getAccessToken(); + String webHookUrl = String.format(alerterProperties.getServerChanNotifyUrl(),receiver.getServerChanToken()); ResponseEntity responseEntity = restTemplate.postForEntity(webHookUrl, httpEntity, CommonRobotNotifyResp.class); + System.out.println(responseEntity); if (responseEntity.getStatusCode() == HttpStatus.OK) { - assert responseEntity.getBody() != null; - if (responseEntity.getBody().getErrCode() == 0) { log.debug("Send ServerChan webHook: {} Success", webHookUrl); - } else { - log.warn("Send ServerChan webHook: {} Failed: {}", webHookUrl, responseEntity.getBody().getErrMsg()); - throw new AlertNoticeException(responseEntity.getBody().getErrMsg()); - } } else { log.warn("Send ServerChan webHook: {} Failed: {}", webHookUrl, responseEntity.getBody()); throw new AlertNoticeException("Http StatusCode " + responseEntity.getStatusCode()); @@ -75,29 +68,16 @@ protected String templateName() { @Data private static class ServerChanWebHookDto { private static final String MARKDOWN = "markdown"; - /** - * 消息类型 + * 标题 */ - private String msgtype = MARKDOWN; - + private String title; /** - * markdown消息 + * markdown消息内容 */ - private ServerChanAlertNotifyHandlerImpl.MarkdownDTO markdown; + private String desp; } - @Data - private static class MarkdownDTO { - /** - * 消息内容 - */ - private String text; - /** - * 消息标题 - */ - private String title; - } } diff --git a/manager/src/main/resources/templates/alertNotifyServerChan.txt b/manager/src/main/resources/templates/alertNotifyServerChan.txt new file mode 100644 index 00000000000..0e3fd4ef92c --- /dev/null +++ b/manager/src/main/resources/templates/alertNotifyServerChan.txt @@ -0,0 +1,7 @@ +#### [(${title})] +##### **[(${targetLabel})]** : [(${target})] +[# th:if="${monitorId != null}"] ##### **[(${monitorIdLabel})]** : [(${monitorId})][/] +[# th:if="${monitorName != null}"] ##### **[(${monitorNameLabel})]** : [(${monitorName})][/] + ##### **[(${priorityLabel})]** : [(${priority})] + ##### **[(${triggerTimeLabel})]** : [(${triggerTime})] + ##### **[(${contentLabel})]** : [(${content})] \ No newline at end of file diff --git a/web-app/src/app/pojo/NoticeReceiver.ts b/web-app/src/app/pojo/NoticeReceiver.ts index 7cf1082b8d5..507c38a0629 100644 --- a/web-app/src/app/pojo/NoticeReceiver.ts +++ b/web-app/src/app/pojo/NoticeReceiver.ts @@ -2,7 +2,7 @@ export class NoticeReceiver { id!: number; name!: string; // 通知信息方式: 0-手机短信 1-邮箱 2-webhook 3-微信公众号 4-企业微信机器人 5-钉钉机器人 6-飞书机器人 - // 7-Telegram机器人 8-SlackWebHook 9-Discord机器人 10-企业微信应用消息 11-华为云SMN + // 7-Telegram机器人 8-SlackWebHook 9-Discord机器人 10-企业微信应用消息 11-华为云SMN 12-Server酱 type: number = 1; phone!: string; email!: string; @@ -22,6 +22,7 @@ export class NoticeReceiver { smnProjectId!: string; smnRegion!: string; smnTopicUrn!: string; + serverChanToken!: string; creator!: string; modifier!: string; gmtCreate!: number; diff --git a/web-app/src/app/routes/alert/alert-notice/alert-notice.component.html b/web-app/src/app/routes/alert/alert-notice/alert-notice.component.html index f31b200a297..ac6873177b6 100644 --- a/web-app/src/app/routes/alert/alert-notice/alert-notice.component.html +++ b/web-app/src/app/routes/alert/alert-notice/alert-notice.component.html @@ -103,6 +103,10 @@ {{ 'alert.notice.type.smn' | i18n }} + + + {{ 'alert.notice.type.serverchan' | i18n }} + {{ data.phone }} @@ -117,6 +121,7 @@ {{ data.discordChannelId }}
{{ data.discordBotToken }}
{{ data.corpId }}
{{ data.agentId }}
{{ data.appSecret }}
{{ data.smnAk }} + {{ data.serverChanToken }} {{ (data.gmtUpdate ? data.gmtUpdate : data.gmtCreate) | date : 'YYYY-MM-dd HH:mm:ss' }} @@ -249,6 +254,7 @@ + @@ -406,6 +412,13 @@ + + {{ + 'alert.notice.type.serverchan-token' | i18n }} + + + +