|
@@ -0,0 +1,90 @@
|
|
|
+package com.diagbot.util;
|
|
|
+
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.slf4j.MDC;
|
|
|
+
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import java.net.InetAddress;
|
|
|
+import java.util.concurrent.ThreadLocalRandom;
|
|
|
+
|
|
|
+public class TraceIdUtil {
|
|
|
+
|
|
|
+ public static final String TRACE_ID_KEY = "Trace-Id";
|
|
|
+
|
|
|
+ public static final String TRACE_ID_VALUE_DEFAULT = "000000";
|
|
|
+
|
|
|
+ public static void setTraceId(String traceId) {
|
|
|
+ //如果参数为空,则设置默认traceId
|
|
|
+ //将traceId放到MDC中
|
|
|
+ MDC.put(TRACE_ID_KEY, traceId);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getTraceId() {
|
|
|
+ String traceId = MDC.get(TRACE_ID_KEY);
|
|
|
+
|
|
|
+ return StringUtils.isNotBlank(traceId) ? traceId : TRACE_ID_VALUE_DEFAULT;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * generate traceId: https://help.aliyun.com/document_detail/151840.html
|
|
|
+ */
|
|
|
+ public static String genTraceId() {
|
|
|
+
|
|
|
+ try {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ InetAddress addr = InetAddress.getLocalHost();
|
|
|
+ if (null == addr) {
|
|
|
+ return TRACE_ID_VALUE_DEFAULT;
|
|
|
+ }
|
|
|
+ String addrStr = addr.getHostAddress();
|
|
|
+ if (null == addrStr) {
|
|
|
+ return TRACE_ID_VALUE_DEFAULT;
|
|
|
+ }
|
|
|
+ String[] addrArr = addrStr.split("\\.");
|
|
|
+ if (addrArr.length != 4) {
|
|
|
+ return TRACE_ID_VALUE_DEFAULT;
|
|
|
+ }
|
|
|
+
|
|
|
+ sb.append(StringUtils.leftPad(Integer.toHexString(Integer.valueOf(addrArr[0])) , 2, "0"))
|
|
|
+ .append(StringUtils.leftPad(Integer.toHexString(Integer.valueOf(addrArr[1])) , 2, "0"))
|
|
|
+ .append(StringUtils.leftPad(Integer.toHexString(Integer.valueOf(addrArr[2])) , 2, "0"))
|
|
|
+ .append(StringUtils.leftPad(Integer.toHexString(Integer.valueOf(addrArr[3])) , 2, "0"))
|
|
|
+ .append(System.currentTimeMillis())
|
|
|
+ .append(ThreadLocalRandom.current().nextInt(1000, 10000))
|
|
|
+ .append(getCurrentPID());
|
|
|
+
|
|
|
+ return sb.toString();
|
|
|
+ } catch (Exception e) {
|
|
|
+ return TRACE_ID_VALUE_DEFAULT;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getCurrentPID() {
|
|
|
+ try {
|
|
|
+ // 获取当前进程的PID(通过调用系统命令)
|
|
|
+ String processName = java.lang.management.ManagementFactory.getRuntimeMXBean().getName();
|
|
|
+ return processName.split("@")[0];
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return ThreadLocalRandom.current().nextInt(10000, 100000)+"";
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void initTraceId(HttpServletRequest request) {
|
|
|
+ String traceId = "";
|
|
|
+ if (request != null) {
|
|
|
+ //get traceId from request
|
|
|
+ traceId = request.getHeader(TraceIdUtil.TRACE_ID_KEY);
|
|
|
+ }
|
|
|
+ //generate new traceId
|
|
|
+ if (StringUtils.isBlank(traceId) || TRACE_ID_VALUE_DEFAULT.equals(traceId)){
|
|
|
+ traceId = TraceIdUtil.genTraceId();
|
|
|
+ }
|
|
|
+
|
|
|
+ TraceIdUtil.setTraceId(traceId);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String[] args) {
|
|
|
+ System.out.println(TraceIdUtil.genTraceId());
|
|
|
+ }
|
|
|
+}
|