You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ta...@apache.org on 2020/08/21 06:32:18 UTC
[skywalking] 01/04: finish
This is an automated email from the ASF dual-hosted git repository.
tanjian pushed a commit to branch slack_alarm
in repository https://gitbox.apache.org/repos/asf/skywalking.git
commit e214a1d887221b268c4b1ae7836ec85160c1eb38
Author: JaredTan95 <ji...@daocloud.io>
AuthorDate: Thu Aug 20 17:27:40 2020 +0800
finish
---
.../core/alarm/provider/AlarmRulesWatcher.java | 5 ++
.../server/core/alarm/provider/NotifyHandler.java | 2 +
.../oap/server/core/alarm/provider/Rules.java | 2 +
.../server/core/alarm/provider/RulesReader.java | 30 ++++++++++--
.../core/alarm/provider/WebhookCallback.java | 2 +-
.../{Rules.java => slack/SlackSettings.java} | 22 +++++----
.../SlackhookCallback.java} | 56 +++++++++++++++-------
.../src/main/resources/alarm-settings.yml | 12 +++++
skywalking-ui | 2 +-
9 files changed, 101 insertions(+), 32 deletions(-)
diff --git a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRulesWatcher.java b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRulesWatcher.java
index af4f3ae..c2cad6c 100644
--- a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRulesWatcher.java
+++ b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRulesWatcher.java
@@ -29,6 +29,7 @@ import org.apache.skywalking.oap.server.configuration.api.ConfigChangeWatcher;
import org.apache.skywalking.oap.server.core.Const;
import org.apache.skywalking.oap.server.core.alarm.AlarmModule;
import org.apache.skywalking.oap.server.core.alarm.provider.grpc.GRPCAlarmSetting;
+import org.apache.skywalking.oap.server.core.alarm.provider.slack.SlackSettings;
import org.apache.skywalking.oap.server.library.module.ModuleProvider;
/**
@@ -109,4 +110,8 @@ public class AlarmRulesWatcher extends ConfigChangeWatcher {
public GRPCAlarmSetting getGrpchookSetting() {
return this.rules.getGrpchookSetting();
}
+
+ public SlackSettings getSlackSettings(){
+ return this.rules.getSlacks();
+ }
}
diff --git a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandler.java b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandler.java
index bf77c38..2209d19 100644
--- a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandler.java
+++ b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandler.java
@@ -32,6 +32,7 @@ import org.apache.skywalking.oap.server.core.alarm.MetricsNotify;
import org.apache.skywalking.oap.server.core.alarm.ServiceInstanceMetaInAlarm;
import org.apache.skywalking.oap.server.core.alarm.ServiceMetaInAlarm;
import org.apache.skywalking.oap.server.core.alarm.provider.grpc.GRPCCallback;
+import org.apache.skywalking.oap.server.core.alarm.provider.slack.SlackhookCallback;
import org.apache.skywalking.oap.server.core.analysis.IDManager;
import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics;
import org.apache.skywalking.oap.server.core.analysis.metrics.MetricsMetaInfo;
@@ -158,6 +159,7 @@ public class NotifyHandler implements MetricsNotify {
List<AlarmCallback> allCallbacks = new ArrayList<>(Arrays.asList(callbacks));
allCallbacks.add(new WebhookCallback(alarmRulesWatcher));
allCallbacks.add(new GRPCCallback(alarmRulesWatcher));
+ allCallbacks.add(new SlackhookCallback(alarmRulesWatcher));
core.start(allCallbacks);
}
}
diff --git a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/Rules.java b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/Rules.java
index 87dd507..0f95820 100644
--- a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/Rules.java
+++ b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/Rules.java
@@ -24,6 +24,7 @@ import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.apache.skywalking.oap.server.core.alarm.provider.grpc.GRPCAlarmSetting;
+import org.apache.skywalking.oap.server.core.alarm.provider.slack.SlackSettings;
@Setter
@Getter
@@ -32,6 +33,7 @@ public class Rules {
private List<AlarmRule> rules;
private List<String> webhooks;
private GRPCAlarmSetting grpchookSetting;
+ private SlackSettings slacks;
public Rules() {
this.rules = new ArrayList<>();
diff --git a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/RulesReader.java b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/RulesReader.java
index e1c1adf..bc47b94 100644
--- a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/RulesReader.java
+++ b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/RulesReader.java
@@ -25,6 +25,7 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.apache.skywalking.oap.server.core.alarm.provider.grpc.GRPCAlarmSetting;
+import org.apache.skywalking.oap.server.core.alarm.provider.slack.SlackSettings;
import org.yaml.snakeyaml.Yaml;
/**
@@ -65,8 +66,10 @@ public class RulesReader {
alarmRule.setExcludeNames((ArrayList) settings.getOrDefault("exclude-names", new ArrayList(0)));
alarmRule.setIncludeNamesRegex((String) settings.getOrDefault("include-names-regex", ""));
alarmRule.setExcludeNamesRegex((String) settings.getOrDefault("exclude-names-regex", ""));
- alarmRule.setIncludeLabels((ArrayList) settings.getOrDefault("include-labels", new ArrayList(0)));
- alarmRule.setExcludeLabels((ArrayList) settings.getOrDefault("exclude-labels", new ArrayList(0)));
+ alarmRule.setIncludeLabels(
+ (ArrayList) settings.getOrDefault("include-labels", new ArrayList(0)));
+ alarmRule.setExcludeLabels(
+ (ArrayList) settings.getOrDefault("exclude-labels", new ArrayList(0)));
alarmRule.setIncludeLabelsRegex((String) settings.getOrDefault("include-labels-regex", ""));
alarmRule.setExcludeLabelsRegex((String) settings.getOrDefault("exclude-labels-regex", ""));
alarmRule.setThreshold(settings.get("threshold").toString());
@@ -74,8 +77,9 @@ public class RulesReader {
alarmRule.setPeriod((Integer) settings.getOrDefault("period", 1));
alarmRule.setCount((Integer) settings.getOrDefault("count", 1));
alarmRule.setSilencePeriod((Integer) settings.getOrDefault("silence-period", -1));
- alarmRule.setMessage((String) settings.getOrDefault("message", "Alarm caused by Rule " + alarmRule
- .getAlarmRuleName()));
+ alarmRule.setMessage(
+ (String) settings.getOrDefault("message", "Alarm caused by Rule " + alarmRule
+ .getAlarmRuleName()));
rules.getRules().add(alarmRule);
}
@@ -104,6 +108,24 @@ public class RulesReader {
rules.setGrpchookSetting(grpcAlarmSetting);
}
+
+ Map slacks = (Map) yamlData.get("slackHooks");
+ if (slacks != null) {
+ SlackSettings slackSettings = new SlackSettings();
+ Object textTemplate = slacks.getOrDefault("textTemplate", "");
+ if (textTemplate != null) {
+ slackSettings.setTextTemplate((String) textTemplate);
+ }
+
+ List<String> slackWebhooks = (List<String>) slacks.get("webhooks");
+ if (slackWebhooks != null) {
+ slackWebhooks.forEach(
+ url -> slackSettings.getWebhooks().add(url)
+ );
+ }
+
+ rules.setSlacks(slackSettings);
+ }
}
return rules;
diff --git a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/WebhookCallback.java b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/WebhookCallback.java
index f0fe041..09e4651 100644
--- a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/WebhookCallback.java
+++ b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/WebhookCallback.java
@@ -62,7 +62,7 @@ public class WebhookCallback implements AlarmCallback {
@Override
public void doAlarm(List<AlarmMessage> alarmMessage) {
- if (alarmRulesWatcher.getWebHooks().size() == 0) {
+ if (alarmRulesWatcher.getWebHooks().isEmpty()) {
return;
}
diff --git a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/Rules.java b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/slack/SlackSettings.java
similarity index 70%
copy from oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/Rules.java
copy to oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/slack/SlackSettings.java
index 87dd507..9c3df1c 100644
--- a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/Rules.java
+++ b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/slack/SlackSettings.java
@@ -16,25 +16,27 @@
*
*/
-package org.apache.skywalking.oap.server.core.alarm.provider;
+package org.apache.skywalking.oap.server.core.alarm.provider.slack;
import java.util.ArrayList;
import java.util.List;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Getter;
+import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
-import org.apache.skywalking.oap.server.core.alarm.provider.grpc.GRPCAlarmSetting;
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
@Setter
@Getter
@ToString
-public class Rules {
- private List<AlarmRule> rules;
- private List<String> webhooks;
- private GRPCAlarmSetting grpchookSetting;
+public class SlackSettings {
- public Rules() {
- this.rules = new ArrayList<>();
- this.webhooks = new ArrayList<>();
- }
+ private String textTemplate;
+
+ @Builder.Default
+ private List<String> webhooks = new ArrayList<>();
}
diff --git a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/WebhookCallback.java b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/slack/SlackhookCallback.java
similarity index 62%
copy from oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/WebhookCallback.java
copy to oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/slack/SlackhookCallback.java
index f0fe041..d6abf41 100644
--- a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/WebhookCallback.java
+++ b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/slack/SlackhookCallback.java
@@ -16,13 +16,17 @@
*
*/
-package org.apache.skywalking.oap.server.core.alarm.provider;
+package org.apache.skywalking.oap.server.core.alarm.provider.slack;
import com.google.gson.Gson;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
import io.netty.handler.codec.http.HttpHeaderValues;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
-import java.nio.charset.StandardCharsets;
+import java.time.Instant;
+import java.time.OffsetDateTime;
+import java.time.ZoneId;
import java.util.List;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpStatus;
@@ -30,45 +34,48 @@ import org.apache.http.StatusLine;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.skywalking.oap.server.core.alarm.AlarmCallback;
import org.apache.skywalking.oap.server.core.alarm.AlarmMessage;
+import org.apache.skywalking.oap.server.core.alarm.provider.AlarmRulesWatcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
- * Use SkyWalking alarm webhook API call a remote endpoints.
+ * Use SkyWalking alarm slack webhook API call a remote endpoints.
*/
-public class WebhookCallback implements AlarmCallback {
- private static final Logger logger = LoggerFactory.getLogger(WebhookCallback.class);
+public class SlackhookCallback implements AlarmCallback {
+ private static final Logger logger = LoggerFactory.getLogger(SlackhookCallback.class);
private static final int HTTP_CONNECT_TIMEOUT = 1000;
private static final int HTTP_CONNECTION_REQUEST_TIMEOUT = 1000;
private static final int HTTP_SOCKET_TIMEOUT = 10000;
-
+ private static final Gson GSON = new Gson();
private AlarmRulesWatcher alarmRulesWatcher;
private RequestConfig requestConfig;
- private Gson gson = new Gson();
+ private List<String> webhooks;
- public WebhookCallback(AlarmRulesWatcher alarmRulesWatcher) {
+ public SlackhookCallback(final AlarmRulesWatcher alarmRulesWatcher) {
this.alarmRulesWatcher = alarmRulesWatcher;
- requestConfig = RequestConfig.custom()
- .setConnectTimeout(HTTP_CONNECT_TIMEOUT)
- .setConnectionRequestTimeout(HTTP_CONNECTION_REQUEST_TIMEOUT)
- .setSocketTimeout(HTTP_SOCKET_TIMEOUT)
- .build();
+ this.requestConfig = RequestConfig.custom()
+ .setConnectTimeout(HTTP_CONNECT_TIMEOUT)
+ .setConnectionRequestTimeout(HTTP_CONNECTION_REQUEST_TIMEOUT)
+ .setSocketTimeout(HTTP_SOCKET_TIMEOUT)
+ .build();
+ this.webhooks = alarmRulesWatcher.getSlackSettings().getWebhooks();
}
@Override
public void doAlarm(List<AlarmMessage> alarmMessage) {
- if (alarmRulesWatcher.getWebHooks().size() == 0) {
+ if (webhooks.isEmpty()) {
return;
}
CloseableHttpClient httpClient = HttpClients.custom().build();
try {
- alarmRulesWatcher.getWebHooks().forEach(url -> {
+ webhooks.forEach(url -> {
HttpPost post = new HttpPost(url);
post.setConfig(requestConfig);
post.setHeader(HttpHeaders.ACCEPT, HttpHeaderValues.APPLICATION_JSON.toString());
@@ -76,7 +83,24 @@ public class WebhookCallback implements AlarmCallback {
StringEntity entity;
try {
- entity = new StringEntity(gson.toJson(alarmMessage), StandardCharsets.UTF_8);
+
+ JsonObject jsonObject = new JsonObject();
+ JsonArray jsonElements = new JsonArray();
+
+ alarmMessage.forEach(item -> jsonElements.add(
+ GSON.fromJson(
+ String.format(
+ alarmRulesWatcher.getSlackSettings().getTextTemplate(),
+ OffsetDateTime.ofInstant(Instant.ofEpochMilli(item.getStartTime()),
+ ZoneId.systemDefault()),
+ item.getId0(), item.getScope(), item.getName(), item.getAlarmMessage()
+ ),
+ JsonObject.class
+ )));
+ jsonObject.add("blocks", jsonElements);
+
+ entity = new StringEntity(GSON.toJson(jsonObject), ContentType.APPLICATION_JSON);
+
post.setEntity(entity);
CloseableHttpResponse httpResponse = httpClient.execute(post);
StatusLine statusLine = httpResponse.getStatusLine();
diff --git a/oap-server/server-bootstrap/src/main/resources/alarm-settings.yml b/oap-server/server-bootstrap/src/main/resources/alarm-settings.yml
index c161092..84d032d 100755
--- a/oap-server/server-bootstrap/src/main/resources/alarm-settings.yml
+++ b/oap-server/server-bootstrap/src/main/resources/alarm-settings.yml
@@ -47,3 +47,15 @@ gRPCHook:
# target_host: 127.0.0.1
# target_port: 9888
+slackHooks:
+ textTemplate: |-
+ {
+ "type": "section",
+ "text": {
+ "type": "mrkdwn",
+ "text": ":alarm_clock: [%s] *Apache Skywalking Alarm* \n [%s]: %s %s : %s "
+ }
+ }
+ webhooks:
+ - https://hooks.slack.com/services/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
+
diff --git a/skywalking-ui b/skywalking-ui
index 60ca1cd..34f98b1 160000
--- a/skywalking-ui
+++ b/skywalking-ui
@@ -1 +1 @@
-Subproject commit 60ca1cd698ba058850779717535b2b7119e95141
+Subproject commit 34f98b1c9aa667cc481abe6bbe46fa361124e1a2