第 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(); } }