diff --git a/common/src/main/java/com/dtp/common/constant/DingNotifyConst.java b/common/src/main/java/com/dtp/common/constant/DingNotifyConst.java
index b9af752cecd4f6354460b44f9873ca0ee098492a..7bd18b5a958b559d161c56d4880b18c77e35f8c7 100644
--- a/common/src/main/java/com/dtp/common/constant/DingNotifyConst.java
+++ b/common/src/main/java/com/dtp/common/constant/DingNotifyConst.java
@@ -45,7 +45,8 @@ public final class DingNotifyConst {
"上次报警时间:%s \n\n" +
"报警时间:%s \n\n" +
"接收人:@%s \n\n" +
- "报警间隔:%ss \n\n";
+ "报警间隔:%ss \n\n" +
+ "tid:%s \n\n";;
public static final String DING_CHANGE_NOTICE_TEMPLATE =
"【通知】 动态线程池参数变更 \n\n " +
diff --git a/common/src/main/java/com/dtp/common/constant/DynamicTpConst.java b/common/src/main/java/com/dtp/common/constant/DynamicTpConst.java
index f74e36ed33a48547bbc5ae528672b7423f72af10..6682c3d71789ea075f3ce0922145adc36e36d0ce 100644
--- a/common/src/main/java/com/dtp/common/constant/DynamicTpConst.java
+++ b/common/src/main/java/com/dtp/common/constant/DynamicTpConst.java
@@ -30,6 +30,8 @@ public final class DynamicTpConst {
public static final String VALUE = "value";
+ public static final String SW_TRACE_ID = "swTraceId";
+
/**
* Dtp executor properties const.
*/
diff --git a/common/src/main/java/com/dtp/common/constant/LarkNotifyConst.java b/common/src/main/java/com/dtp/common/constant/LarkNotifyConst.java
index 22b555f4673fec4bc02db7a1f7567c5bc4abb2fb..0a1afb7af3c75f7cec2ea54e4ac08f97b192d536 100644
--- a/common/src/main/java/com/dtp/common/constant/LarkNotifyConst.java
+++ b/common/src/main/java/com/dtp/common/constant/LarkNotifyConst.java
@@ -47,7 +47,7 @@ public class LarkNotifyConst {
* lark alarm json str
*/
public static final String LARK_ALARM_JSON_STR =
- "{\"msg_type\":\"interactive\",\"card\":{\"config\":{\"wide_screen_mode\":true},\"header\":{\"template\":\"red\",\"title\":{\"tag\":\"plain_text\",\"content\":\"【报警】 动态线程池告警\"}},\"elements\":[{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**服务名称:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**实例信息:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**环境:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**线程池名称:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"alarmType **报警类型:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"threshold **报警阈值:**\\n%s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"corePoolSize **核心线程数:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"maximumPoolSize **最大线程数:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"poolSize **当前线程数:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"activeCount **活跃线程数:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**历史最大线程数:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**任务总数:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**执行完成任务数:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**等待执行任务数:**\\n%s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueType **队列类型:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueCapacity **队列容量:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueSize **队列任务数量:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueRemaining **队列剩余容量:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"rejectType **拒绝策略:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"rejectCount **拒绝任务数量:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"runTimeoutCount **执行超时任务数量:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueTimeoutCount **等待超时任务数量:**\\n%s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**上次报警时间:**\\n %s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**报警时间:**\\n %s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**接收人:**\\n %s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**报警间隔:**\\n %ss\"}}]}]}}";
+ "{\"msg_type\":\"interactive\",\"card\":{\"config\":{\"wide_screen_mode\":true},\"header\":{\"template\":\"red\",\"title\":{\"tag\":\"plain_text\",\"content\":\"【报警】 动态线程池告警\"}},\"elements\":[{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**服务名称:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**实例信息:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**环境:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**线程池名称:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"alarmType **报警类型:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"threshold **报警阈值:**\\n%s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"corePoolSize **核心线程数:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"maximumPoolSize **最大线程数:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"poolSize **当前线程数:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"activeCount **活跃线程数:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**历史最大线程数:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**任务总数:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**执行完成任务数:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**等待执行任务数:**\\n%s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueType **队列类型:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueCapacity **队列容量:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueSize **队列任务数量:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueRemaining **队列剩余容量:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"rejectType **拒绝策略:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"rejectCount **拒绝任务数量:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"runTimeoutCount **执行超时任务数量:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueTimeoutCount **等待超时任务数量:**\\n%s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**上次报警时间:**\\n %s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**报警时间:**\\n %s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**接收人:**\\n %s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**报警间隔:**\\n %ss\"},{\"is_short\": true,\"text\": {\"tag\": \"lark_md\",\"content\": \"**tid:**\\n %s\"}}]}]}}";
/**
* lark notice json str
diff --git a/common/src/main/java/com/dtp/common/constant/WechatNotifyConst.java b/common/src/main/java/com/dtp/common/constant/WechatNotifyConst.java
index 896040765a923ba7a7ba64c557e33fb6da9f0dee..19354b36d7fd07cb35d7bb44beaea3ea938b24b1 100644
--- a/common/src/main/java/com/dtp/common/constant/WechatNotifyConst.java
+++ b/common/src/main/java/com/dtp/common/constant/WechatNotifyConst.java
@@ -45,7 +45,8 @@ public final class WechatNotifyConst {
"> 上次报警时间:%s \n" +
"> 报警时间:%s \n" +
"> 接收人:@%s \n" +
- "> 报警间隔:%ss \n";
+ "> 报警间隔:%ss \n" +
+ "> tid:%s \n";
public static final String WECHAT_CHANGE_NOTICE_TEMPLATE =
"【通知】 动态线程池参数变更 \n" +
diff --git a/core/src/main/java/com/dtp/core/notify/AbstractDtpNotifier.java b/core/src/main/java/com/dtp/core/notify/AbstractDtpNotifier.java
index c94e5145ce45546e241713e1b6f275218d916c26..a88671627adce8f2329490e62db6788b7ac0ed71 100644
--- a/core/src/main/java/com/dtp/core/notify/AbstractDtpNotifier.java
+++ b/core/src/main/java/com/dtp/core/notify/AbstractDtpNotifier.java
@@ -22,15 +22,18 @@ import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
+import org.slf4j.MDC;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
+import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
+import static com.dtp.common.constant.DynamicTpConst.SW_TRACE_ID;
import static com.dtp.common.constant.DynamicTpConst.UNKNOWN;
import static com.dtp.common.constant.LarkNotifyConst.*;
import static com.dtp.core.notify.manager.NotifyHelper.getAlarmKeys;
@@ -134,7 +137,8 @@ public abstract class AbstractDtpNotifier implements DtpNotifier {
alarmInfo.getLastAlarmTime() == null ? UNKNOWN : alarmInfo.getLastAlarmTime(),
DateUtil.now(),
receivesStr,
- notifyItem.getInterval()
+ notifyItem.getInterval(),
+ Optional.ofNullable(MDC.get(SW_TRACE_ID)).orElse("")
);
return highlightAlarmContent(content, notifyItemEnum);
}
diff --git a/core/src/main/java/com/dtp/core/notify/manager/AlarmManager.java b/core/src/main/java/com/dtp/core/notify/manager/AlarmManager.java
index 38e7ae95b2b8cec65439b92c01887227897eecee..7151100eb4b6815d35acd1a140e65a9c194a73dc 100644
--- a/core/src/main/java/com/dtp/core/notify/manager/AlarmManager.java
+++ b/core/src/main/java/com/dtp/core/notify/manager/AlarmManager.java
@@ -12,6 +12,7 @@ import com.dtp.core.notify.alarm.AlarmCounter;
import com.dtp.core.notify.alarm.AlarmLimiter;
import com.dtp.core.support.ExecutorWrapper;
import com.dtp.core.support.ThreadPoolBuilder;
+import com.dtp.core.support.runnable.MdcRunnable;
import com.dtp.core.thread.DtpExecutor;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
@@ -61,7 +62,7 @@ public class AlarmManager {
public static void doAlarmAsync(DtpExecutor executor, NotifyItemEnum notifyType) {
AlarmCounter.incAlarmCounter(executor.getThreadPoolName(), notifyType.getValue());
- ALARM_EXECUTOR.execute(() -> doAlarm(ExecutorWrapper.of(executor), notifyType));
+ ALARM_EXECUTOR.execute(MdcRunnable.get(() -> doAlarm(ExecutorWrapper.of(executor), notifyType)));
}
public static void doAlarmAsync(DtpExecutor executor, List notifyItemEnums) {
@@ -69,7 +70,7 @@ public class AlarmManager {
}
public static void doAlarmAsync(ExecutorWrapper executorWrapper, List notifyItemEnums) {
- ALARM_EXECUTOR.execute(() -> notifyItemEnums.forEach(x -> doAlarm(executorWrapper, x)));
+ ALARM_EXECUTOR.execute(MdcRunnable.get(() -> notifyItemEnums.forEach(x -> doAlarm(executorWrapper, x))));
}
public static void doAlarm(ExecutorWrapper executorWrapper, NotifyItemEnum notifyItemEnum) {
diff --git a/core/src/main/java/com/dtp/core/support/runnable/MdcRunnable.java b/core/src/main/java/com/dtp/core/support/runnable/MdcRunnable.java
index 8ffa78e620cd15a7aff986c6563e4ed95190f71d..dc083d29f25ae110961ef7b0b88d370cac1313b1 100644
--- a/core/src/main/java/com/dtp/core/support/runnable/MdcRunnable.java
+++ b/core/src/main/java/com/dtp/core/support/runnable/MdcRunnable.java
@@ -4,6 +4,7 @@ import org.apache.commons.collections.MapUtils;
import org.slf4j.MDC;
import java.util.Map;
+import static com.dtp.common.constant.DynamicTpConst.SW_TRACE_ID;
/**
* MdcRunnable related
@@ -47,7 +48,9 @@ public class MdcRunnable implements Runnable {
} finally {
// Remove MDC value at the end of execution
for (Map.Entry entry : parentMdc.entrySet()) {
- MDC.remove(entry.getKey());
+ if (!SW_TRACE_ID.equals(entry.getKey())) {
+ MDC.remove(entry.getKey());
+ }
}
}
}
diff --git a/core/src/main/java/com/dtp/core/thread/DtpExecutor.java b/core/src/main/java/com/dtp/core/thread/DtpExecutor.java
index afe929b52ef7ec0e43817fcf7a73ecc489e70dba..5454618a2a1c5f0aaf05b53c72e714d1e6ebf913 100644
--- a/core/src/main/java/com/dtp/core/thread/DtpExecutor.java
+++ b/core/src/main/java/com/dtp/core/thread/DtpExecutor.java
@@ -16,6 +16,7 @@ import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
+import org.slf4j.MDC;
import java.util.List;
import java.util.concurrent.BlockingQueue;
@@ -24,6 +25,7 @@ import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.LongAdder;
+import static com.dtp.common.constant.DynamicTpConst.SW_TRACE_ID;
import static com.dtp.common.em.NotifyItemEnum.QUEUE_TIMEOUT;
import static com.dtp.common.em.NotifyItemEnum.RUN_TIMEOUT;
@@ -154,7 +156,7 @@ public class DtpExecutor extends DtpLifecycleSupport implements SpringExecutor {
}
}
}
-
+ MDC.remove(SW_TRACE_ID);
super.afterExecute(r, t);
}
diff --git a/extension/extension-notify-email/src/main/java/com/dtp/extension/notify/email/base/DtpEmailNotifier.java b/extension/extension-notify-email/src/main/java/com/dtp/extension/notify/email/base/DtpEmailNotifier.java
index 346f8b9b8cae6aec8d92d3cf55eccb23801d0705..6cd0edc106cd0c435bbcc34fe41e6bd66e8d36c8 100644
--- a/extension/extension-notify-email/src/main/java/com/dtp/extension/notify/email/base/DtpEmailNotifier.java
+++ b/extension/extension-notify-email/src/main/java/com/dtp/extension/notify/email/base/DtpEmailNotifier.java
@@ -18,13 +18,16 @@ import com.dtp.core.support.ExecutorWrapper;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.apache.commons.lang3.tuple.Pair;
+import org.slf4j.MDC;
import org.thymeleaf.context.Context;
import java.util.Collections;
import java.util.List;
+import java.util.Optional;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
+import static com.dtp.common.constant.DynamicTpConst.SW_TRACE_ID;
import static com.dtp.common.constant.DynamicTpConst.UNKNOWN;
import static com.dtp.core.notify.manager.NotifyHelper.getAlarmKeys;
@@ -94,6 +97,7 @@ public class DtpEmailNotifier extends AbstractDtpNotifier {
context.setVariable("lastAlarmTime", alarmInfo.getLastAlarmTime() == null ? UNKNOWN : alarmInfo.getLastAlarmTime());
context.setVariable("alarmTime", DateTime.now());
context.setVariable("alarmInterval", notifyItem.getInterval());
+ context.setVariable("tid", Optional.ofNullable(MDC.get(SW_TRACE_ID)).orElse(""));
context.setVariable("highlightVariables", getAlarmKeys(notifyItemEnum));
return ((EmailNotifier) notifier).processTemplateContent("alarm", context);
}
diff --git a/extension/extension-skywalking/src/main/java/com/dtp/extension/skywalking/wrapper/SwTraceTaskWrapper.java b/extension/extension-skywalking/src/main/java/com/dtp/extension/skywalking/wrapper/SwTraceTaskWrapper.java
index cf62d773b9c03f127f848b7cc151583496475346..009f710d87733c8b4af0741efee94f94dd581e6e 100644
--- a/extension/extension-skywalking/src/main/java/com/dtp/extension/skywalking/wrapper/SwTraceTaskWrapper.java
+++ b/extension/extension-skywalking/src/main/java/com/dtp/extension/skywalking/wrapper/SwTraceTaskWrapper.java
@@ -1,7 +1,12 @@
package com.dtp.extension.skywalking.wrapper;
+import com.dtp.core.support.runnable.MdcRunnable;
import com.dtp.core.support.wrapper.TaskWrapper;
import org.apache.skywalking.apm.toolkit.trace.RunnableWrapper;
+import org.apache.skywalking.apm.toolkit.trace.TraceContext;
+import org.slf4j.MDC;
+
+import static com.dtp.common.constant.DynamicTpConst.SW_TRACE_ID;
/**
* SwTraceTaskWrapper related
@@ -20,6 +25,7 @@ public class SwTraceTaskWrapper implements TaskWrapper {
@Override
public Runnable wrap(Runnable runnable) {
- return new RunnableWrapper(runnable);
+ MDC.put(SW_TRACE_ID, TraceContext.traceId());
+ return MdcRunnable.get(new RunnableWrapper(runnable));
}
}