diff --git a/pom.xml b/pom.xml index c62d64c..5d358f9 100644 --- a/pom.xml +++ b/pom.xml @@ -208,16 +208,16 @@ feign-micrometer - - - - + + + io.micrometer + micrometer-tracing + - - - - - + + io.micrometer + micrometer-tracing-bridge-brave + org.springframework.kafka diff --git a/src/main/java/com/laker/admin/config/EasySimpleTracingConfiguration.java b/src/main/java/com/laker/admin/config/EasySimpleTracingConfiguration.java new file mode 100644 index 0000000..144a727 --- /dev/null +++ b/src/main/java/com/laker/admin/config/EasySimpleTracingConfiguration.java @@ -0,0 +1,44 @@ +package com.laker.admin.config; + +import brave.Tracer; +import brave.handler.MutableSpan; +import brave.handler.SpanHandler; +import brave.propagation.TraceContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.logging.Level; +import java.util.logging.Logger; + +@Configuration +public class EasySimpleTracingConfiguration { + // 默认是Tracer.NOOP,添加了Brave到classpath后,默认是BraveTracer + // trace协议/追踪实现 + 存储 Zipkin / Jaeger / Console Logging 等追踪后端 + // SpanHandler LogSpanHandler 会将Span信息输出到日志 + // ConsoleSpanHandler 会将Span信息输出到控制台 + // BraveAutoConfiguration + // from Tracing LogSpanHandler + + + @Bean + // 开启会把所有的span信息输出到日志 + public SpanHandler logSpanHandler() { + return new LogSpanHandler(); + } + + static final class LogSpanHandler extends SpanHandler { + final Logger logger = Logger.getLogger(Tracer.class.getName()); + + @Override + public boolean end(TraceContext context, MutableSpan span, Cause cause) { + if (!logger.isLoggable(Level.INFO)) return false; + logger.info(span.toString()); + return true; + } + + @Override + public String toString() { + return "LogSpanHandler{name=" + logger.getName() + "}"; + } + } +} diff --git a/src/main/java/com/laker/admin/framework/EasyAdminConstants.java b/src/main/java/com/laker/admin/framework/EasyAdminConstants.java index a724585..b4557b6 100644 --- a/src/main/java/com/laker/admin/framework/EasyAdminConstants.java +++ b/src/main/java/com/laker/admin/framework/EasyAdminConstants.java @@ -3,7 +3,7 @@ package com.laker.admin.framework; public interface EasyAdminConstants { String APPLICATION_NAME = "easy-admin"; String CURRENT_USER = "currentUser"; - String TRACE_ID = "traceId"; + String TRACE_ID = "traceID"; // 用于追踪请求 区分micrometer tracing的traceId String USER_ID = "userId"; String TOKEN_TYPE = "tokenType"; diff --git a/src/main/java/com/laker/admin/framework/ext/filter/MDCTraceIDFilter.java b/src/main/java/com/laker/admin/framework/ext/filter/MDCTraceIDFilter.java index c68bb7d..128e2e6 100644 --- a/src/main/java/com/laker/admin/framework/ext/filter/MDCTraceIDFilter.java +++ b/src/main/java/com/laker/admin/framework/ext/filter/MDCTraceIDFilter.java @@ -22,7 +22,8 @@ import org.springframework.web.filter.OncePerRequestFilter; import java.io.IOException; -@Order(value = Ordered.HIGHEST_PRECEDENCE + 100) +// 要在所有的filter之前执行 例如 ServerHttpObservationFilter +@Order(value = Ordered.HIGHEST_PRECEDENCE) @Component @WebFilter(filterName = "MDCTraceIDFilter", urlPatterns = "/*") @Slf4j diff --git a/src/main/java/com/laker/admin/module/ext/controller/DemoController.java b/src/main/java/com/laker/admin/module/ext/controller/DemoController.java index 7bbe2e4..867b8af 100644 --- a/src/main/java/com/laker/admin/module/ext/controller/DemoController.java +++ b/src/main/java/com/laker/admin/module/ext/controller/DemoController.java @@ -162,7 +162,9 @@ public class DemoController { // 它将包含对 log 关联的内置支持,W3C上下文传递将是默认传播类型,我们将支持自动传播元数据,以供 tracing 基础设施(称为“远程包裹”)使用,帮助标记观察结果。 // 最重要的变化是我们引入了一个新的API:Observation API。 // 它创建理念是,希望用户使用单一 API 就能检测代码,并从中获得多种信息(例如 metrics, tracing, logging)。 - // classpath 添加了 Micrometer Tracing + // DefaultMeterObservationHandler 内部有Timer 和longTaskTimer + // 如果 classpath 添加了 Micrometer Tracing DefaultTracingObservationHandler + // TracingAwareMeterObservationHandler return Observation.createNotStarted("my.observation", registry) // Low cardinality means that the number of potential values won't be big. Low cardinality entries will end up in e.g. Metrics .lowCardinalityKeyValue("userType", "userType1") diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 803a091..61b5e38 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -143,9 +143,10 @@ easy: time: 1000 # actuator management: - tracing: + tracing: # 开启链路追踪 enabled: true sampling: + # 默认情况下,Spring Boot 仅对 10% 的请求进行采样,以防止跟踪后端不堪重负。此属性将其切换为 100%,以便每个请求都发送到跟踪后端。 probability: 1.0 endpoint: info: @@ -232,7 +233,7 @@ springdoc: logging: level: #feign日志以什么级别监控哪个接口:即对哪个Feign接口进行日志检查 - com.laker.admin.module.remote: debug + com.laker.admin.module.remote: error org.springframework.web.client.RestTemplate: error # 配置 Resilience4j CircuitBreaker diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 64ce4b4..2352904 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -37,7 +37,7 @@ + value="%clr(%d{HH:mm:ss.SSS}){faint} %clr(%5p) %clr(---){faint} %clr([%15.15t]) [%X{userId:-},%X{traceID:-},%X{traceId:-},%X{spanId:-}] %clr(%-60.60logger{59}){cyan} %clr(:%line){cyan} %m%n%wEx"/>