第 20 章 Eclipse MicroProfile

20.1. 使用 Eclipse MicroProfile OpenTracing to Trace 请求

重要

Eclipse Microprofile OpenTracing 仅作为技术预览提供。技术预览功能不包括在红帽生产服务级别协议(SLA)中,且其功能可能并不完善。因此,红帽不建议在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

如需有关技术预览功能支持范围的信息,请参阅红帽客户门户网站中的技术预览功能支持范围。

Eclipse Microprofile OpenTracing 功能由 microprofile-opentracing-smallrye 子系统提供。此子系统随附 Jaeger Client 作为默认 tracer,它为 Jakarta EE 应用程序中常用的组件提供了一组检测库,如 Jakarta RESTful Web 服务和上下文以及依赖注入。 有关此子系统的更多信息,请参阅《配置指南 》中的 MicroProfile OpenTracing SmallRye 子系统跟踪请求

以下小节介绍了如何自定义 Jakarta 上下文和依赖注入 Bean 和其他 Jakarta RESTful Web 服务端点的追踪 ,以及如何实施自定义追踪器

20.1.1. 为 Jakarta Contexts 和 Dependency Injection Bean 启用或禁用追踪

如 Eclipse MicroProfile OpenTracing 规范中所定义,如果存在 org.eclipse.microprofile.opentracing.Traced 注释,则会跟踪 Jakarta Contexts 和 Dependency Injection beans。可以通过将注解值设置为 false 来禁用追踪。同样,可以通过为该注解指定 parameter operationName 来设置自定义操作名称。语义由 MicroProfile OpenTracing 规范定义

以下示例演示了如何配置 Jakarta Contexts 和 Dependency Injection bean 的追踪。请注意,追踪可以在方法级别上指定。

import org.eclipse.microprofile.opentracing.Traced;

@Traced
public class TracedBean {
    public void doSomething() {
    }

    @Traced(true)
    public void doSomethingTraced() {
    }

    @Traced(false)
    public void doSomethingNotTraced() {
    }
}

以下示例演示了如何为此追踪点为 OpenTracing Span 指定操作名称。

import org.eclipse.microprofile.opentracing.Traced;

@Traced(operationName = "my-custom-class-operation-name")
public class CustomOperationNameBean {

    @Traced(operationName = "my-custom-method-operation-name")
    public void doSomething() {
    }

    @Traced
    public void doSomethingElse() {
    }
}

20.1.2. 为 Jakarta RESTful Web Services Endpoints 启用或禁用 Tracing

如果服务器配置中存在 microprofile-opentracing-smallrye 子系统,则默认跟踪 Jakarta RESTful Web Services 端点。

要禁用 Jakarta RESTful Web 服务端点的追踪,请将 @Traced(false) 注释添加到类或方法级别的 Jakarta RESTful Web Services 端点,如以上 Jakarta Contexts 和 Dependency Injection Beans 的 Enable 或 Disable Tracing 中所述。

20.1.3. 实施自定义追踪器

如果您需要比默认 Jaeger Client 提供的更复杂的内容,可以通过实施 TracerResolver 来提供自己的 tracer,它将返回有所需状态的 Tracer Resolver本例中不使用默认的 tracer。

以下示例演示了如何创建新的 TracerResolver 实施,该实施返回 Tracer 类的自定义实施。

import io.opentracing.Tracer;
import io.opentracing.contrib.tracerresolver.TracerResolver;
import org.myproject.opentracing.CustomTracer;

public static class MyTracerResolver extends TracerResolver {
    @Override
    protected Tracer resolve() {
        return new CustomTracer();
    }
}