diff --git a/yudao-dependencies/pom.xml b/yudao-dependencies/pom.xml index c285378ae2..a81752a34e 100644 --- a/yudao-dependencies/pom.xml +++ b/yudao-dependencies/pom.xml @@ -40,7 +40,7 @@ 9.6.0 3.5.9 - 0.33.0 + 1.39.0 8.0.2.RELEASE 1.1.15 @@ -343,45 +343,25 @@ - org.apache.skywalking - apm-toolkit-trace - ${skywalking.version} + io.opentelemetry + opentelemetry-api + ${opentelemetry.version} + + + io.opentelemetry + opentelemetry-sdk + ${opentelemetry.version} + + + io.opentelemetry + opentelemetry-exporter-otlp + ${opentelemetry.version} org.apache.skywalking apm-toolkit-logback-1.x ${skywalking.version} - - org.apache.skywalking - apm-toolkit-opentracing - ${skywalking.version} - - - - - - - - - - - - - io.opentracing - opentracing-api - ${opentracing.version} - - - io.opentracing - opentracing-util - ${opentracing.version} - - - io.opentracing - opentracing-noop - ${opentracing.version} - de.codecentric diff --git a/yudao-framework/yudao-common/pom.xml b/yudao-framework/yudao-common/pom.xml index ec19c8e57a..357c12b4b5 100644 --- a/yudao-framework/yudao-common/pom.xml +++ b/yudao-framework/yudao-common/pom.xml @@ -66,8 +66,8 @@ - org.apache.skywalking - apm-toolkit-trace + io.opentelemetry + opentelemetry-api diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/monitor/TracerUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/monitor/TracerUtils.java index 81092b6565..e61338a533 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/monitor/TracerUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/monitor/TracerUtils.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.framework.common.util.monitor; -import org.apache.skywalking.apm.toolkit.trace.TraceContext; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; /** * 链路追踪工具类 @@ -18,13 +19,14 @@ public class TracerUtils { } /** - * 获得链路追踪编号,直接返回 SkyWalking 的 TraceId。 + * 获得链路追踪编号,直接返回 OpenTelemetry 的 TraceId。 * 如果不存在的话为空字符串!!! * * @return 链路追踪编号 */ public static String getTraceId() { - return TraceContext.traceId(); + SpanContext context = Span.current().getSpanContext(); + return context.isValid() ? context.getTraceId() : ""; } } diff --git a/yudao-framework/yudao-spring-boot-starter-monitor/pom.xml b/yudao-framework/yudao-spring-boot-starter-monitor/pom.xml index 6b6970fbef..e3da8843bf 100644 --- a/yudao-framework/yudao-spring-boot-starter-monitor/pom.xml +++ b/yudao-framework/yudao-spring-boot-starter-monitor/pom.xml @@ -42,13 +42,18 @@ - io.opentracing - opentracing-util + io.opentelemetry + opentelemetry-api true - org.apache.skywalking - apm-toolkit-trace + io.opentelemetry + opentelemetry-sdk + true + + + io.opentelemetry + opentelemetry-exporter-otlp true @@ -56,11 +61,6 @@ apm-toolkit-logback-1.x true - - org.apache.skywalking - apm-toolkit-opentracing - true - diff --git a/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/config/YudaoTracerAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/config/YudaoTracerAutoConfiguration.java index 596b516757..53e9135d5d 100644 --- a/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/config/YudaoTracerAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/config/YudaoTracerAutoConfiguration.java @@ -1,9 +1,14 @@ package cn.iocoder.yudao.framework.tracer.config; import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum; +import cn.iocoder.yudao.framework.tracer.core.aop.BizTraceAspect; import cn.iocoder.yudao.framework.tracer.core.filter.TraceFilter; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.trace.Tracer; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; @@ -16,28 +21,27 @@ import org.springframework.context.annotation.Bean; */ @AutoConfiguration @ConditionalOnClass(name = { - "org.apache.skywalking.apm.toolkit.opentracing.SkywalkingTracer", // 来自 apm-toolkit-opentracing.jar -// "io.opentracing.Tracer", // 来自 opentracing-api.jar + "io.opentelemetry.api.trace.Tracer", // 来自 opentelemetry-api.jar "jakarta.servlet.Filter" }) @EnableConfigurationProperties(TracerProperties.class) @ConditionalOnProperty(prefix = "yudao.tracer", value = "enable", matchIfMissing = true) public class YudaoTracerAutoConfiguration { - // TODO @芋艿:skywalking 不兼容最新的 opentracing 版本。同时,opentracing 也停止了维护,尬住了!后续换 opentelemetry 即可! -// @Bean -// public BizTraceAspect bizTracingAop() { -// return new BizTraceAspect(tracer()); -// } -// -// @Bean -// public Tracer tracer() { -// // 创建 SkywalkingTracer 对象 -// SkywalkingTracer tracer = new SkywalkingTracer(); -// // 设置为 GlobalTracer 的追踪器 -// GlobalTracer.registerIfAbsent(tracer); -// return tracer; -// } + @Value("${spring.application.name:application}") + private String applicationName; + + @Bean + @ConditionalOnMissingBean + public Tracer tracer() { + return GlobalOpenTelemetry.getTracer(applicationName); + } + + @Bean + @ConditionalOnMissingBean + public BizTraceAspect bizTracingAop(Tracer tracer) { + return new BizTraceAspect(tracer); + } /** * 创建 TraceFilter 过滤器,响应 header 设置 traceId diff --git a/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/core/aop/BizTraceAspect.java b/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/core/aop/BizTraceAspect.java index 3c3b9f3bb3..f66699445e 100644 --- a/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/core/aop/BizTraceAspect.java +++ b/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/core/aop/BizTraceAspect.java @@ -5,9 +5,9 @@ import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.tracer.core.annotation.BizTrace; import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils; import cn.iocoder.yudao.framework.tracer.core.util.TracerFrameworkUtils; -import io.opentracing.Span; -import io.opentracing.Tracer; -import io.opentracing.tag.Tags; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.context.Scope; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; @@ -36,10 +36,10 @@ public class BizTraceAspect { public Object around(ProceedingJoinPoint joinPoint, BizTrace trace) throws Throwable { // 创建 span String operationName = getOperationName(joinPoint, trace); - Span span = tracer.buildSpan(operationName) - .withTag(Tags.COMPONENT.getKey(), "biz") - .start(); - try { + Span span = tracer.spanBuilder(operationName) + .setAttribute("component", "biz") + .startSpan(); + try (Scope ignored = span.makeCurrent()) { // 执行原有方法 return joinPoint.proceed(); } catch (Throwable throwable) { @@ -49,7 +49,7 @@ public class BizTraceAspect { // 设置 Span 的 biz 属性 setBizTag(span, joinPoint, trace); // 完成 Span - span.finish(); + span.end(); } } @@ -67,8 +67,8 @@ public class BizTraceAspect { private void setBizTag(Span span, ProceedingJoinPoint joinPoint, BizTrace trace) { try { Map result = SpringExpressionUtils.parseExpressions(joinPoint, asList(trace.type(), trace.id())); - span.setTag(BizTrace.TYPE_TAG, MapUtil.getStr(result, trace.type())); - span.setTag(BizTrace.ID_TAG, MapUtil.getStr(result, trace.id())); + span.setAttribute(BizTrace.TYPE_TAG, MapUtil.getStr(result, trace.type())); + span.setAttribute(BizTrace.ID_TAG, MapUtil.getStr(result, trace.id())); } catch (Exception ex) { log.error("[setBizTag][解析 bizType 与 bizId 发生异常]", ex); } diff --git a/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/core/util/TracerFrameworkUtils.java b/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/core/util/TracerFrameworkUtils.java index 51323e7c20..c751eb1aa1 100644 --- a/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/core/util/TracerFrameworkUtils.java +++ b/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/core/util/TracerFrameworkUtils.java @@ -1,12 +1,10 @@ package cn.iocoder.yudao.framework.tracer.core.util; -import io.opentracing.Span; -import io.opentracing.tag.Tags; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.StatusCode; import java.io.PrintWriter; import java.io.StringWriter; -import java.util.HashMap; -import java.util.Map; /** * 链路追踪 Util @@ -22,25 +20,24 @@ public class TracerFrameworkUtils { * @param span Span */ public static void onError(Throwable throwable, Span span) { - Tags.ERROR.set(span, Boolean.TRUE); - if (throwable != null) { - span.log(errorLogs(throwable)); + // 忽略无效 Span + if (span == null || !span.getSpanContext().isValid()) { + return; + } + // 标记异常状态 + if (throwable == null) { + span.setStatus(StatusCode.ERROR); + return; } - } - private static Map errorLogs(Throwable throwable) { - Map errorLogs = new HashMap(10); - errorLogs.put("event", Tags.ERROR.getKey()); - errorLogs.put("error.object", throwable); - errorLogs.put("error.kind", throwable.getClass().getName()); + // 记录异常事件 + span.recordException(throwable); String message = throwable.getCause() != null ? throwable.getCause().getMessage() : throwable.getMessage(); - if (message != null) { - errorLogs.put("message", message); - } + span.setStatus(StatusCode.ERROR, message == null ? "" : message); + // 记录异常堆栈 StringWriter sw = new StringWriter(); throwable.printStackTrace(new PrintWriter(sw)); - errorLogs.put("stack", sw.toString()); - return errorLogs; + span.setAttribute("error.stack", sw.toString()); } }