我有一个旧应用程序,我试图在其中引入 opentrace。我没有更改单个方法,而是添加了 AOP/aspectJ 来添加跨度。但是当我尝试这样做时
Span currentSpan = GlobalTracer.get().activeSpan()
在我的原始代码中, currentSpan 为空。
我想知道为什么 ?
这是我的代码方面/AOP。
package com.visenti.LogAspectJ;
import io.jaegertracing.Configuration;
import io.jaegertracing.internal.JaegerTracer;
import io.opentracing.Scope;
import io.opentracing.Span;
import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;
import org.aspectj.lang.Signature;
public aspect LogAspectJ {
pointcut methodExecution(): execution(* com.visenti.globaliams..*.*(..));
private Tracer tracer = initTracer("AspectJ");
public static JaegerTracer initTracer(String service) {
System.setProperty("JAEGER_AGENT_HOST", "*.*.*.*");
Configuration.SamplerConfiguration samplerConfig = Configuration.SamplerConfiguration.fromEnv().withType("const").withParam(1);
Configuration.ReporterConfiguration reporterConfig = Configuration.ReporterConfiguration.fromEnv().withLogSpans(true);
Configuration config = new Configuration(service).withSampler(samplerConfig).withReporter(reporterConfig);
JaegerTracer tracer = config.getTracer();
GlobalTracer.registerIfAbsent(tracer);
return tracer;
}
Object around(): methodExecution() {
Signature signature = thisJoinPoint.getSignature();
String operationName = signature.getName();
String declaringTypeName = signature.getDeclaringType().getSimpleName()+"::"+operationName;
Tracer.SpanBuilder spanBuilder = tracer.buildSpan(declaringTypeName);
Span spanStart = spanBuilder.start();
Scope scope = tracer.activateSpan(spanStart);
Object response = proceed();
scope.close();
spanStart.finish();
return response;
}
}
这是我试图获取父跨度的旧代码。下面的方法被 AOP 覆盖,我可以在调试器中看到。
我想了解的是为什么它是 null ?我预计跨度将传播到方法调用链。