From f8706aae923693012e3903dac805ebcc9716934f Mon Sep 17 00:00:00 2001 From: a-little-fool <2030509072@qq.com> Date: Thu, 6 Mar 2025 16:36:04 +0800 Subject: [PATCH 01/15] [feature] Add SMSLocal notification service --- .../hertzbeat/alert/config/SmsConfig.java | 4 + .../alert/config/SmslocalSmsProperties.java | 13 ++ .../alert/service/SmsClientFactory.java | 8 +- .../service/impl/SmsLocalSmsClientImpl.java | 116 ++++++++++++++++++ .../common/constants/SmsConstants.java | 3 + .../src/main/resources/application.yml | 4 +- 6 files changed, 144 insertions(+), 4 deletions(-) create mode 100644 hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java create mode 100644 hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmsConfig.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmsConfig.java index 0ccd04cc43c..b1d2f0e3882 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmsConfig.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmsConfig.java @@ -54,4 +54,8 @@ public class SmsConfig { */ private UniSmsProperties unisms; + /** + * Smslocal SMS configuration + */ + private SmslocalSmsProperties smslocal; } \ No newline at end of file diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java new file mode 100644 index 00000000000..ea2839ea846 --- /dev/null +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java @@ -0,0 +1,13 @@ +package org.apache.hertzbeat.alert.config; + + +import lombok.Data; + +@Data +public class SmslocalSmsProperties { + /** + * SmsLocal account api key + */ + private String apiKey; + +} diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/SmsClientFactory.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/SmsClientFactory.java index 4b56a81b34e..349b22c2684 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/SmsClientFactory.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/SmsClientFactory.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.apache.hertzbeat.alert.config.SmsConfig; +import org.apache.hertzbeat.alert.service.impl.SmsLocalSmsClientImpl; import org.apache.hertzbeat.alert.service.impl.TencentSmsClientImpl; import org.apache.hertzbeat.alert.service.impl.UniSmsClientImpl; import org.apache.hertzbeat.alert.service.impl.AlibabaSmsClientImpl; @@ -30,9 +31,7 @@ import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; -import static org.apache.hertzbeat.common.constants.SmsConstants.ALIBABA; -import static org.apache.hertzbeat.common.constants.SmsConstants.TENCENT; -import static org.apache.hertzbeat.common.constants.SmsConstants.UNISMS; +import static org.apache.hertzbeat.common.constants.SmsConstants.*; /** * SMS client factory @@ -133,6 +132,9 @@ private void createSmsClient(SmsConfig smsConfig) { case ALIBABA: currentSmsClient = new AlibabaSmsClientImpl(smsConfig.getAlibaba()); break; + case SMSLOCAL: + currentSmsClient = new SmsLocalSmsClientImpl(smsConfig.getSmslocal()); + break; default: log.warn("[SmsClientFactory] Unsupported SMS provider type: {}", smsConfig.getType()); break; diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java new file mode 100644 index 00000000000..171f03b5690 --- /dev/null +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java @@ -0,0 +1,116 @@ +package org.apache.hertzbeat.alert.service.impl; + +import com.fasterxml.jackson.databind.JsonNode; +import lombok.extern.slf4j.Slf4j; +import org.apache.hertzbeat.alert.config.SmslocalSmsProperties; +import org.apache.hertzbeat.alert.service.SmsClient; +import org.apache.hertzbeat.common.constants.SmsConstants; +import org.apache.hertzbeat.common.entity.alerter.GroupAlert; +import org.apache.hertzbeat.common.entity.alerter.NoticeReceiver; +import org.apache.hertzbeat.common.entity.alerter.NoticeTemplate; +import org.apache.hertzbeat.common.support.exception.SendMessageException; +import org.apache.hertzbeat.common.util.JsonUtil; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; + +import java.nio.charset.StandardCharsets; +import java.util.Objects; + +@Slf4j +public class SmsLocalSmsClientImpl implements SmsClient { + private static final String HOST = "secure.smslocal.com"; + + private static final String PATH = "/api/service/enterprise-service/external/sms"; + + private static final String FROM = "Hertzbeat"; + + private static final String SUCCESS_CODE = "200"; + + private final SmslocalSmsProperties config; + + public SmsLocalSmsClientImpl(SmslocalSmsProperties smslocalSmsProperties) { + this.config = smslocalSmsProperties; + } + + @Override + public void sendMessage(NoticeReceiver receiver, NoticeTemplate noticeTemplate, GroupAlert alert) { + if (Objects.isNull(receiver) || Objects.isNull(alert)) { + log.warn("receiver and alert can not be null! receiver: {}, alert:{}", receiver, alert); + return ; + } + + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + String content = alert.getCommonAnnotations().get("summary"); + SmsMessage smsMessage = new SmsMessage(FROM, receiver.getPhone(), Objects.isNull(content) ? alert.getCommonAnnotations().get("description") : content); + + String payload = JsonUtil.toJson(smsMessage); + + HttpPost httpPost = new HttpPost("https://" + HOST + PATH); + httpPost.setHeader("Content-Type", "application/json; charset=utf-8"); + httpPost.setHeader("Token", config.getApiKey()); + httpPost.setEntity(new StringEntity(payload, StandardCharsets.UTF_8)); + + log.debug("Sending SMS request to {}, payload: {}", httpPost.getURI(), payload); + + // send http request and handle response + try (CloseableHttpResponse response = httpClient.execute(httpPost)) { + int statusCode = response.getStatusLine().getStatusCode(); + String responseBody = EntityUtils.toString(response.getEntity()); + + log.debug("SMS response status: {}, body: {}", statusCode, responseBody); + + if (statusCode != 200) { + throw new SendMessageException("HTTP request failed with status code: " + statusCode); + } + + JsonNode jsonResponse = JsonUtil.fromJson(responseBody); + String errorcode = jsonResponse.get("errorcode").asText(); + if (!SUCCESS_CODE.equals(errorcode)) { + String msgid = jsonResponse.get("msgid").asText(); + throw new SendMessageException(errorcode + ":" + msgid); + } + + log.info("Successfully sent SMS to phone: {}", receiver.getPhone()); + } + } catch (Exception e) { + log.error("Failed to send SMS: {}", e.getMessage()); + throw new SendMessageException(e.getMessage()); + } + + } + + @Override + public String getType() { + return SmsConstants.SMSLOCAL; + } + + @Override + public boolean checkConfig() { + if (Objects.isNull(config) || Objects.isNull(config.getApiKey()) + || config.getApiKey().isBlank()) { + log.warn("smslocal properties can not be null: {}", config); + return false; + } + return true; + } + + + private static class SmsMessage { + String from; + String to; + String content; + final int datacoding = 0; + final String direction = "mt"; + + public SmsMessage(String from, String to, String content) { + this.from = from; + this.to = to; + this.content = content; + } + } + +} diff --git a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/constants/SmsConstants.java b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/constants/SmsConstants.java index addb5a65734..ac48836b6a0 100644 --- a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/constants/SmsConstants.java +++ b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/constants/SmsConstants.java @@ -29,4 +29,7 @@ public interface SmsConstants { // UniSMS String UNISMS = "unisms"; + + // Smslocal SMS + String SMSLOCAL = "smslocal"; } diff --git a/hertzbeat-manager/src/main/resources/application.yml b/hertzbeat-manager/src/main/resources/application.yml index 9e7c36e21a7..cc6f8ccbf93 100644 --- a/hertzbeat-manager/src/main/resources/application.yml +++ b/hertzbeat-manager/src/main/resources/application.yml @@ -225,6 +225,8 @@ alerter: access-key-secret: YOUR_ACCESS_KEY_SECRET signature: YOUR_SMS_SIGNATURE template-id: YOUR_TEMPLATE_ID + smslocal: + api-key: YOUR_API_KEY_HERE scheduler: server: @@ -247,4 +249,4 @@ ai: # api key api-key: #At present, only IFLYTEK large model needs to be filled in - api-secret: + api-secret: 04163b67-6cdc-4310-8394-681db4cca694 From 2fe9c1cb9d93057157892b6e6f9fdccbf4fc63da Mon Sep 17 00:00:00 2001 From: a-little-fool <2030509072@qq.com> Date: Thu, 6 Mar 2025 16:49:35 +0800 Subject: [PATCH 02/15] [improve] Add apache license --- .../alert/config/SmslocalSmsProperties.java | 17 +++++++++++++++++ .../service/impl/SmsLocalSmsClientImpl.java | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java index ea2839ea846..c0ed12bc478 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.apache.hertzbeat.alert.config; diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java index 171f03b5690..3da72369f11 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.apache.hertzbeat.alert.service.impl; import com.fasterxml.jackson.databind.JsonNode; From 5454099532f13581816d0951b36c7c590debaeed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B7=9E=E7=AD=B1?= <105542329+a-little-fool@users.noreply.github.com> Date: Thu, 6 Mar 2025 16:52:08 +0800 Subject: [PATCH 03/15] Update hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Signed-off-by: 淞筱 <105542329+a-little-fool@users.noreply.github.com> --- .../service/impl/SmsLocalSmsClientImpl.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java index 3da72369f11..91be1a4777a 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java @@ -15,6 +15,25 @@ * limitations under the License. */ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + package org.apache.hertzbeat.alert.service.impl; import com.fasterxml.jackson.databind.JsonNode; From 7e349bfa27ee10d8b27ada0080b8a4b3185db4a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B7=9E=E7=AD=B1?= <105542329+a-little-fool@users.noreply.github.com> Date: Thu, 6 Mar 2025 16:55:03 +0800 Subject: [PATCH 04/15] Update hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Signed-off-by: 淞筱 <105542329+a-little-fool@users.noreply.github.com> --- .../alert/config/SmslocalSmsProperties.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java index c0ed12bc478..d84555f20b1 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java @@ -15,6 +15,25 @@ * limitations under the License. */ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + package org.apache.hertzbeat.alert.config; From fc6406b1c1511d35ee7c1f7b820a8c9c347119e2 Mon Sep 17 00:00:00 2001 From: a-little-fool <2030509072@qq.com> Date: Thu, 6 Mar 2025 16:59:46 +0800 Subject: [PATCH 05/15] [improve] deal apache license --- .../alert/config/SmslocalSmsProperties.java | 19 ------------------- .../service/impl/SmsLocalSmsClientImpl.java | 19 ------------------- 2 files changed, 38 deletions(-) diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java index d84555f20b1..c0ed12bc478 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java @@ -15,25 +15,6 @@ * limitations under the License. */ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - package org.apache.hertzbeat.alert.config; diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java index 91be1a4777a..3da72369f11 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java @@ -15,25 +15,6 @@ * limitations under the License. */ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - package org.apache.hertzbeat.alert.service.impl; import com.fasterxml.jackson.databind.JsonNode; From 0b8c4e7c36b45157993366d2acbfc727d33671a7 Mon Sep 17 00:00:00 2001 From: a-little-fool <2030509072@qq.com> Date: Thu, 6 Mar 2025 17:08:21 +0800 Subject: [PATCH 06/15] [improve] format code --- .../apache/hertzbeat/alert/service/SmsClientFactory.java | 4 +--- .../alert/service/impl/SmsLocalSmsClientImpl.java | 9 ++++----- .../apache/hertzbeat/common/constants/SmsConstants.java | 4 ++-- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/SmsClientFactory.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/SmsClientFactory.java index 349b22c2684..cec021b598e 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/SmsClientFactory.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/SmsClientFactory.java @@ -48,9 +48,7 @@ public class SmsClientFactory { private volatile SmsClient currentSmsClient; - public SmsClientFactory(GeneralConfigDao generalConfigDao, - ObjectMapper objectMapper, - SmsConfig yamlSmsConfig) { + public SmsClientFactory(GeneralConfigDao generalConfigDao, ObjectMapper objectMapper, SmsConfig yamlSmsConfig) { this.generalConfigDao = generalConfigDao; this.objectMapper = objectMapper; this.yamlSmsConfig = yamlSmsConfig; diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java index 3da72369f11..304d4064a1c 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java @@ -49,7 +49,7 @@ public class SmsLocalSmsClientImpl implements SmsClient { private final SmslocalSmsProperties config; - public SmsLocalSmsClientImpl(SmslocalSmsProperties smslocalSmsProperties) { + public SmsLocalSmsClientImpl(SmslocalSmsProperties smslocalSmsProperties) { this.config = smslocalSmsProperties; } @@ -57,7 +57,7 @@ public SmsLocalSmsClientImpl(SmslocalSmsProperties smslocalSmsProperties) { public void sendMessage(NoticeReceiver receiver, NoticeTemplate noticeTemplate, GroupAlert alert) { if (Objects.isNull(receiver) || Objects.isNull(alert)) { log.warn("receiver and alert can not be null! receiver: {}, alert:{}", receiver, alert); - return ; + return; } try (CloseableHttpClient httpClient = HttpClients.createDefault()) { @@ -88,7 +88,7 @@ public void sendMessage(NoticeReceiver receiver, NoticeTemplate noticeTemplate, String errorcode = jsonResponse.get("errorcode").asText(); if (!SUCCESS_CODE.equals(errorcode)) { String msgid = jsonResponse.get("msgid").asText(); - throw new SendMessageException(errorcode + ":" + msgid); + throw new SendMessageException(errorcode + ":" + msgid); } log.info("Successfully sent SMS to phone: {}", receiver.getPhone()); @@ -107,8 +107,7 @@ public String getType() { @Override public boolean checkConfig() { - if (Objects.isNull(config) || Objects.isNull(config.getApiKey()) - || config.getApiKey().isBlank()) { + if (Objects.isNull(config) || Objects.isNull(config.getApiKey()) || config.getApiKey().isBlank()) { log.warn("smslocal properties can not be null: {}", config); return false; } diff --git a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/constants/SmsConstants.java b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/constants/SmsConstants.java index ac48836b6a0..037c257e350 100644 --- a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/constants/SmsConstants.java +++ b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/constants/SmsConstants.java @@ -23,10 +23,10 @@ public interface SmsConstants { // Tencent cloud SMS String TENCENT = "tencent"; - + // Alibaba Cloud SMS String ALIBABA = "alibaba"; - + // UniSMS String UNISMS = "unisms"; From 4746951967aafeec1f78dbde7d4d427f13994964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B7=9E=E7=AD=B1?= <105542329+a-little-fool@users.noreply.github.com> Date: Sat, 8 Mar 2025 10:43:11 +0800 Subject: [PATCH 07/15] Update hertzbeat-manager/src/main/resources/application.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: yunfan24 Signed-off-by: 淞筱 <105542329+a-little-fool@users.noreply.github.com> --- hertzbeat-manager/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hertzbeat-manager/src/main/resources/application.yml b/hertzbeat-manager/src/main/resources/application.yml index cc6f8ccbf93..64c0e7c6eea 100644 --- a/hertzbeat-manager/src/main/resources/application.yml +++ b/hertzbeat-manager/src/main/resources/application.yml @@ -249,4 +249,4 @@ ai: # api key api-key: #At present, only IFLYTEK large model needs to be filled in - api-secret: 04163b67-6cdc-4310-8394-681db4cca694 + api-secret: From c65bd9174e71478b965bb45bd38492584fdb8f11 Mon Sep 17 00:00:00 2001 From: a-little-fool <2030509072@qq.com> Date: Sun, 9 Mar 2025 09:27:15 +0800 Subject: [PATCH 08/15] fix --- .../alert/config/SmslocalSmsProperties.java | 4 +++ .../alert/service/SmsClientFactory.java | 5 +++- .../service/impl/SmsLocalSmsClientImpl.java | 8 ++++-- script/application.yml | 2 ++ .../conf/application.yml | 2 ++ .../conf/application.yml | 2 ++ .../conf/application.yml | 2 ++ .../conf/application.yml | 2 ++ web-app/src/app/pojo/SmsNoticeSender.ts | 2 ++ web-app/src/app/pojo/SmslocalSmsConfig.ts | 22 ++++++++++++++++ web-app/src/app/pojo/enums/sms-type.enum.ts | 3 ++- .../message-server.component.html | 26 ++++++++++++++++++- .../message-server.component.ts | 8 ++++-- web-app/src/assets/i18n/en-US.json | 2 ++ web-app/src/assets/i18n/ja-JP.json | 2 ++ web-app/src/assets/i18n/zh-CN.json | 2 ++ web-app/src/assets/i18n/zh-TW.json | 2 ++ 17 files changed, 89 insertions(+), 7 deletions(-) create mode 100644 web-app/src/app/pojo/SmslocalSmsConfig.ts diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java index c0ed12bc478..2df05262034 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java @@ -20,6 +20,10 @@ import lombok.Data; +/** + * Smslocal SMS Properties + * @author zhoushusheng + */ @Data public class SmslocalSmsProperties { /** diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/SmsClientFactory.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/SmsClientFactory.java index cec021b598e..6e2c099e3ac 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/SmsClientFactory.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/SmsClientFactory.java @@ -31,7 +31,10 @@ import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; -import static org.apache.hertzbeat.common.constants.SmsConstants.*; +import static org.apache.hertzbeat.common.constants.SmsConstants.ALIBABA; +import static org.apache.hertzbeat.common.constants.SmsConstants.TENCENT; +import static org.apache.hertzbeat.common.constants.SmsConstants.UNISMS; +import static org.apache.hertzbeat.common.constants.SmsConstants.SMSLOCAL; /** * SMS client factory diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java index 304d4064a1c..0ceacac3ed6 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java @@ -37,6 +37,10 @@ import java.nio.charset.StandardCharsets; import java.util.Objects; +/** + * Smslocal SMS Client Implement + * @author zhoushusheng + */ @Slf4j public class SmsLocalSmsClientImpl implements SmsClient { private static final String HOST = "secure.smslocal.com"; @@ -119,8 +123,8 @@ private static class SmsMessage { String from; String to; String content; - final int datacoding = 0; - final String direction = "mt"; +// final int datacoding = 0; +// final String direction = "mt"; public SmsMessage(String from, String to, String content) { this.from = from; diff --git a/script/application.yml b/script/application.yml index 25b78000897..1e7afff4eff 100644 --- a/script/application.yml +++ b/script/application.yml @@ -224,6 +224,8 @@ alerter: access-key-secret: YOUR_ACCESS_KEY_SECRET signature: YOUR_SMS_SIGNATURE template-id: YOUR_TEMPLATE_ID + smslocal: + api-key: YOUR_API_KEY_HERE scheduler: server: diff --git a/script/docker-compose/hertzbeat-mysql-iotdb/conf/application.yml b/script/docker-compose/hertzbeat-mysql-iotdb/conf/application.yml index ac5c548f916..9e70de48058 100644 --- a/script/docker-compose/hertzbeat-mysql-iotdb/conf/application.yml +++ b/script/docker-compose/hertzbeat-mysql-iotdb/conf/application.yml @@ -191,6 +191,8 @@ alerter: access-key-secret: YOUR_ACCESS_KEY_SECRET signature: YOUR_SMS_SIGNATURE template-id: YOUR_TEMPLATE_ID + smslocal: + api-key: YOUR_API_KEY_HERE scheduler: server: diff --git a/script/docker-compose/hertzbeat-mysql-tdengine/conf/application.yml b/script/docker-compose/hertzbeat-mysql-tdengine/conf/application.yml index ab5e0a064d3..f0cc570ec6e 100644 --- a/script/docker-compose/hertzbeat-mysql-tdengine/conf/application.yml +++ b/script/docker-compose/hertzbeat-mysql-tdengine/conf/application.yml @@ -187,6 +187,8 @@ alerter: access-key-secret: YOUR_ACCESS_KEY_SECRET signature: YOUR_SMS_SIGNATURE template-id: YOUR_TEMPLATE_ID + smslocal: + api-key: YOUR_API_KEY_HERE scheduler: server: diff --git a/script/docker-compose/hertzbeat-mysql-victoria-metrics/conf/application.yml b/script/docker-compose/hertzbeat-mysql-victoria-metrics/conf/application.yml index 5f753b66d37..f6a23a097be 100644 --- a/script/docker-compose/hertzbeat-mysql-victoria-metrics/conf/application.yml +++ b/script/docker-compose/hertzbeat-mysql-victoria-metrics/conf/application.yml @@ -185,6 +185,8 @@ alerter: access-key-secret: YOUR_ACCESS_KEY_SECRET signature: YOUR_SMS_SIGNATURE template-id: YOUR_TEMPLATE_ID + smslocal: + api-key: YOUR_API_KEY_HERE scheduler: server: diff --git a/script/docker-compose/hertzbeat-postgresql-victoria-metrics/conf/application.yml b/script/docker-compose/hertzbeat-postgresql-victoria-metrics/conf/application.yml index 7823cb3891d..f830c469c10 100644 --- a/script/docker-compose/hertzbeat-postgresql-victoria-metrics/conf/application.yml +++ b/script/docker-compose/hertzbeat-postgresql-victoria-metrics/conf/application.yml @@ -184,6 +184,8 @@ alerter: access-key-secret: YOUR_ACCESS_KEY_SECRET signature: YOUR_SMS_SIGNATURE template-id: YOUR_TEMPLATE_ID + smslocal: + api-key: YOUR_API_KEY_HERE scheduler: server: diff --git a/web-app/src/app/pojo/SmsNoticeSender.ts b/web-app/src/app/pojo/SmsNoticeSender.ts index f31a6cb7b64..c3f275ac9db 100644 --- a/web-app/src/app/pojo/SmsNoticeSender.ts +++ b/web-app/src/app/pojo/SmsNoticeSender.ts @@ -21,6 +21,7 @@ import { AlibabaSmsConfig } from './AlibabaSmsConfig'; import { TencentSmsConfig } from './TencentSmsConfig'; import { UniSmsConfig } from './UniSmsConfig'; import { SmsType } from './enums/sms-type.enum'; +import {SmslocalSmsConfig} from "./SmslocalSmsConfig"; export class SmsNoticeSender { id!: number; @@ -28,6 +29,7 @@ export class SmsNoticeSender { tencent: TencentSmsConfig = new TencentSmsConfig(); alibaba: AlibabaSmsConfig = new AlibabaSmsConfig(); unisms: UniSmsConfig = new UniSmsConfig(); + smslocal: SmslocalSmsConfig = new SmslocalSmsConfig(); enable: boolean = false; creator!: string; modifier!: string; diff --git a/web-app/src/app/pojo/SmslocalSmsConfig.ts b/web-app/src/app/pojo/SmslocalSmsConfig.ts new file mode 100644 index 00000000000..cb82d0026d3 --- /dev/null +++ b/web-app/src/app/pojo/SmslocalSmsConfig.ts @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export class SmslocalSmsConfig { + apiKey!: string +} diff --git a/web-app/src/app/pojo/enums/sms-type.enum.ts b/web-app/src/app/pojo/enums/sms-type.enum.ts index 4446d50bb91..7cddd0ffad8 100644 --- a/web-app/src/app/pojo/enums/sms-type.enum.ts +++ b/web-app/src/app/pojo/enums/sms-type.enum.ts @@ -20,7 +20,8 @@ export enum SmsType { TENCENT = 'tencent', ALIBABA = 'alibaba', - UNISMS = 'unisms' + UNISMS = 'unisms', + SMSLOCAL = 'smslocal' } export enum UniSmsAuthMode { diff --git a/web-app/src/app/routes/setting/settings/message-server/message-server.component.html b/web-app/src/app/routes/setting/settings/message-server/message-server.component.html index cb5034ad5ba..ee8e8800e58 100644 --- a/web-app/src/app/routes/setting/settings/message-server/message-server.component.html +++ b/web-app/src/app/routes/setting/settings/message-server/message-server.component.html @@ -72,6 +72,11 @@
{{ 'alert.notice.sender.sms.unisms.authMode' | i18n }}: {{ smsNoticeSender.unisms.authMode }} + + + + {{ 'alert.notice.sender.sms.smslocal.signature' | i18n }}: {{ smsNoticeSender.smslocal.apiKey }} +
{{ 'common.enable' | i18n }}: {{ smsNoticeSender.enable ? ('common.yes' | i18n) : ('common.no' | i18n) }} @@ -139,7 +144,7 @@ - + + + + @@ -201,6 +209,8 @@ + + @@ -256,6 +266,8 @@ + + @@ -317,6 +329,18 @@ + + + + + + {{ 'alert.notice.sender.sms.smslocal.apiKey' | i18n }} + + + + + + {{ 'common.enable' | i18n }} diff --git a/web-app/src/app/routes/setting/settings/message-server/message-server.component.ts b/web-app/src/app/routes/setting/settings/message-server/message-server.component.ts index b0e628ee687..4687d1885ad 100644 --- a/web-app/src/app/routes/setting/settings/message-server/message-server.component.ts +++ b/web-app/src/app/routes/setting/settings/message-server/message-server.component.ts @@ -32,6 +32,7 @@ import { SmsType, UniSmsAuthMode } from 'src/app/pojo/enums/sms-type.enum'; import { EmailNoticeSender } from '../../../../pojo/EmailNoticeSender'; import { GeneralConfigService } from '../../../../service/general-config.service'; +import {SmslocalSmsConfig} from "../../../../pojo/SmslocalSmsConfig"; @Component({ selector: 'app-message-server', @@ -142,6 +143,7 @@ export class MessageServerComponent implements OnInit { this.smsNoticeSender.tencent = { ...new TencentSmsConfig(), ...message.data.tencent }; this.smsNoticeSender.alibaba = { ...new AlibabaSmsConfig(), ...message.data.alibaba }; this.smsNoticeSender.unisms = { ...new UniSmsConfig(), ...message.data.unisms }; + this.smsNoticeSender.smslocal = { ...new SmslocalSmsConfig(), ...message.data.smslocal }; this.smsType = message.data.type || 'tencent'; } else { this.smsNoticeSender = new SmsNoticeSender(); @@ -165,7 +167,8 @@ export class MessageServerComponent implements OnInit { ...this.smsNoticeSender, tencent: { ...this.smsNoticeSender.tencent }, alibaba: { ...this.smsNoticeSender.alibaba }, - unisms: { ...this.smsNoticeSender.unisms } + unisms: { ...this.smsNoticeSender.unisms }, + smslocal: { ...this.smsNoticeSender.smslocal } }; this.isSmsServerModalVisible = true; } @@ -176,7 +179,8 @@ export class MessageServerComponent implements OnInit { ...this.tempSmsNoticeSender, tencent: { ...this.tempSmsNoticeSender.tencent }, alibaba: { ...this.tempSmsNoticeSender.alibaba }, - unisms: { ...this.tempSmsNoticeSender.unisms } + unisms: { ...this.tempSmsNoticeSender.unisms }, + smslocal: { ...this.tempSmsNoticeSender.smslocal } }; this.isSmsServerModalVisible = false; } diff --git a/web-app/src/assets/i18n/en-US.json b/web-app/src/assets/i18n/en-US.json index 1832a68e9e1..e57dad105db 100644 --- a/web-app/src/assets/i18n/en-US.json +++ b/web-app/src/assets/i18n/en-US.json @@ -153,10 +153,12 @@ "alert.notice.sender.sms.unisms.signature": "UniSMS Signature", "alert.notice.sender.sms.unisms.templateId": "UniSMS TemplateId", "alert.notice.sender.sms.unisms.authMode": "UniSMS Authentication Mode", + "alert.notice.sender.sms.smslocal.apiKey": "Smslocal ApiKey", "alert.notice.sender.sms.type": "Sms Type", "alert.notice.sender.sms.type.alibaba": "Alibaba Sms", "alert.notice.sender.sms.type.tencent": "Tencent Sms", "alert.notice.sender.sms.type.unisms": "UniSMS", + "alert.notice.sender.sms.type.smslocal": "Smslocal Sms", "alert.notice.template": "Notice Template", "alert.notice.template.content": "Template Content", "alert.notice.template.delete": "Delete Template", diff --git a/web-app/src/assets/i18n/ja-JP.json b/web-app/src/assets/i18n/ja-JP.json index 6973039ac25..b9ad3cc3357 100644 --- a/web-app/src/assets/i18n/ja-JP.json +++ b/web-app/src/assets/i18n/ja-JP.json @@ -153,10 +153,12 @@ "alert.notice.sender.sms.unisms.signature": "UniSMS Signature", "alert.notice.sender.sms.unisms.templateId": "UniSMS TemplateId", "alert.notice.sender.sms.unisms.authMode": "UniSMS認証モード", + "alert.notice.sender.sms.smslocal.apiKey": "Smslocal ApiKey", "alert.notice.sender.sms.type": "SMSタイプ", "alert.notice.sender.sms.type.alibaba": "Alibaba Sms", "alert.notice.sender.sms.type.tencent": "Tencent Sms", "alert.notice.sender.sms.type.unisms": "UniSMS", + "alert.notice.sender.sms.type.smslocal": "Smslocal Sms", "alert.notice.template": "通知テンプレート", "alert.notice.template.content": "テンプレート内容", "alert.notice.template.delete": "テンプレートを削除", diff --git a/web-app/src/assets/i18n/zh-CN.json b/web-app/src/assets/i18n/zh-CN.json index e45eb234a62..387d6b2d2c1 100644 --- a/web-app/src/assets/i18n/zh-CN.json +++ b/web-app/src/assets/i18n/zh-CN.json @@ -153,10 +153,12 @@ "alert.notice.sender.sms.unisms.signature": "合一短信Signature", "alert.notice.sender.sms.unisms.templateId": "合一短信TemplateId", "alert.notice.sender.sms.unisms.authMode": "合一短信鉴权方式", + "alert.notice.sender.sms.smslocal.apiKey": "Smslocal短信鉴权方式", "alert.notice.sender.sms.type": "短信类型", "alert.notice.sender.sms.type.alibaba": "阿里短信", "alert.notice.sender.sms.type.tencent": "腾讯短信", "alert.notice.sender.sms.type.unisms": "合一短信(UniSMS)", + "alert.notice.sender.sms.type.smslocal": "当地短信(Smslocal)", "alert.notice.template": "通知模板", "alert.notice.template.content": "模板内容", "alert.notice.template.delete": "删除通知模板", diff --git a/web-app/src/assets/i18n/zh-TW.json b/web-app/src/assets/i18n/zh-TW.json index 75c243ab15d..82082a540fd 100644 --- a/web-app/src/assets/i18n/zh-TW.json +++ b/web-app/src/assets/i18n/zh-TW.json @@ -153,10 +153,12 @@ "alert.notice.sender.sms.unisms.signature": "合一簡訊Signature", "alert.notice.sender.sms.unisms.templateId": "合一簡訊TemplateId", "alert.notice.sender.sms.unisms.authMode": "合一簡訊驗證方式", + "alert.notice.sender.sms.smslocal.authMode": "Smslocal短訊ApiKey", "alert.notice.sender.sms.type": "騰訊類型", "alert.notice.sender.sms.type.alibaba": "阿裏短訊", "alert.notice.sender.sms.type.tencent": "騰訊短訊", "alert.notice.sender.sms.type.unisms": "合一簡訊(UniSMS)", + "alert.notice.sender.sms.type.smslocal": "当地短訊(Smslocal)", "alert.notice.template": "通知模板", "alert.notice.template.content": "模板内容", "alert.notice.template.delete": "刪除通知模板", From 5e9358b81dd0c177e81c6923f00ec641531b9cc4 Mon Sep 17 00:00:00 2001 From: a-little-fool <2030509072@qq.com> Date: Sun, 9 Mar 2025 09:34:30 +0800 Subject: [PATCH 09/15] fix --- .../alert/service/impl/SmsLocalSmsClientImpl.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java index 0ceacac3ed6..9dea5a7f5d6 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java @@ -89,7 +89,12 @@ public void sendMessage(NoticeReceiver receiver, NoticeTemplate noticeTemplate, } JsonNode jsonResponse = JsonUtil.fromJson(responseBody); - String errorcode = jsonResponse.get("errorcode").asText(); + JsonNode jsonNode = jsonResponse.get("errorcode"); + if (Objects.isNull(jsonNode)) { + log.warn("jsonResponse parse errorcode failed: {}", jsonResponse); + return; + } + String errorcode = jsonNode.asText(); if (!SUCCESS_CODE.equals(errorcode)) { String msgid = jsonResponse.get("msgid").asText(); throw new SendMessageException(errorcode + ":" + msgid); From c48a46b24a6876c38b7f97323457919381fd46f0 Mon Sep 17 00:00:00 2001 From: a-little-fool <2030509072@qq.com> Date: Sun, 9 Mar 2025 14:26:25 +0800 Subject: [PATCH 10/15] [feature] add smslocal sms notification --- .../apache/hertzbeat/alert/config/SmslocalSmsProperties.java | 1 - .../hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java | 5 ++--- web-app/src/app/pojo/SmsNoticeSender.ts | 2 +- web-app/src/app/pojo/SmslocalSmsConfig.ts | 2 +- .../settings/message-server/message-server.component.ts | 2 +- 5 files changed, 5 insertions(+), 7 deletions(-) diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java index 2df05262034..e8952b2c254 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/config/SmslocalSmsProperties.java @@ -22,7 +22,6 @@ /** * Smslocal SMS Properties - * @author zhoushusheng */ @Data public class SmslocalSmsProperties { diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java index 9dea5a7f5d6..828fcc32c1c 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java @@ -39,7 +39,6 @@ /** * Smslocal SMS Client Implement - * @author zhoushusheng */ @Slf4j public class SmsLocalSmsClientImpl implements SmsClient { @@ -128,8 +127,8 @@ private static class SmsMessage { String from; String to; String content; -// final int datacoding = 0; -// final String direction = "mt"; + final int datacoding = 0; + final String direction = "mt"; public SmsMessage(String from, String to, String content) { this.from = from; diff --git a/web-app/src/app/pojo/SmsNoticeSender.ts b/web-app/src/app/pojo/SmsNoticeSender.ts index c3f275ac9db..066483c1247 100644 --- a/web-app/src/app/pojo/SmsNoticeSender.ts +++ b/web-app/src/app/pojo/SmsNoticeSender.ts @@ -18,10 +18,10 @@ */ import { AlibabaSmsConfig } from './AlibabaSmsConfig'; +import { SmslocalSmsConfig } from './SmslocalSmsConfig'; import { TencentSmsConfig } from './TencentSmsConfig'; import { UniSmsConfig } from './UniSmsConfig'; import { SmsType } from './enums/sms-type.enum'; -import {SmslocalSmsConfig} from "./SmslocalSmsConfig"; export class SmsNoticeSender { id!: number; diff --git a/web-app/src/app/pojo/SmslocalSmsConfig.ts b/web-app/src/app/pojo/SmslocalSmsConfig.ts index cb82d0026d3..8a79fcaaf7a 100644 --- a/web-app/src/app/pojo/SmslocalSmsConfig.ts +++ b/web-app/src/app/pojo/SmslocalSmsConfig.ts @@ -18,5 +18,5 @@ */ export class SmslocalSmsConfig { - apiKey!: string + apiKey!: string; } diff --git a/web-app/src/app/routes/setting/settings/message-server/message-server.component.ts b/web-app/src/app/routes/setting/settings/message-server/message-server.component.ts index 4687d1885ad..16e3c017e88 100644 --- a/web-app/src/app/routes/setting/settings/message-server/message-server.component.ts +++ b/web-app/src/app/routes/setting/settings/message-server/message-server.component.ts @@ -31,8 +31,8 @@ import { UniSmsConfig } from 'src/app/pojo/UniSmsConfig'; import { SmsType, UniSmsAuthMode } from 'src/app/pojo/enums/sms-type.enum'; import { EmailNoticeSender } from '../../../../pojo/EmailNoticeSender'; +import { SmslocalSmsConfig } from '../../../../pojo/SmslocalSmsConfig'; import { GeneralConfigService } from '../../../../service/general-config.service'; -import {SmslocalSmsConfig} from "../../../../pojo/SmslocalSmsConfig"; @Component({ selector: 'app-message-server', From 7f259f77e7c88be911467996cdaaaf72c0f0916e Mon Sep 17 00:00:00 2001 From: a-little-fool <2030509072@qq.com> Date: Sun, 9 Mar 2025 14:46:29 +0800 Subject: [PATCH 11/15] [feature] add smslocal sms notification --- .../service/impl/SmsLocalSmsClientImpl.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java index 828fcc32c1c..338d355bbc4 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java @@ -18,6 +18,8 @@ package org.apache.hertzbeat.alert.service.impl; import com.fasterxml.jackson.databind.JsonNode; +import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.apache.hertzbeat.alert.config.SmslocalSmsProperties; import org.apache.hertzbeat.alert.service.SmsClient; @@ -65,7 +67,10 @@ public void sendMessage(NoticeReceiver receiver, NoticeTemplate noticeTemplate, try (CloseableHttpClient httpClient = HttpClients.createDefault()) { String content = alert.getCommonAnnotations().get("summary"); - SmsMessage smsMessage = new SmsMessage(FROM, receiver.getPhone(), Objects.isNull(content) ? alert.getCommonAnnotations().get("description") : content); + if (Objects.isNull(content) || Objects.isNull(alert.getCommonAnnotations().get("description"))) { + content = alert.getAlerts().get(0).getContent(); + } + SmsMessage smsMessage = new SmsMessage(FROM, receiver.getPhone(), content); String payload = JsonUtil.toJson(smsMessage); @@ -88,15 +93,15 @@ public void sendMessage(NoticeReceiver receiver, NoticeTemplate noticeTemplate, } JsonNode jsonResponse = JsonUtil.fromJson(responseBody); - JsonNode jsonNode = jsonResponse.get("errorcode"); + JsonNode jsonNode = jsonResponse.get(0); if (Objects.isNull(jsonNode)) { - log.warn("jsonResponse parse errorcode failed: {}", jsonResponse); + log.warn("jsonResponse parse errorCode failed: {}", jsonResponse); return; } - String errorcode = jsonNode.asText(); - if (!SUCCESS_CODE.equals(errorcode)) { - String msgid = jsonResponse.get("msgid").asText(); - throw new SendMessageException(errorcode + ":" + msgid); + String errorCode = jsonNode.get("errorCode").asText(); + if (!SUCCESS_CODE.equals(errorCode)) { + String msgid = jsonResponse.get("id").asText(); + throw new SendMessageException(errorCode + ":" + msgid); } log.info("Successfully sent SMS to phone: {}", receiver.getPhone()); @@ -122,7 +127,8 @@ public boolean checkConfig() { return true; } - + @Getter + @Setter private static class SmsMessage { String from; String to; From 68ead5687a9154c75b295fcbd087fe563d160a8f Mon Sep 17 00:00:00 2001 From: a-little-fool <2030509072@qq.com> Date: Sun, 9 Mar 2025 17:55:01 +0800 Subject: [PATCH 12/15] [bugfix] fix --- .../hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java index 338d355bbc4..b69ea96cecf 100644 --- a/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java +++ b/hertzbeat-alerter/src/main/java/org/apache/hertzbeat/alert/service/impl/SmsLocalSmsClientImpl.java @@ -100,7 +100,7 @@ public void sendMessage(NoticeReceiver receiver, NoticeTemplate noticeTemplate, } String errorCode = jsonNode.get("errorCode").asText(); if (!SUCCESS_CODE.equals(errorCode)) { - String msgid = jsonResponse.get("id").asText(); + String msgid = jsonNode.get("id").asText(); throw new SendMessageException(errorCode + ":" + msgid); } From 5168a9abc9a5f9197a3434f274e599dd95f7f6fa Mon Sep 17 00:00:00 2001 From: a-little-fool <2030509072@qq.com> Date: Sun, 9 Mar 2025 18:39:51 +0800 Subject: [PATCH 13/15] [bugfix] fix --- .../manager/pojo/dto/SmsNoticeSender.java | 2 ++ .../manager/pojo/dto/SmslocalConfig.java | 19 +++++++++++++++++++ .../message-server.component.html | 5 ----- 3 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/SmslocalConfig.java diff --git a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/SmsNoticeSender.java b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/SmsNoticeSender.java index efdafff838c..e13e24d7cc1 100644 --- a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/SmsNoticeSender.java +++ b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/SmsNoticeSender.java @@ -39,5 +39,7 @@ public class SmsNoticeSender { private SmsUniSmsConfig unisms; + private SmslocalConfig smslocal; + private boolean enable = true; } diff --git a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/SmslocalConfig.java b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/SmslocalConfig.java new file mode 100644 index 00000000000..efcb7dfa95b --- /dev/null +++ b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/SmslocalConfig.java @@ -0,0 +1,19 @@ +package org.apache.hertzbeat.manager.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + + +/** + * Smslocal SMS configuration + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SmslocalConfig { + /** + * Smslocal api key + */ + private String apiKey; +} diff --git a/web-app/src/app/routes/setting/settings/message-server/message-server.component.html b/web-app/src/app/routes/setting/settings/message-server/message-server.component.html index ee8e8800e58..f36b5eccc0a 100644 --- a/web-app/src/app/routes/setting/settings/message-server/message-server.component.html +++ b/web-app/src/app/routes/setting/settings/message-server/message-server.component.html @@ -72,11 +72,6 @@
{{ 'alert.notice.sender.sms.unisms.authMode' | i18n }}: {{ smsNoticeSender.unisms.authMode }} - - - - {{ 'alert.notice.sender.sms.smslocal.signature' | i18n }}: {{ smsNoticeSender.smslocal.apiKey }} -
{{ 'common.enable' | i18n }}: {{ smsNoticeSender.enable ? ('common.yes' | i18n) : ('common.no' | i18n) }} From 3a00d8a6fa71d138a8367de2f26e896add48a2ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B7=9E=E7=AD=B1?= <105542329+a-little-fool@users.noreply.github.com> Date: Sun, 9 Mar 2025 18:41:57 +0800 Subject: [PATCH 14/15] Update hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/SmslocalConfig.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Signed-off-by: 淞筱 <105542329+a-little-fool@users.noreply.github.com> --- .../manager/pojo/dto/SmslocalConfig.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/SmslocalConfig.java b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/SmslocalConfig.java index efcb7dfa95b..9c4ae8ad6d2 100644 --- a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/SmslocalConfig.java +++ b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/pojo/dto/SmslocalConfig.java @@ -1,3 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + package org.apache.hertzbeat.manager.pojo.dto; import lombok.AllArgsConstructor; From 9d1206d1c71f2ffccb64f28bb08fe796bda3e60d Mon Sep 17 00:00:00 2001 From: a-little-fool <2030509072@qq.com> Date: Sun, 9 Mar 2025 20:46:36 +0800 Subject: [PATCH 15/15] [doc] add smslocal help-doc --- home/docs/help/alert_sms.md | 27 +++++++++++++++++++ .../current/help/alert_sms.md | 27 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/home/docs/help/alert_sms.md b/home/docs/help/alert_sms.md index 523babd2fcf..00dbf61ed0f 100644 --- a/home/docs/help/alert_sms.md +++ b/home/docs/help/alert_sms.md @@ -156,6 +156,33 @@ alerter: Now you can configure this information in your hertzbeat application. +### Smslocal SMS Configuration + +SMSLocal is an all-in-one SMS service for businesses, with features like multi-way sending, strong security, and 24/7 support. You can refer to smslocal's [Developer Documentation](https://www.smslocal.com/developer/) for configuration. + +Add/Fill in the following Smslocal configuration to `application.yml` (replace parameters with your own SMS server configuration): + +```yaml +alerter: + sms: + enable: true # Whether to enable + type: smslocal # SMS provider type, set to smslocal + smslocal: # Smslocal configuration + api-key: YOUR_API_KEY_HERE +``` + +1. Register smslocal account + - Visit [Smslocal Website](https://www.smslocal.com/) + +2. Obtain `api-key` + - Log in to [Smslocal Api Access](https://secure.smslocal.com/cpaas/pages/profile/settings/api-reference) + - Go to "API Access" page + - Click the eye button + - Copy the displayed access key + - Then you can configure the `application.yml` file + +Now you can configure this information in your hertzbeat application. + ## Operation steps 1. **【Alarm notification】->【Add new recipient】 ->【Select SMS notification method】** diff --git a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/alert_sms.md b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/alert_sms.md index c0bad35009d..fbedb9b54d8 100644 --- a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/alert_sms.md +++ b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/alert_sms.md @@ -155,6 +155,33 @@ alerter: 现在您可以把这些信息配置到您的hertzbeat应用中。 +### smslocal短信配置 + +smslocal是一款面向企业的一体化短信服务平台,具备诸如多种发送方式、强大的安全性以及全天候支持等特性。你可以参考 smslocal 的[开发者文档](https://www.smslocal.com/developer/)来进行配置。 + +在 `application.yml` 中添加/填写以下 smslocal 配置内容(请用你自己的短信服务器配置参数替换相关参数): + +```yaml +alerter: + sms: + enable: true # 是否启用 + type: smslocal # 短信服务提供商类型,设置为smslocal + smslocal: # smslocal配置 + api-key: 在此处填入你的API密钥 +``` + +1. 注册 smslocal 账号 + - 访问 [smslocal官网](https://www.smslocal.com/) + +2. 获取 `api-key` + - 登录 [smslocal API accessKey访问页面](https://secure.smslocal.com/cpaas/pages/profile/settings/api-reference) + - 进入 “API 访问” 页面 + - 点击眼睛图标按钮 + - 复制显示的访问密钥 + - 然后你就可以配置 `application.yml` 文件了 + +现在你可以在你的 Hertzbeat 应用程序中配置这些信息。 + ## 操作步骤 1. **【告警通知】->【新增接收人】 ->【选择短信通知方式】**