From 09596e9b4b9798454cd347368020a6129da149f9 Mon Sep 17 00:00:00 2001 From: redkale Date: Fri, 20 Oct 2023 15:40:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96traceid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/redkale/mq/MessageServlet.java | 2 + src/main/java/org/redkale/net/Context.java | 1 + .../org/redkale/net/client/ClientCodec.java | 12 +++++ .../org/redkale/net/http/HttpServlet.java | 1 + src/main/java/org/redkale/util/Traces.java | 54 ++++--------------- 5 files changed, 26 insertions(+), 44 deletions(-) diff --git a/src/main/java/org/redkale/mq/MessageServlet.java b/src/main/java/org/redkale/mq/MessageServlet.java index d2f31f8cb..973c4d123 100644 --- a/src/main/java/org/redkale/mq/MessageServlet.java +++ b/src/main/java/org/redkale/mq/MessageServlet.java @@ -72,6 +72,8 @@ public abstract class MessageServlet implements MessageProcessor { onError(response, message, ex); } logger.log(Level.SEVERE, getClass().getSimpleName() + " process error, message=" + message, ex instanceof CompletionException ? ((CompletionException) ex).getCause() : ex); + } finally { + Traces.removeTraceid(); } } diff --git a/src/main/java/org/redkale/net/Context.java b/src/main/java/org/redkale/net/Context.java index 379a13361..261408807 100644 --- a/src/main/java/org/redkale/net/Context.java +++ b/src/main/java/org/redkale/net/Context.java @@ -123,6 +123,7 @@ public class Context { response.context.logger.log(Level.WARNING, "Execute servlet occur exception. request = " + request, t); response.finishError(t); } + Traces.removeTraceid(); }); } else { try { diff --git a/src/main/java/org/redkale/net/client/ClientCodec.java b/src/main/java/org/redkale/net/client/ClientCodec.java index 59efe05a3..b444033c0 100644 --- a/src/main/java/org/redkale/net/client/ClientCodec.java +++ b/src/main/java/org/redkale/net/client/ClientCodec.java @@ -141,21 +141,25 @@ public abstract class ClientCodec implements Complet readThread.runWork(() -> { Traces.computeIfAbsent(request.traceid); respFuture.complete(rs); + Traces.removeTraceid(); }); } else if (workThread.getState() == Thread.State.RUNNABLE) { //fullCache时state不是RUNNABLE if (workThread.inIO()) { Traces.computeIfAbsent(request.traceid); respFuture.complete(rs); + Traces.removeTraceid(); } else { workThread.execute(() -> { Traces.computeIfAbsent(request.traceid); respFuture.complete(rs); + Traces.removeTraceid(); }); } } else { workThread.runWork(() -> { Traces.computeIfAbsent(request.traceid); respFuture.complete(rs); + Traces.removeTraceid(); }); } } else { //异常 @@ -163,21 +167,25 @@ public abstract class ClientCodec implements Complet readThread.runWork(() -> { Traces.computeIfAbsent(request.traceid); respFuture.completeExceptionally(exc); + Traces.removeTraceid(); }); } else if (workThread.getState() == Thread.State.RUNNABLE) { //fullCache时state不是RUNNABLE if (workThread.inIO()) { Traces.computeIfAbsent(request.traceid); respFuture.completeExceptionally(exc); + Traces.removeTraceid(); } else { workThread.execute(() -> { Traces.computeIfAbsent(request.traceid); respFuture.completeExceptionally(exc); + Traces.removeTraceid(); }); } } else { workThread.runWork(() -> { Traces.computeIfAbsent(request.traceid); respFuture.completeExceptionally(exc); + Traces.removeTraceid(); }); } } @@ -186,21 +194,25 @@ public abstract class ClientCodec implements Complet readThread.runWork(() -> { Traces.computeIfAbsent(request.traceid); respFuture.completeExceptionally(t); + Traces.removeTraceid(); }); } else if (workThread.getState() == Thread.State.RUNNABLE) { //fullCache时state不是RUNNABLE if (workThread.inIO()) { Traces.computeIfAbsent(request.traceid); respFuture.completeExceptionally(t); + Traces.removeTraceid(); } else { workThread.execute(() -> { Traces.computeIfAbsent(request.traceid); respFuture.completeExceptionally(t); + Traces.removeTraceid(); }); } } else { workThread.runWork(() -> { Traces.computeIfAbsent(request.traceid); respFuture.completeExceptionally(t); + Traces.removeTraceid(); }); } connection.client.logger.log(Level.INFO, "Complete result error, request: " + respFuture.request, t); diff --git a/src/main/java/org/redkale/net/http/HttpServlet.java b/src/main/java/org/redkale/net/http/HttpServlet.java index 170d6a72d..d1350132b 100644 --- a/src/main/java/org/redkale/net/http/HttpServlet.java +++ b/src/main/java/org/redkale/net/http/HttpServlet.java @@ -89,6 +89,7 @@ public class HttpServlet extends Servlet response.getContext().getLogger().log(Level.WARNING, "Servlet occur exception. request = " + request, t); response.finishError(t); } + Traces.removeTraceid(); }); } } else { diff --git a/src/main/java/org/redkale/util/Traces.java b/src/main/java/org/redkale/util/Traces.java index 390c8c886..c43b5dd2b 100644 --- a/src/main/java/org/redkale/util/Traces.java +++ b/src/main/java/org/redkale/util/Traces.java @@ -3,6 +3,7 @@ package org.redkale.util; import java.util.UUID; +import java.util.concurrent.atomic.AtomicLong; import java.util.function.Supplier; /** @@ -20,15 +21,12 @@ public class Traces { private static final String PROCESS_ID = UUID.randomUUID().toString().replaceAll("-", ""); - private static final ThreadLocal THREAD_SEQUENCE = ThreadLocal.withInitial(IdSequence::new); + private static final AtomicLong sequence = new AtomicLong(System.currentTimeMillis()); + + private static final Supplier tidSupplier = () -> PROCESS_ID + sequence.incrementAndGet(); private static final ThreadLocal localTrace = new ThreadLocal<>(); - //借用Skywalking的GlobalIdGenerator生成ID的规则 - private static final Supplier tidSupplier = () -> PROCESS_ID - + "." + Thread.currentThread().getId() - + "." + THREAD_SEQUENCE.get().nextSeq(); - public static boolean enable() { return enable; } @@ -41,6 +39,12 @@ public class Traces { return enable ? localTrace.get() : null; } + public static void removeTraceid() { + if (enable) { + localTrace.remove(); + } + } + public static String computeIfAbsent(String requestTraceid) { if (enable) { String rs = requestTraceid; @@ -52,42 +56,4 @@ public class Traces { } return requestTraceid; } - - private static class IdSequence { - - private long lastTimestamp; - - private short threadSeq; - - private long lastShiftTimestamp; - - private int lastShiftValue; - - public IdSequence() { - this.lastTimestamp = System.currentTimeMillis(); - } - - public long nextSeq() { - long rs = timestamp() * 10000; - if (threadSeq == 10000) { - threadSeq = 0; - } - return rs + threadSeq++; - } - - private long timestamp() { - long currentTimeMillis = System.currentTimeMillis(); - if (currentTimeMillis < lastTimestamp) { - // Just for considering time-shift-back by Ops or OS. @hanahmily 's suggestion. - if (lastShiftTimestamp != currentTimeMillis) { - lastShiftValue++; - lastShiftTimestamp = currentTimeMillis; - } - return lastShiftValue; - } else { - lastTimestamp = currentTimeMillis; - return lastTimestamp; - } - } - } }