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)); } }