-1

我有一个旧应用程序,我试图在其中引入 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 ?我预计跨度将传播到方法调用链。

4

1 回答 1

1

我在 jax-rs 应用程序中遇到了类似的问题。为我解决这个问题的是添加 jaeger 和 opentracing-jaxrs2 依赖项。

    <dependency>
        <groupId>io.jaegertracing</groupId>
        <artifactId>jaeger-client</artifactId>
        <version>1.5.0</version>
    </dependency>

    <dependency>
        <groupId>io.opentracing.contrib</groupId>
        <artifactId>opentracing-jaxrs2</artifactId>
        <version>1.0.0</version>
    </dependency>

我在 web.xml 文件中添加了 filter 和 filter-mapping 标签,如下所示:

<filter>
    <filter-name>TracingFilter</filter-name>
    <filter-class>io.opentracing.contrib.web.servlet.filter.TracingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>TracingFilter</filter-name>
    <url-pattern>*</url-pattern>
</filter-mapping>

我认为问题在于 java CDI 没有注入这些过滤器。

干杯!

于 2021-04-09T19:40:59.557 回答