From 2a5f7eb5bd0fe441da2140c825d11f38b298a728 Mon Sep 17 00:00:00 2001 From: xudawei Date: Mon, 22 Apr 2024 16:46:10 +0800 Subject: [PATCH 01/23] =?UTF-8?q?=E6=96=B0=E5=A2=9Ecommon-trace=E6=A8=A1?= =?UTF-8?q?=E5=9D=97:traceId=E8=AE=BE=E7=BD=AE=E5=88=B0feign=E8=B0=83?= =?UTF-8?q?=E7=94=A8head=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo-common-trace/pom.xml | 37 +++++++++++++++++++ .../trace/interceptor/FeignInterceptor.java | 23 ++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 axzo-common-loggings/axzo-common-trace/pom.xml create mode 100644 axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignInterceptor.java diff --git a/axzo-common-loggings/axzo-common-trace/pom.xml b/axzo-common-loggings/axzo-common-trace/pom.xml new file mode 100644 index 0000000..89078b8 --- /dev/null +++ b/axzo-common-loggings/axzo-common-trace/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + axzo-common-loggings + cn.axzo.framework.logging + 1.0.0-SNAPSHOT + + com.axzo.framework + axzo-common-trace + Axzo Common trace + + + + org.springframework.boot + spring-boot-starter-logging + + + + org.springframework.boot + spring-boot-starter-web + + + + cn.hutool + hutool-core + + + + io.github.openfeign + feign-httpclient + + + + + diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignInterceptor.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignInterceptor.java new file mode 100644 index 0000000..14a54fb --- /dev/null +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignInterceptor.java @@ -0,0 +1,23 @@ +package com.axzo.framework.trace.interceptor; + +import feign.RequestInterceptor; +import feign.RequestTemplate; +import org.slf4j.MDC; +import org.springframework.context.annotation.Configuration; + +/** + * 调用前从 MDC中获取上一步骤设置的traceId,放置到 header中,供下一个服务从header中获取traceId + */ +@Configuration +public class FeignInterceptor implements RequestInterceptor { + private static final String TRACE_ID = "traceId"; + + public static final String CTX_LOG_ID_MDC = "ctxLogId"; + + @Override + public void apply(RequestTemplate requestTemplate) { + requestTemplate.header(TRACE_ID, MDC.get(TRACE_ID)); + requestTemplate.header(CTX_LOG_ID_MDC, MDC.get(CTX_LOG_ID_MDC)); + } +} + From c0cb544667a7860a40fdbf535d6e4a445c7a9840 Mon Sep 17 00:00:00 2001 From: xudawei Date: Tue, 23 Apr 2024 15:43:39 +0800 Subject: [PATCH 02/23] =?UTF-8?q?common-trace=E6=A8=A1=E5=9D=97:=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0TraceIdFilter/FeignFillHeaderInterceptor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo-common-trace/pom.xml | 12 ++- .../FeignFillHeaderInterceptor.java | 60 +++++++++++ .../trace/interceptor/FeignInterceptor.java | 23 ---- .../RequestLogHandlerInterceptor.java | 100 ++++++++++++++++++ .../trace/interceptor/TraceIdFilter.java | 96 +++++++++++++++++ .../framework/trace/util/ExceptionUtil.java | 28 +++++ .../BodyReaderHttpServletRequestWrapper.java | 95 +++++++++++++++++ 7 files changed, 390 insertions(+), 24 deletions(-) create mode 100644 axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignFillHeaderInterceptor.java delete mode 100644 axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignInterceptor.java create mode 100644 axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java create mode 100644 axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java create mode 100644 axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/util/ExceptionUtil.java create mode 100644 axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/wrapper/BodyReaderHttpServletRequestWrapper.java diff --git a/axzo-common-loggings/axzo-common-trace/pom.xml b/axzo-common-loggings/axzo-common-trace/pom.xml index 89078b8..59c9464 100644 --- a/axzo-common-loggings/axzo-common-trace/pom.xml +++ b/axzo-common-loggings/axzo-common-trace/pom.xml @@ -24,7 +24,7 @@ cn.hutool - hutool-core + hutool-all @@ -32,6 +32,16 @@ feign-httpclient + + com.alibaba + fastjson + + + + commons-io + commons-io + + diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignFillHeaderInterceptor.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignFillHeaderInterceptor.java new file mode 100644 index 0000000..af87bd4 --- /dev/null +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignFillHeaderInterceptor.java @@ -0,0 +1,60 @@ +package com.axzo.framework.trace.interceptor; + +import feign.RequestInterceptor; +import feign.RequestTemplate; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.StringUtils; + +import java.util.concurrent.atomic.AtomicLong; + +/** + * @author xudawei + * @date 2024/04/23 + * @desc 调用前从 MDC中获取上一步骤设置的traceId,放置到 header中,供下一个服务从header中获取trace_id(注意,接口服务方接收到的header里trace_id是小写的) + */ +@Configuration +@Slf4j +public class FeignFillHeaderInterceptor implements RequestInterceptor { + private static final String TRACE_ID = "traceId"; + private static final String SPAN_ID = "spanId"; + private static final String LOGIC_ID = "logicId"; + + @Override + public void apply(RequestTemplate requestTemplate) { + requestTemplate.header(TRACE_ID, MDC.get(TRACE_ID)); + log.info("FeignFillHeaderInterceptor apply,traceId:{}", MDC.get(TRACE_ID)); + requestTemplate.header(SPAN_ID, this.buildNextSpanId()); + } + + /** + * 下游的spanId:有本次spanId+logic组成 + * logic默认从0开始,每次调用下游时logic则自增1 + */ + private String buildNextSpanId() { + //获取spanId + String spanId = this.fetchSpanId(); + if (!StringUtils.hasText(MDC.get(LOGIC_ID))) { + MDC.put(LOGIC_ID, "0"); + } + + AtomicLong atomicLong = new AtomicLong(Long.parseLong(MDC.get(LOGIC_ID))); + Long nextSpanId = atomicLong.getAndIncrement(); + MDC.put(LOGIC_ID, atomicLong.toString()); + log.info("buildNextSpanId spanId:{}, nextSpanId:{}", spanId, nextSpanId); + return spanId + "." + nextSpanId; + } + + /** + * 获取spanId + */ + private String fetchSpanId() { + String spanId = MDC.get(SPAN_ID); + if (!StringUtils.hasText(spanId)) { + MDC.put(SPAN_ID, "0"); + } + return spanId; + } +} + diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignInterceptor.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignInterceptor.java deleted file mode 100644 index 14a54fb..0000000 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignInterceptor.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.axzo.framework.trace.interceptor; - -import feign.RequestInterceptor; -import feign.RequestTemplate; -import org.slf4j.MDC; -import org.springframework.context.annotation.Configuration; - -/** - * 调用前从 MDC中获取上一步骤设置的traceId,放置到 header中,供下一个服务从header中获取traceId - */ -@Configuration -public class FeignInterceptor implements RequestInterceptor { - private static final String TRACE_ID = "traceId"; - - public static final String CTX_LOG_ID_MDC = "ctxLogId"; - - @Override - public void apply(RequestTemplate requestTemplate) { - requestTemplate.header(TRACE_ID, MDC.get(TRACE_ID)); - requestTemplate.header(CTX_LOG_ID_MDC, MDC.get(CTX_LOG_ID_MDC)); - } -} - diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java new file mode 100644 index 0000000..d27f32d --- /dev/null +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java @@ -0,0 +1,100 @@ +package com.axzo.framework.trace.interceptor; + +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; +import com.axzo.framework.trace.util.ExceptionUtil; +import com.axzo.framework.trace.wrapper.BodyReaderHttpServletRequestWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import javax.servlet.DispatcherType; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.nio.charset.Charset; + +/** + * 简单的打印一些入参 + * + * @author tanjie@axzo.cn + * @date 2021/12/13 11:13 + */ +@Slf4j +@ConditionalOnProperty(prefix = "axzo.log.pokonya", name = "enable", havingValue = "true", matchIfMissing = true) +@Component +public class RequestLogHandlerInterceptor implements HandlerInterceptor, WebMvcConfigurer { + + private static final String CHECK_DEATH_URL = "/checkDeath"; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + //filter check death + if (request.getRequestURI().contains(CHECK_DEATH_URL)) { + return true; + } + + if (handler instanceof HandlerMethod) { + ExceptionUtil.ignoreException(() -> processRequestLog(request), (e) -> log.warn(e.getMessage(), e)); + return true; + } + + log.info("[requestUrl:{}]", request.getRequestURL()); + + return true; + } + + private void processRequestLog(HttpServletRequest request) { + if (request.getDispatcherType().equals(DispatcherType.ERROR)) { + return; + } + if (!(request instanceof BodyReaderHttpServletRequestWrapper)) { + log.warn("print request log error : current request entity not support"); + return; + } + String method = request.getMethod(); + StringBuffer requestUrl = request.getRequestURL(); + + if ("get".equalsIgnoreCase(method)) { + log.info("[requestUrl:{}][method:{}][param:{}]", requestUrl, method, JSON.toJSONString(request.getParameterMap())); + return; + } + + if ("post".equalsIgnoreCase(method)) { + try { + String body = IOUtils.toString(request.getInputStream(), Charset.defaultCharset()); + boolean isJson = JSONUtil.isTypeJSON(body); + boolean shortLength = body.length() < 4000; + if (shortLength) { + body = isJson ? JSONUtil.toJsonStr(JSONUtil.isTypeJSONObject(body) ? JSON.parseObject(body) : JSON.parseArray(body)) : body; + log.info("[requestUrl:{}][method:{}][param:{}][body:{}]", requestUrl, method, + JSON.toJSONString(request.getParameterMap()), body); + return; + } else { + log.warn("request body too long, ignore print"); + } + log.info("requestUrl:{}", requestUrl); + + } catch (IOException ioException) { + log.warn("打印参数失败[requestUrl:{}]", requestUrl, ioException); + } + + return; + } + //other method + log.info("requestUrl:{}", requestUrl); + } + + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(this); + } + + +} diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java new file mode 100644 index 0000000..12624c1 --- /dev/null +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java @@ -0,0 +1,96 @@ +package com.axzo.framework.trace.interceptor; + +import cn.hutool.core.util.StrUtil; +import com.axzo.framework.trace.util.ExceptionUtil; +import com.axzo.framework.trace.wrapper.BodyReaderHttpServletRequestWrapper; +import lombok.NonNull; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.UUID; + +/** + * @author TanJ + * @date 2021/5/24 + */ +@Slf4j +@ConditionalOnProperty(prefix = "axzo.log.pokonya", name = "enable", havingValue = "true", matchIfMissing = true) +@Component +@Order(-99999) +public class TraceIdFilter extends OncePerRequestFilter { + + private static final String TRACE_ID = "traceId"; + private static final String CTX_LOG_ID = "ctxLogId"; + private static final String X_REQUEST_ID = "x-request-id"; + private static final String SPAN_ID = "spanId"; + + + + @Override + protected void doFilterInternal(@NonNull HttpServletRequest request, + @NonNull HttpServletResponse response, + @NonNull FilterChain filterChain) throws ServletException, IOException { + + // wrapper + BodyReaderHttpServletRequestWrapper bodyRequest = new BodyReaderHttpServletRequestWrapper( + request); + + // trace id 补充 + + ExceptionUtil.ignoreException(() -> setTraceId(bodyRequest, response), null); + + + //do + try { + filterChain.doFilter(bodyRequest, response); + } finally { + MDC.clear(); + } + } + + + private void setTraceId(@NonNull HttpServletRequest request, + @NonNull HttpServletResponse response) { + + String traceId = this.fetchTraceId(request); + log.info("TraceIdFilter setTraceId,traceId:{}", traceId); + //set + MDC.put(TRACE_ID, traceId); + MDC.put(CTX_LOG_ID, traceId); + + MDC.put(SPAN_ID, this.fetchSpanId(request)); + response.setHeader(TRACE_ID, traceId); + } + + /** + * 获取traceId + */ + private String fetchTraceId(HttpServletRequest request) { + //header: ctxLogId -> traceId -> x-request-id + String traceId = StrUtil.blankToDefault(request.getHeader(CTX_LOG_ID), + StrUtil.blankToDefault(request.getHeader(TRACE_ID), + request.getHeader(X_REQUEST_ID))); + // blank to new + return StrUtil.blankToDefault(traceId, UUID.randomUUID().toString().replaceAll("-", "")); + } + + /** + * 获取spanId + */ + private String fetchSpanId(HttpServletRequest request) { + // blank to new + String spanId = StrUtil.blankToDefault(request.getHeader(SPAN_ID), "0"); + log.info("TraceIdFilter fetchSpanId,spanId:{}", spanId); + return spanId; + } +} + diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/util/ExceptionUtil.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/util/ExceptionUtil.java new file mode 100644 index 0000000..517fa37 --- /dev/null +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/util/ExceptionUtil.java @@ -0,0 +1,28 @@ +package com.axzo.framework.trace.util; + + +import java.util.function.Consumer; + +/** + * @author tanjie@axzo.cn + * @date 2021/12/13 14:10 + */ +public class ExceptionUtil { + + /** + * 忽略错误 + * @param supplier + * @param catchConsumer + */ + public static void ignoreException(Runnable supplier, Consumer catchConsumer) { + try { + supplier.run(); + } catch (Exception e) { + if (null != catchConsumer) { + catchConsumer.accept(e); + } + + } + + } +} diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/wrapper/BodyReaderHttpServletRequestWrapper.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/wrapper/BodyReaderHttpServletRequestWrapper.java new file mode 100644 index 0000000..5f252ab --- /dev/null +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/wrapper/BodyReaderHttpServletRequestWrapper.java @@ -0,0 +1,95 @@ +package com.axzo.framework.trace.wrapper; + +import lombok.SneakyThrows; + +import javax.servlet.ReadListener; +import javax.servlet.ServletException; +import javax.servlet.ServletInputStream; +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import javax.servlet.http.Part; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.Charset; +import java.util.Collection; + +/** + * 自定义request + * + * @author TanJ + */ +public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper { + + private final byte[] body; + + private final HttpServletRequest request; + + @SneakyThrows + public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException { + super(request); + this.request = request; +// request.getParameterMap(); + String sessionStream = getBodyString(request); + body = sessionStream.getBytes(Charset.forName("UTF-8")); + } + + + + @Override + public Collection getParts() throws IOException, ServletException { + return request.getParts(); + } + + private String getBodyString(ServletRequest request) throws IOException { + StringBuilder sb = new StringBuilder(); + InputStream ins = request.getInputStream(); + + try (BufferedReader isr = new BufferedReader( + new InputStreamReader(ins, Charset.forName("UTF-8")));) { + String line = ""; + while ((line = isr.readLine()) != null) { + sb.append(line); + } + } catch (IOException e) { + throw e; + } + return sb.toString(); + } + + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new InputStreamReader(getInputStream())); + } + + @Override + public ServletInputStream getInputStream() throws IOException { + + final ByteArrayInputStream bais = new ByteArrayInputStream(body); + + return new ServletInputStream() { + + @Override + public int read() throws IOException { + return bais.read(); + } + + @Override + public boolean isFinished() { + return bais.available() == 0; + } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setReadListener(ReadListener readListener) { + } + }; + } +} \ No newline at end of file From d0511ed4ed5c76bc988b11215610a33d187e657a Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 15 May 2024 16:08:12 +0800 Subject: [PATCH 03/23] =?UTF-8?q?feat(REQ-2324):=20=E8=B0=83=E6=95=B4=20MQ?= =?UTF-8?q?=20=E7=B1=BB=E8=B7=AF=E5=BE=84,=20=E6=96=B0=E5=A2=9E=E4=BA=8B?= =?UTF-8?q?=E5=8A=A1=E5=9B=9E=E6=BB=9A=E7=9A=84=E5=9B=9E=E8=B0=83=E9=92=A9?= =?UTF-8?q?=E5=AD=90,=20=E5=90=8C=E6=97=B6=E5=9C=A8=E5=8F=91=E9=80=81?= =?UTF-8?q?=E6=88=90=E5=8A=9F=E7=9A=84=E5=9B=9E=E8=B0=83=E9=92=A9=E5=AD=90?= =?UTF-8?q?=E4=B8=AD,=E6=96=B0=E5=A2=9E=E8=BF=94=E5=9B=9E=20MQ=20=E7=9A=84?= =?UTF-8?q?=20MessageID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rocketmq/AbstractEventProducer.java | 70 ++++----------- .../rocketmq/AfterCommitExecutorImpl.java | 90 +++++++++++++++++++ .../rocketmq/RocketMQEventProducer.java | 6 +- 3 files changed, 110 insertions(+), 56 deletions(-) create mode 100644 axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/AfterCommitExecutorImpl.java diff --git a/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/AbstractEventProducer.java b/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/AbstractEventProducer.java index e4deab7..c74117c 100644 --- a/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/AbstractEventProducer.java +++ b/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/AbstractEventProducer.java @@ -38,6 +38,11 @@ public abstract class AbstractEventProducer implements EventProducer this.defaultContext = defaultContext; } + public BiConsumer> getRollbackHandler() { + return ((event, context) -> { + }); + } + @Override public void send(@NonNull Event event, @NonNull Context context) { // XXX:不要在send的时候修改event的值,有副作用。 @@ -69,12 +74,20 @@ public abstract class AbstractEventProducer implements EventProducer throw e; } }; + + Runnable rollbackRunnable = () -> { + try{ + getRollbackHandler().accept(copiedEvent, copiedContext); + } catch (Exception e) { + // ignore + } + }; if (copiedContext.isTransactional()) { // https://www.jianshu.com/p/59891ede5f90 runnable.run(); } else { // 并发会导致事件时序出现问题. 所以串行执行 - afterCommitExecutor.execute(() -> runnable.run()); + afterCommitExecutor.executeAndRollback(() -> runnable.run(), ()-> rollbackRunnable.run()); } } @@ -83,58 +96,7 @@ public abstract class AbstractEventProducer implements EventProducer send(event, defaultContext); } - /** - * stolen from http://azagorneanu.blogspot.jp/2013/06/transaction-synchronization-callbacks.html - * 保证在交易结束后被调用. - */ - private static class AfterCommitExecutorImpl extends TransactionSynchronizationAdapter { - private static final ThreadLocal> RUNNABLES = new ThreadLocal>(); - - public void execute(Runnable runnable) { - if (log.isDebugEnabled()) { - log.debug("Submitting new runnable {} to run after commit", runnable); - } - if (!TransactionSynchronizationManager.isSynchronizationActive()) { - if (log.isDebugEnabled()) { - log.debug("Transaction synchronization is NOT ACTIVE. Executing right now runnable {}", runnable); - } - runnable.run(); - return; - } - List threadRunnables = RUNNABLES.get(); - if (threadRunnables == null) { - threadRunnables = new ArrayList<>(); - RUNNABLES.set(threadRunnables); - TransactionSynchronizationManager.registerSynchronization(this); - } - threadRunnables.add(runnable); - } - - @Override - public void afterCommit() { - List threadRunnables = RUNNABLES.get(); - if (log.isDebugEnabled()) { - log.info("Transaction successfully committed, executing {} runnables", threadRunnables.size()); - } - for (int i = 0; i < threadRunnables.size(); i++) { - Runnable runnable = threadRunnables.get(i); - if (log.isDebugEnabled()) { - log.debug("Executing runnable {}", runnable); - } - try { - runnable.run(); - } catch (RuntimeException e) { - log.error("Failed to execute runnable " + runnable, e); - } - } - } - - @Override - public void afterCompletion(int status) { - if (log.isDebugEnabled()) { - log.debug("Transaction completed with status {}", status == TransactionSynchronization.STATUS_COMMITTED ? "COMMITTED" : "ROLLED_BACK"); - } - RUNNABLES.remove(); - } + public AfterCommitExecutorImpl getAfterCommitExecutor() { + return afterCommitExecutor; } } diff --git a/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/AfterCommitExecutorImpl.java b/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/AfterCommitExecutorImpl.java new file mode 100644 index 0000000..5817136 --- /dev/null +++ b/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/AfterCommitExecutorImpl.java @@ -0,0 +1,90 @@ +package cn.axzo.framework.rocketmq; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationAdapter; +import org.springframework.transaction.support.TransactionSynchronizationManager; + +import java.util.ArrayList; +import java.util.List; /** + * stolen from http://azagorneanu.blogspot.jp/2013/06/transaction-synchronization-callbacks.html + * 保证在交易结束后被调用. + */ +@Slf4j +public class AfterCommitExecutorImpl extends TransactionSynchronizationAdapter { + private static final ThreadLocal> RUNNABLES = new ThreadLocal>(); + private static final ThreadLocal> ROLLBACK_RUNNABLES = new ThreadLocal>(); + + public void execute(Runnable runnable) { + if (log.isDebugEnabled()) { + log.debug("Submitting new runnable {} to run after commit", runnable); + } + if (!TransactionSynchronizationManager.isSynchronizationActive()) { + if (log.isDebugEnabled()) { + log.debug("Transaction synchronization is NOT ACTIVE. Executing right now runnable {}", runnable); + } + runnable.run(); + return; + } + List threadRunnables = RUNNABLES.get(); + if (threadRunnables == null) { + threadRunnables = new ArrayList<>(); + RUNNABLES.set(threadRunnables); + TransactionSynchronizationManager.registerSynchronization(this); + } + threadRunnables.add(runnable); + } + + public void executeAndRollback(Runnable runnable, Runnable rollbackRunnable) { + execute(runnable); + if (TransactionSynchronizationManager.isSynchronizationActive()) { + List runnables = ROLLBACK_RUNNABLES.get(); + if (runnables == null) { + runnables = new ArrayList<>(); + ROLLBACK_RUNNABLES.set(runnables); + } + runnables.add(rollbackRunnable); + } + } + + @Override + public void afterCommit() { + List threadRunnables = RUNNABLES.get(); + if (log.isDebugEnabled()) { + log.info("Transaction successfully committed, executing {} runnables", threadRunnables.size()); + } + for (int i = 0; i < threadRunnables.size(); i++) { + Runnable runnable = threadRunnables.get(i); + if (log.isDebugEnabled()) { + log.debug("Executing runnable {}", runnable); + } + try { + runnable.run(); + } catch (RuntimeException e) { + log.error("Failed to execute runnable " + runnable, e); + } + } + } + + @Override + public void afterCompletion(int status) { + if (log.isDebugEnabled()) { + log.debug("Transaction completed with status {}", status == TransactionSynchronization.STATUS_COMMITTED ? "COMMITTED" : "ROLLED_BACK"); + } + if(status != TransactionSynchronization.STATUS_COMMITTED) { + for (int i = 0; i < ROLLBACK_RUNNABLES.get().size(); i++) { + Runnable runnable = ROLLBACK_RUNNABLES.get().get(i); + try{ + runnable.run(); + } catch (RuntimeException e) { + log.error("Failed to execute runnable at transaction ROLLBACK " + runnable, e); + } + } + } + RUNNABLES.remove(); + } + + public List getRunnables() { + return RUNNABLES.get(); + } +} diff --git a/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/RocketMQEventProducer.java b/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/RocketMQEventProducer.java index 406b209..ec37fee 100644 --- a/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/RocketMQEventProducer.java +++ b/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/RocketMQEventProducer.java @@ -30,6 +30,7 @@ public class RocketMQEventProducer extends AbstractEventProducer { * 一个扩展点.让外部可以在发送消息后做特殊逻辑处理. 比如发送消息统计, 消息元数据监控 */ private BiConsumer> sendCallback; + public static final String MQ_MESSAGE_ID = "messageId"; public RocketMQEventProducer(RocketMQTemplate rocketMQTemplate, String defaultModule, @@ -73,9 +74,10 @@ public class RocketMQEventProducer extends AbstractEventProducer { try { // 同步发送超时时间支持在properties中设置 SendResult sendResult = rocketMQTemplate.syncSendOrderly(destination, messageBuilder.build(), getMessageShardingKey(event, context)); - log.info("====MQ PRODUCER SYNC====, context={}, message = {}, queueId = {}", - context, event.toPrettyJsonString(), sendResult.getMessageQueue().getQueueId()); + log.info("====MQ PRODUCER SYNC====, context={}, message = {}, messageId = {} queueId = {}", + context, event.toPrettyJsonString(), sendResult.getMsgId(), sendResult.getMessageQueue().getQueueId()); if (sendCallback != null) { + context.getHeaders().put(MQ_MESSAGE_ID, sendResult.getMsgId()); sendCallback.accept(event, context); } } catch (Throwable e) { From 63706c7dee923ca5618f417f5aaea8bceadec375 Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 10:30:07 +0800 Subject: [PATCH 04/23] =?UTF-8?q?common-trace=E6=A8=A1=E5=9D=97:pom.xml?= =?UTF-8?q?=E5=8E=BB=E6=8E=89groupId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- axzo-common-loggings/axzo-common-trace/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/axzo-common-loggings/axzo-common-trace/pom.xml b/axzo-common-loggings/axzo-common-trace/pom.xml index 59c9464..71c6ea2 100644 --- a/axzo-common-loggings/axzo-common-trace/pom.xml +++ b/axzo-common-loggings/axzo-common-trace/pom.xml @@ -7,7 +7,6 @@ cn.axzo.framework.logging 1.0.0-SNAPSHOT - com.axzo.framework axzo-common-trace Axzo Common trace From 0a00c818db062f011aa7eaad063fae3438bd9702 Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 10:42:08 +0800 Subject: [PATCH 05/23] =?UTF-8?q?common-trace=E6=A8=A1=E5=9D=97:common?= =?UTF-8?q?=E7=9A=84pom.xml=E4=B8=AD=E5=8A=A0=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- axzo-common-loggings/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/axzo-common-loggings/pom.xml b/axzo-common-loggings/pom.xml index f54dbc4..81b55f1 100644 --- a/axzo-common-loggings/pom.xml +++ b/axzo-common-loggings/pom.xml @@ -18,5 +18,6 @@ log4j2-starter logback-starter + axzo-common-trace \ No newline at end of file From e1723c511b604cf9bf282fdb153475b9e770214a Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 11:19:36 +0800 Subject: [PATCH 06/23] =?UTF-8?q?common-trace=E6=A8=A1=E5=9D=97:common?= =?UTF-8?q?=E7=9A=84pom.xml=E4=B8=AD=E5=8A=A0=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo-common-trace/pom.xml | 5 ++ .../trace/interceptor/RequestLog.java | 49 ++++++++++++++++ .../framework/trace/util/RequestUtil.java | 58 +++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLog.java create mode 100644 axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/util/RequestUtil.java diff --git a/axzo-common-loggings/axzo-common-trace/pom.xml b/axzo-common-loggings/axzo-common-trace/pom.xml index 71c6ea2..ea77910 100644 --- a/axzo-common-loggings/axzo-common-trace/pom.xml +++ b/axzo-common-loggings/axzo-common-trace/pom.xml @@ -41,6 +41,11 @@ commons-io + + org.aspectj + aspectjrt + + diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLog.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLog.java new file mode 100644 index 0000000..e3ac05b --- /dev/null +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLog.java @@ -0,0 +1,49 @@ +package com.axzo.framework.trace.interceptor; + +import cn.hutool.json.JSONUtil; +import com.axzo.framework.trace.util.RequestUtil; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; +import org.springframework.util.StopWatch; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; + +/** + * 打印出入参及耗时 + * + * @author TanJ + * @date 2021/5/12 + */ +@Aspect +@Slf4j +@Component +public class RequestLog { + + final String checkDeath = "checkDeath"; + + @Around("@within(restController)||@annotation(restController)") + @SneakyThrows + public Object request(ProceedingJoinPoint joinPoint, RestController restController) { + + HttpServletRequest request = RequestUtil.getRequest(); + + if (request == null) { + return joinPoint.proceed(); + } + if (request.getRequestURL().toString().contains(checkDeath)) { + return joinPoint.proceed(); + } + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + Object proceed = joinPoint.proceed(); + stopWatch.stop(); + log.info("[response]返回记录:responseParam = {} latency = {}", JSONUtil.toJsonStr(proceed), + stopWatch.getTotalTimeMillis()); + return proceed; + } +} diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/util/RequestUtil.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/util/RequestUtil.java new file mode 100644 index 0000000..4164c29 --- /dev/null +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/util/RequestUtil.java @@ -0,0 +1,58 @@ +package com.axzo.framework.trace.util; + +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author TanJ + * @date 2021/5/24 + */ +public class RequestUtil { + + + /** + * getRequest + * + * @return + */ + public static HttpServletRequest getRequest() { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + if (requestAttributes!=null) { + return + ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) + .getRequest(); + } + + return null; + } + + + /** + * getResponse + * + * @return + */ + public static HttpServletResponse getResponse() { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + if (null != requestAttributes) { + return + ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) + .getResponse(); + } + return null; + } + + + /** + * setInheritableHolder + */ + public static void setInheritableHolder() { + RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true); + } + + +} From 2e17494bb82045d540db5620f26779fa7e8b0003 Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 11:31:23 +0800 Subject: [PATCH 07/23] =?UTF-8?q?=E5=8A=A0=E4=B8=8Aresponse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- axzo-common-loggings/axzo-common-trace/pom.xml | 5 +++++ .../com/axzo/framework/trace/interceptor/RequestLog.java | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/axzo-common-loggings/axzo-common-trace/pom.xml b/axzo-common-loggings/axzo-common-trace/pom.xml index ea77910..cb3d1d8 100644 --- a/axzo-common-loggings/axzo-common-trace/pom.xml +++ b/axzo-common-loggings/axzo-common-trace/pom.xml @@ -46,6 +46,11 @@ aspectjrt + + org.springframework.cloud + spring-cloud-openfeign-core + + diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLog.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLog.java index e3ac05b..82636ae 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLog.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLog.java @@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; +import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Component; import org.springframework.util.StopWatch; import org.springframework.web.bind.annotation.RestController; @@ -26,9 +27,9 @@ public class RequestLog { final String checkDeath = "checkDeath"; - @Around("@within(restController)||@annotation(restController)") + @Around("@within(restController)||@annotation(restController)||@within(feignClient)") @SneakyThrows - public Object request(ProceedingJoinPoint joinPoint, RestController restController) { + public Object request(ProceedingJoinPoint joinPoint, RestController restController, FeignClient feignClient) { HttpServletRequest request = RequestUtil.getRequest(); From dd1827f8ce43a84ffc5103dc91dfb6b53bdb5f02 Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 12:51:56 +0800 Subject: [PATCH 08/23] =?UTF-8?q?TraceIdFilter=E6=B3=A8=E9=87=8A@configrut?= =?UTF-8?q?ion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/axzo/framework/trace/interceptor/TraceIdFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java index 12624c1..ac019df 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java @@ -23,7 +23,7 @@ import java.util.UUID; * @date 2021/5/24 */ @Slf4j -@ConditionalOnProperty(prefix = "axzo.log.pokonya", name = "enable", havingValue = "true", matchIfMissing = true) +//@ConditionalOnProperty(prefix = "axzo.log.pokonya", name = "enable", havingValue = "true", matchIfMissing = true) @Component @Order(-99999) public class TraceIdFilter extends OncePerRequestFilter { From a191d19dce5c4cfa86cf86285c1961a92680f983 Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 14:44:06 +0800 Subject: [PATCH 09/23] =?UTF-8?q?common-trace=E4=BC=98=E5=8C=96pom.xml?= =?UTF-8?q?=E4=B8=AD=E5=8C=85=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo-common-trace/pom.xml | 15 ------ .../trace/interceptor/RequestLog.java | 50 ------------------- .../RequestLogHandlerInterceptor.java | 2 +- .../trace/interceptor/TraceIdFilter.java | 2 +- 4 files changed, 2 insertions(+), 67 deletions(-) delete mode 100644 axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLog.java diff --git a/axzo-common-loggings/axzo-common-trace/pom.xml b/axzo-common-loggings/axzo-common-trace/pom.xml index cb3d1d8..04d42f7 100644 --- a/axzo-common-loggings/axzo-common-trace/pom.xml +++ b/axzo-common-loggings/axzo-common-trace/pom.xml @@ -11,11 +11,6 @@ Axzo Common trace - - org.springframework.boot - spring-boot-starter-logging - - org.springframework.boot spring-boot-starter-web @@ -41,16 +36,6 @@ commons-io - - org.aspectj - aspectjrt - - - - org.springframework.cloud - spring-cloud-openfeign-core - - diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLog.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLog.java deleted file mode 100644 index 82636ae..0000000 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLog.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.axzo.framework.trace.interceptor; - -import cn.hutool.json.JSONUtil; -import com.axzo.framework.trace.util.RequestUtil; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.stereotype.Component; -import org.springframework.util.StopWatch; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletRequest; - -/** - * 打印出入参及耗时 - * - * @author TanJ - * @date 2021/5/12 - */ -@Aspect -@Slf4j -@Component -public class RequestLog { - - final String checkDeath = "checkDeath"; - - @Around("@within(restController)||@annotation(restController)||@within(feignClient)") - @SneakyThrows - public Object request(ProceedingJoinPoint joinPoint, RestController restController, FeignClient feignClient) { - - HttpServletRequest request = RequestUtil.getRequest(); - - if (request == null) { - return joinPoint.proceed(); - } - if (request.getRequestURL().toString().contains(checkDeath)) { - return joinPoint.proceed(); - } - StopWatch stopWatch = new StopWatch(); - stopWatch.start(); - Object proceed = joinPoint.proceed(); - stopWatch.stop(); - log.info("[response]返回记录:responseParam = {} latency = {}", JSONUtil.toJsonStr(proceed), - stopWatch.getTotalTimeMillis()); - return proceed; - } -} diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java index d27f32d..749a389 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java @@ -26,7 +26,7 @@ import java.nio.charset.Charset; * @date 2021/12/13 11:13 */ @Slf4j -@ConditionalOnProperty(prefix = "axzo.log.pokonya", name = "enable", havingValue = "true", matchIfMissing = true) +@ConditionalOnProperty(prefix = "axzo.log.common.trace", name = "enable", havingValue = "true", matchIfMissing = true) @Component public class RequestLogHandlerInterceptor implements HandlerInterceptor, WebMvcConfigurer { diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java index ac019df..7a7ccd5 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java @@ -23,7 +23,7 @@ import java.util.UUID; * @date 2021/5/24 */ @Slf4j -//@ConditionalOnProperty(prefix = "axzo.log.pokonya", name = "enable", havingValue = "true", matchIfMissing = true) +@ConditionalOnProperty(prefix = "axzo.log.common.trace", name = "enable", havingValue = "true", matchIfMissing = true) @Component @Order(-99999) public class TraceIdFilter extends OncePerRequestFilter { From 6d3795f5a5c3d717bcb769b035f9683f40981e04 Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 15:21:42 +0800 Subject: [PATCH 10/23] =?UTF-8?q?common-trace=E4=BC=98=E5=8C=96=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/trace/interceptor/FeignFillHeaderInterceptor.java | 2 -- .../com/axzo/framework/trace/interceptor/TraceIdFilter.java | 2 -- 2 files changed, 4 deletions(-) diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignFillHeaderInterceptor.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignFillHeaderInterceptor.java index af87bd4..c7c835c 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignFillHeaderInterceptor.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignFillHeaderInterceptor.java @@ -24,7 +24,6 @@ public class FeignFillHeaderInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { requestTemplate.header(TRACE_ID, MDC.get(TRACE_ID)); - log.info("FeignFillHeaderInterceptor apply,traceId:{}", MDC.get(TRACE_ID)); requestTemplate.header(SPAN_ID, this.buildNextSpanId()); } @@ -42,7 +41,6 @@ public class FeignFillHeaderInterceptor implements RequestInterceptor { AtomicLong atomicLong = new AtomicLong(Long.parseLong(MDC.get(LOGIC_ID))); Long nextSpanId = atomicLong.getAndIncrement(); MDC.put(LOGIC_ID, atomicLong.toString()); - log.info("buildNextSpanId spanId:{}, nextSpanId:{}", spanId, nextSpanId); return spanId + "." + nextSpanId; } diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java index 7a7ccd5..6230eb4 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java @@ -62,7 +62,6 @@ public class TraceIdFilter extends OncePerRequestFilter { @NonNull HttpServletResponse response) { String traceId = this.fetchTraceId(request); - log.info("TraceIdFilter setTraceId,traceId:{}", traceId); //set MDC.put(TRACE_ID, traceId); MDC.put(CTX_LOG_ID, traceId); @@ -89,7 +88,6 @@ public class TraceIdFilter extends OncePerRequestFilter { private String fetchSpanId(HttpServletRequest request) { // blank to new String spanId = StrUtil.blankToDefault(request.getHeader(SPAN_ID), "0"); - log.info("TraceIdFilter fetchSpanId,spanId:{}", spanId); return spanId; } } From e57eb1015741f934907321e4741f11625fcb501a Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 15:25:53 +0800 Subject: [PATCH 11/23] =?UTF-8?q?common-trace=E4=BC=98=E5=8C=96=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trace/interceptor/RequestLogHandlerInterceptor.java | 3 --- .../com/axzo/framework/trace/interceptor/TraceIdFilter.java | 3 +-- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java index 749a389..0275cc0 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java @@ -21,9 +21,6 @@ import java.nio.charset.Charset; /** * 简单的打印一些入参 - * - * @author tanjie@axzo.cn - * @date 2021/12/13 11:13 */ @Slf4j @ConditionalOnProperty(prefix = "axzo.log.common.trace", name = "enable", havingValue = "true", matchIfMissing = true) diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java index 6230eb4..93cdf1b 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java @@ -19,8 +19,7 @@ import java.io.IOException; import java.util.UUID; /** - * @author TanJ - * @date 2021/5/24 + * 设置日志中traceId-MDC中设置traceId */ @Slf4j @ConditionalOnProperty(prefix = "axzo.log.common.trace", name = "enable", havingValue = "true", matchIfMissing = true) From e8605c2aa5a4b69817d936de38675b2d62912fff Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 15:57:21 +0800 Subject: [PATCH 12/23] =?UTF-8?q?common-trace=E4=BC=98=E5=8C=96=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/axzo/framework/trace/interceptor/TraceIdFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java index 93cdf1b..24e33c1 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java @@ -50,7 +50,7 @@ public class TraceIdFilter extends OncePerRequestFilter { //do try { - filterChain.doFilter(bodyRequest, response); + filterChain.doFilter(request, response); } finally { MDC.clear(); } From 82d85e447d65b86ff0b558077911e3408548445c Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 16:06:33 +0800 Subject: [PATCH 13/23] =?UTF-8?q?common-trace=E5=8E=BB=E6=8E=89=E8=AF=B7?= =?UTF-8?q?=E6=B1=82wrapper=E5=8C=85=E8=A3=85=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interceptor/RequestLogHandlerInterceptor.java | 4 ---- .../framework/trace/interceptor/TraceIdFilter.java | 10 +--------- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java index 0275cc0..da6f977 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java @@ -50,10 +50,6 @@ public class RequestLogHandlerInterceptor implements HandlerInterceptor, WebMvcC if (request.getDispatcherType().equals(DispatcherType.ERROR)) { return; } - if (!(request instanceof BodyReaderHttpServletRequestWrapper)) { - log.warn("print request log error : current request entity not support"); - return; - } String method = request.getMethod(); StringBuffer requestUrl = request.getRequestURL(); diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java index 24e33c1..3ec2d36 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java @@ -38,16 +38,8 @@ public class TraceIdFilter extends OncePerRequestFilter { protected void doFilterInternal(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull FilterChain filterChain) throws ServletException, IOException { - - // wrapper - BodyReaderHttpServletRequestWrapper bodyRequest = new BodyReaderHttpServletRequestWrapper( - request); - // trace id 补充 - - ExceptionUtil.ignoreException(() -> setTraceId(bodyRequest, response), null); - - + ExceptionUtil.ignoreException(() -> setTraceId(request, response), null); //do try { filterChain.doFilter(request, response); From 9cd8117331b3de2e6781519e000b555a394b8cec Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 16:06:44 +0800 Subject: [PATCH 14/23] =?UTF-8?q?common-trace=E5=8E=BB=E6=8E=89=E8=AF=B7?= =?UTF-8?q?=E6=B1=82wrapper=E5=8C=85=E8=A3=85=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trace/interceptor/RequestLogHandlerInterceptor.java | 1 - 1 file changed, 1 deletion(-) diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java index da6f977..daa43e4 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java @@ -3,7 +3,6 @@ package com.axzo.framework.trace.interceptor; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.axzo.framework.trace.util.ExceptionUtil; -import com.axzo.framework.trace.wrapper.BodyReaderHttpServletRequestWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; From 49b49e1086a0b5a8c68a313bbc9a672bbb7197a8 Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 16:25:08 +0800 Subject: [PATCH 15/23] =?UTF-8?q?=E5=8A=A0=E4=B8=8ABodyReaderHttpServletRe?= =?UTF-8?q?questWrapper?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/trace/interceptor/TraceIdFilter.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java index 3ec2d36..93cdf1b 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java @@ -38,11 +38,19 @@ public class TraceIdFilter extends OncePerRequestFilter { protected void doFilterInternal(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull FilterChain filterChain) throws ServletException, IOException { + + // wrapper + BodyReaderHttpServletRequestWrapper bodyRequest = new BodyReaderHttpServletRequestWrapper( + request); + // trace id 补充 - ExceptionUtil.ignoreException(() -> setTraceId(request, response), null); + + ExceptionUtil.ignoreException(() -> setTraceId(bodyRequest, response), null); + + //do try { - filterChain.doFilter(request, response); + filterChain.doFilter(bodyRequest, response); } finally { MDC.clear(); } From 377030333cc8e77b9c05c8c86578e5b12dc2740d Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 16:56:07 +0800 Subject: [PATCH 16/23] =?UTF-8?q?BodyReaderHttpServletRequestWrapper#body?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BodyReaderHttpServletRequestWrapper.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/wrapper/BodyReaderHttpServletRequestWrapper.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/wrapper/BodyReaderHttpServletRequestWrapper.java index 5f252ab..87e7021 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/wrapper/BodyReaderHttpServletRequestWrapper.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/wrapper/BodyReaderHttpServletRequestWrapper.java @@ -9,8 +9,10 @@ import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.Part; +import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -33,8 +35,7 @@ public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapp super(request); this.request = request; // request.getParameterMap(); - String sessionStream = getBodyString(request); - body = sessionStream.getBytes(Charset.forName("UTF-8")); + body = getBodyBytes(request); } @@ -44,6 +45,20 @@ public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapp return request.getParts(); } + private byte[] getBodyBytes(ServletRequest request) throws IOException { + try (BufferedInputStream bis = new BufferedInputStream(request.getInputStream()); + ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + byte[] buffer = new byte[1024]; + int len; + while ((len = bis.read(buffer)) > 0) { + baos.write(buffer, 0, len); + } + return baos.toByteArray(); + } catch (IOException ex) { + throw ex; + } + } + private String getBodyString(ServletRequest request) throws IOException { StringBuilder sb = new StringBuilder(); InputStream ins = request.getInputStream(); From b09935129f2d4d0037510531cd86ca2cfb911d5f Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 16 May 2024 17:22:29 +0800 Subject: [PATCH 17/23] =?UTF-8?q?TraceIdFilter=E5=A2=9E=E5=8A=A0contentTyp?= =?UTF-8?q?e=3Dformdata=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RequestLogHandlerInterceptor.java | 5 +++++ .../trace/interceptor/TraceIdFilter.java | 22 +++++++++++-------- .../BodyReaderHttpServletRequestWrapper.java | 19 ++-------------- 3 files changed, 20 insertions(+), 26 deletions(-) diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java index daa43e4..7ec26f1 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java @@ -3,6 +3,7 @@ package com.axzo.framework.trace.interceptor; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.axzo.framework.trace.util.ExceptionUtil; +import com.axzo.framework.trace.wrapper.BodyReaderHttpServletRequestWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -49,6 +50,10 @@ public class RequestLogHandlerInterceptor implements HandlerInterceptor, WebMvcC if (request.getDispatcherType().equals(DispatcherType.ERROR)) { return; } + if (!(request instanceof BodyReaderHttpServletRequestWrapper)) { + log.info("[requestUrl:{}][method:{}][param:{}]", request.getRequestURL(), request.getMethod(), JSON.toJSONString(request.getParameterMap())); + return; + } String method = request.getMethod(); StringBuffer requestUrl = request.getRequestURL(); diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java index 93cdf1b..b4cdc22 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java @@ -9,6 +9,7 @@ import org.slf4j.MDC; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; @@ -38,19 +39,22 @@ public class TraceIdFilter extends OncePerRequestFilter { protected void doFilterInternal(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull FilterChain filterChain) throws ServletException, IOException { + if ((StringUtils.hasText(request.getContentType()) && request.getContentType().toLowerCase().startsWith("multipart/form-data"))) { + this.doFilter(filterChain, request, response); + } else { + // wrapper + BodyReaderHttpServletRequestWrapper bodyRequest = new BodyReaderHttpServletRequestWrapper( + request); + this.doFilter(filterChain, bodyRequest, response); + } + } - // wrapper - BodyReaderHttpServletRequestWrapper bodyRequest = new BodyReaderHttpServletRequestWrapper( - request); - + private void doFilter(FilterChain filterChain, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // trace id 补充 - - ExceptionUtil.ignoreException(() -> setTraceId(bodyRequest, response), null); - - + ExceptionUtil.ignoreException(() -> setTraceId(request, response), null); //do try { - filterChain.doFilter(bodyRequest, response); + filterChain.doFilter(request, response); } finally { MDC.clear(); } diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/wrapper/BodyReaderHttpServletRequestWrapper.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/wrapper/BodyReaderHttpServletRequestWrapper.java index 87e7021..5f252ab 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/wrapper/BodyReaderHttpServletRequestWrapper.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/wrapper/BodyReaderHttpServletRequestWrapper.java @@ -9,10 +9,8 @@ import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.Part; -import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -35,7 +33,8 @@ public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapp super(request); this.request = request; // request.getParameterMap(); - body = getBodyBytes(request); + String sessionStream = getBodyString(request); + body = sessionStream.getBytes(Charset.forName("UTF-8")); } @@ -45,20 +44,6 @@ public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapp return request.getParts(); } - private byte[] getBodyBytes(ServletRequest request) throws IOException { - try (BufferedInputStream bis = new BufferedInputStream(request.getInputStream()); - ByteArrayOutputStream baos = new ByteArrayOutputStream()) { - byte[] buffer = new byte[1024]; - int len; - while ((len = bis.read(buffer)) > 0) { - baos.write(buffer, 0, len); - } - return baos.toByteArray(); - } catch (IOException ex) { - throw ex; - } - } - private String getBodyString(ServletRequest request) throws IOException { StringBuilder sb = new StringBuilder(); InputStream ins = request.getInputStream(); From bd2fae86989b825bde5fc4cca818c300b84ecee1 Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 30 May 2024 16:52:25 +0800 Subject: [PATCH 18/23] =?UTF-8?q?TraceIdFilter=E9=87=8D=E5=91=BD=E5=90=8DT?= =?UTF-8?q?raceSpanIdFilter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo-common-trace/pom.xml | 5 - .../RequestLogHandlerInterceptor.java | 97 ------------------- ...ceIdFilter.java => TraceSpanIdFilter.java} | 2 +- 3 files changed, 1 insertion(+), 103 deletions(-) delete mode 100644 axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java rename axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/{TraceIdFilter.java => TraceSpanIdFilter.java} (98%) diff --git a/axzo-common-loggings/axzo-common-trace/pom.xml b/axzo-common-loggings/axzo-common-trace/pom.xml index 04d42f7..c7efbb1 100644 --- a/axzo-common-loggings/axzo-common-trace/pom.xml +++ b/axzo-common-loggings/axzo-common-trace/pom.xml @@ -31,11 +31,6 @@ fastjson - - commons-io - commons-io - - diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java deleted file mode 100644 index 7ec26f1..0000000 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/RequestLogHandlerInterceptor.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.axzo.framework.trace.interceptor; - -import cn.hutool.json.JSONUtil; -import com.alibaba.fastjson.JSON; -import com.axzo.framework.trace.util.ExceptionUtil; -import com.axzo.framework.trace.wrapper.BodyReaderHttpServletRequestWrapper; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.HandlerInterceptor; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -import javax.servlet.DispatcherType; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.nio.charset.Charset; - -/** - * 简单的打印一些入参 - */ -@Slf4j -@ConditionalOnProperty(prefix = "axzo.log.common.trace", name = "enable", havingValue = "true", matchIfMissing = true) -@Component -public class RequestLogHandlerInterceptor implements HandlerInterceptor, WebMvcConfigurer { - - private static final String CHECK_DEATH_URL = "/checkDeath"; - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - //filter check death - if (request.getRequestURI().contains(CHECK_DEATH_URL)) { - return true; - } - - if (handler instanceof HandlerMethod) { - ExceptionUtil.ignoreException(() -> processRequestLog(request), (e) -> log.warn(e.getMessage(), e)); - return true; - } - - log.info("[requestUrl:{}]", request.getRequestURL()); - - return true; - } - - private void processRequestLog(HttpServletRequest request) { - if (request.getDispatcherType().equals(DispatcherType.ERROR)) { - return; - } - if (!(request instanceof BodyReaderHttpServletRequestWrapper)) { - log.info("[requestUrl:{}][method:{}][param:{}]", request.getRequestURL(), request.getMethod(), JSON.toJSONString(request.getParameterMap())); - return; - } - String method = request.getMethod(); - StringBuffer requestUrl = request.getRequestURL(); - - if ("get".equalsIgnoreCase(method)) { - log.info("[requestUrl:{}][method:{}][param:{}]", requestUrl, method, JSON.toJSONString(request.getParameterMap())); - return; - } - - if ("post".equalsIgnoreCase(method)) { - try { - String body = IOUtils.toString(request.getInputStream(), Charset.defaultCharset()); - boolean isJson = JSONUtil.isTypeJSON(body); - boolean shortLength = body.length() < 4000; - if (shortLength) { - body = isJson ? JSONUtil.toJsonStr(JSONUtil.isTypeJSONObject(body) ? JSON.parseObject(body) : JSON.parseArray(body)) : body; - log.info("[requestUrl:{}][method:{}][param:{}][body:{}]", requestUrl, method, - JSON.toJSONString(request.getParameterMap()), body); - return; - } else { - log.warn("request body too long, ignore print"); - } - log.info("requestUrl:{}", requestUrl); - - } catch (IOException ioException) { - log.warn("打印参数失败[requestUrl:{}]", requestUrl, ioException); - } - - return; - } - //other method - log.info("requestUrl:{}", requestUrl); - } - - - @Override - public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(this); - } - - -} diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceSpanIdFilter.java similarity index 98% rename from axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java rename to axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceSpanIdFilter.java index b4cdc22..a026874 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceIdFilter.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/TraceSpanIdFilter.java @@ -26,7 +26,7 @@ import java.util.UUID; @ConditionalOnProperty(prefix = "axzo.log.common.trace", name = "enable", havingValue = "true", matchIfMissing = true) @Component @Order(-99999) -public class TraceIdFilter extends OncePerRequestFilter { +public class TraceSpanIdFilter extends OncePerRequestFilter { private static final String TRACE_ID = "traceId"; private static final String CTX_LOG_ID = "ctxLogId"; From fcfebf712e82a3bb811275aeeb7bf541855bfe0a Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 30 May 2024 18:21:24 +0800 Subject: [PATCH 19/23] =?UTF-8?q?=E5=8A=A0=E4=B8=8AtraceId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/trace/interceptor/FeignFillHeaderInterceptor.java | 1 + 1 file changed, 1 insertion(+) diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignFillHeaderInterceptor.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignFillHeaderInterceptor.java index c7c835c..1e3106d 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignFillHeaderInterceptor.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignFillHeaderInterceptor.java @@ -23,6 +23,7 @@ public class FeignFillHeaderInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { + log.info("FeignFillHeaderInterceptor,traceId:{}", MDC.get(TRACE_ID)); requestTemplate.header(TRACE_ID, MDC.get(TRACE_ID)); requestTemplate.header(SPAN_ID, this.buildNextSpanId()); } From 78a4566ef266bfa08d69ddd421990381ba4aaf0f Mon Sep 17 00:00:00 2001 From: xudawei Date: Fri, 31 May 2024 11:10:45 +0800 Subject: [PATCH 20/23] =?UTF-8?q?feign=E8=B0=83=E7=94=A8=E5=8A=A0=E4=B8=8A?= =?UTF-8?q?traceId/ctxLogId/x-request-id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trace/interceptor/FeignFillHeaderInterceptor.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignFillHeaderInterceptor.java b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignFillHeaderInterceptor.java index 1e3106d..1cc8550 100644 --- a/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignFillHeaderInterceptor.java +++ b/axzo-common-loggings/axzo-common-trace/src/main/java/com/axzo/framework/trace/interceptor/FeignFillHeaderInterceptor.java @@ -17,6 +17,8 @@ import java.util.concurrent.atomic.AtomicLong; @Configuration @Slf4j public class FeignFillHeaderInterceptor implements RequestInterceptor { + private static final String CTX_LOG_ID = "ctxLogId"; + private static final String X_REQUEST_ID = "x-request-id"; private static final String TRACE_ID = "traceId"; private static final String SPAN_ID = "spanId"; private static final String LOGIC_ID = "logicId"; @@ -25,6 +27,8 @@ public class FeignFillHeaderInterceptor implements RequestInterceptor { public void apply(RequestTemplate requestTemplate) { log.info("FeignFillHeaderInterceptor,traceId:{}", MDC.get(TRACE_ID)); requestTemplate.header(TRACE_ID, MDC.get(TRACE_ID)); + requestTemplate.header(CTX_LOG_ID, MDC.get(TRACE_ID)); + requestTemplate.header(X_REQUEST_ID, MDC.get(TRACE_ID)); requestTemplate.header(SPAN_ID, this.buildNextSpanId()); } From cbe7e726ddbc23fb2d20cfcde86d3bfe5c9ac3a9 Mon Sep 17 00:00:00 2001 From: wangli Date: Tue, 4 Jun 2024 22:38:20 +0800 Subject: [PATCH 21/23] =?UTF-8?q?=E5=AE=8C=E5=96=84=20RespErrorCodeMapping?= =?UTF-8?q?Properties=20=E7=9A=84=E9=85=8D=E7=BD=AE=E5=8F=AF=E8=A6=86?= =?UTF-8?q?=E7=9B=96=E8=83=BD=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/exception/RespErrorCodeMappingProperties.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/RespErrorCodeMappingProperties.java b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/RespErrorCodeMappingProperties.java index 9d53f28..21148c9 100644 --- a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/RespErrorCodeMappingProperties.java +++ b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/RespErrorCodeMappingProperties.java @@ -60,6 +60,13 @@ public class RespErrorCodeMappingProperties { DEFAULT_NON_BASE_MAPPING.put("*", UNAVAILABLE_FOR_LEGAL_REASONS); } + @Getter + private HttpStatus defaultNonBaseHttpStatus; + + public void setDefaultNonBaseHttpStatus(HttpStatus defaultNonBaseHttpStatus) { + DEFAULT_NON_BASE_MAPPING.put("*", defaultNonBaseHttpStatus); + } + // 基础错误响应码 -> HTTP状态码 @NotNull @Setter From 5146756789217f6f3a432a8b13c53ae681d4cbc4 Mon Sep 17 00:00:00 2001 From: wangli Date: Tue, 4 Jun 2024 22:46:50 +0800 Subject: [PATCH 22/23] =?UTF-8?q?=E5=8F=91=E9=80=81=20MQ=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81,=E8=87=AA=E5=AE=9A=E4=B9=89=E8=BF=BD=E5=8A=A0=20heade?= =?UTF-8?q?r?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/framework/rocketmq/AbstractEventProducer.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/AbstractEventProducer.java b/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/AbstractEventProducer.java index c74117c..c65d318 100644 --- a/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/AbstractEventProducer.java +++ b/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/AbstractEventProducer.java @@ -15,6 +15,7 @@ import org.springframework.transaction.support.TransactionSynchronizationManager import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.function.BiConsumer; @@ -96,6 +97,12 @@ public abstract class AbstractEventProducer implements EventProducer send(event, defaultContext); } + public void send(@NonNull Event event, Map addHeader) { + Map headers = defaultContext.getHeaders(); + headers.putAll(addHeader); + send(event, defaultContext); + } + public AfterCommitExecutorImpl getAfterCommitExecutor() { return afterCommitExecutor; } From 3007736f2c32e5db16f686b3c31e97f6b9626c65 Mon Sep 17 00:00:00 2001 From: wangli Date: Tue, 4 Jun 2024 22:52:24 +0800 Subject: [PATCH 23/23] =?UTF-8?q?=E5=8F=91=E9=80=81=20MQ=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81,=E8=87=AA=E5=AE=9A=E4=B9=89=E8=BF=BD=E5=8A=A0=20heade?= =?UTF-8?q?r?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/framework/rocketmq/AbstractEventProducer.java | 1 + .../java/cn/axzo/framework/rocketmq/EventProducer.java | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/AbstractEventProducer.java b/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/AbstractEventProducer.java index c65d318..2831890 100644 --- a/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/AbstractEventProducer.java +++ b/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/AbstractEventProducer.java @@ -97,6 +97,7 @@ public abstract class AbstractEventProducer implements EventProducer send(event, defaultContext); } + @Override public void send(@NonNull Event event, Map addHeader) { Map headers = defaultContext.getHeaders(); headers.putAll(addHeader); diff --git a/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/EventProducer.java b/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/EventProducer.java index ade5f16..8cdb4c5 100644 --- a/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/EventProducer.java +++ b/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/EventProducer.java @@ -29,6 +29,14 @@ public interface EventProducer { */ void send(Event event); + /** + * 发送 event, 使用默认的 context,并在 context 中追加 header 属性 + * + * @param event + * @param addHeaders + */ + void send(Event event, Map addHeaders); + @Getter @Builder(toBuilder = true) @NoArgsConstructor