10.7. OpenTelemetry 追踪应用程序开发


虽然 JBoss EAP 会自动和隐式跟踪对 Jakarta RESTful Web Services 应用的 REST 调用,但您可以从应用程序中创建自定义范围以进行精细的追踪。span 是 trace 中的单个操作。例如,您可以在应用程序中创建一个范围,例如定义资源,称为方法,以此类推。您可以通过注入 Tracer 实例来在应用程序中创建自定义 trace。

10.7.1. 为 OpenTelemetry tracing 配置 Maven 项目

要创建 OpenTelemetry 追踪应用程序,请创建一个具有所需依赖项和目录结构的 Maven 项目。

先决条件

流程

  1. 在 CLI 中,使用 mvn 命令来设置 Maven 项目。此命令为项目创建目录结构,以及 pom.xml 配置文件。

    语法

    $ mvn archetype:generate \
    -DgroupId=<group-to-which-your-application-belongs> \
    -DartifactId=<name-of-your-application> \
    -DarchetypeGroupId=org.apache.maven.archetypes \
    -DarchetypeArtifactId=maven-archetype-webapp \
    -DinteractiveMode=false
    Copy to Clipboard Toggle word wrap

    Example

    $ mvn archetype:generate \
    -DgroupId=com.example.opentelemetry \
    -DartifactId=simple-tracing-example \
    -DarchetypeGroupId=org.apache.maven.archetypes \
    -DarchetypeArtifactId=maven-archetype-webapp \
    -DinteractiveMode=false
    Copy to Clipboard Toggle word wrap

  2. 导航到应用程序根目录。

    语法

    $ cd <name-of-your-application>
    Copy to Clipboard Toggle word wrap

    Example

    $ cd simple-tracing-example
    Copy to Clipboard Toggle word wrap

  3. 更新生成的 pom.xml 文件。

    1. 设置以下属性:

      <properties>
          <maven.compiler.source>1.8</maven.compiler.source>
          <maven.compiler.target>1.8</maven.compiler.target>
          <failOnMissingWebXml>false</failOnMissingWebXml>
          <version.server.bom>4.0.0.GA</version.server.bom>
          <version.wildfly-jar.maven.plugin>6.1.1.Final</version.wildfly-jar.maven.plugin>
      </properties>
      Copy to Clipboard Toggle word wrap
    2. 设置以下依赖项:

      <dependencies>
          <dependency>
              <groupId>jakarta.enterprise</groupId>
              <artifactId>jakarta.enterprise.cdi-api</artifactId>
              <version>2.0.2</version>
              <scope>provided</scope>
          </dependency>
      
          <dependency>
              <groupId>org.jboss.spec.javax.ws.rs</groupId>
              <artifactId>jboss-jaxrs-api_2.1_spec</artifactId>
              <version>2.0.2.Final</version>
              <scope>provided</scope>
          </dependency>
      
          <dependency>
              <groupId>io.opentelemetry</groupId>
              <artifactId>opentelemetry-api</artifactId>
              <version>1.5.0</version>
              <scope>provided</scope>
          </dependency>
      </dependencies>
      Copy to Clipboard Toggle word wrap
    3. 将以下构建配置设置为使用 mvn widlfy:deploy 来部署应用程序:

      <build>
        <!-- Set the name of the archive -->
        <finalName>${project.artifactId}</finalName>
        <plugins>
          <!-- Allows to use mvn wildfly:deploy -->
          <plugin>
            <groupId>org.wildfly.plugins</groupId>
            <artifactId>wildfly-maven-plugin</artifactId>
          </plugin>
        </plugins>
      </build>
      Copy to Clipboard Toggle word wrap

验证

  • 在应用程序根目录中,输入以下命令:

    $ mvn install
    Copy to Clipboard Toggle word wrap

    您会看到类似如下的输出:

    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 1.440 s
    [INFO] Finished at: 2021-12-27T14:45:12+05:30
    [INFO] ------------------------------------------------------------------------
    Copy to Clipboard Toggle word wrap

现在,您可以创建一个 OpenTelemetry 追踪应用程序。

10.7.2. 创建创建自定义范围的应用程序

以下流程演示了如何创建可创建两个自定义 span 的应用程序,如下所示:

  • prepare-hello - 当应用中的方法 getHello () 被调用时。
  • process-hello - 当值 hello 分配给一个新的 String 对象 hello 时。

此流程还演示了如何在 Jaeger 控制台中查看这些 span。该流程中的 & lt;application_root > 表示包含 pom.xml 文件的目录,其中包含应用程序的 Maven 配置。

先决条件

流程

  1. 在 & lt;application_root > 中,创建一个用于存储 Java 文件的目录。

    语法

    $ mkdir -p src/main/java/com/example/opentelemetry
    Copy to Clipboard Toggle word wrap

    Example

    $ mkdir -p src/main/java/com/example/opentelemetry
    Copy to Clipboard Toggle word wrap

  2. 前往新目录。

    语法

    $ cd src/main/java/com/example/opentelemetry
    Copy to Clipboard Toggle word wrap

    Example

    $ cd src/main/java/com/example/opentelemetry
    Copy to Clipboard Toggle word wrap

  3. 创建包含以下内容的 JakartaRestApplication.java 文件:此 JakartaRestApplication 类将应用声明为 Jakarta RESTful Web Services 应用。

    package com.example.opentelemetry;
    
    import javax.ws.rs.ApplicationPath;
    import javax.ws.rs.core.Application;
    
    @ApplicationPath("/")
    public class JakartaRestApplication extends Application {
    }
    Copy to Clipboard Toggle word wrap
  4. 创建包含以下内容的 ExplicitlyTracedBean.java 文件,其内容为 class ExplicitlyTracedBean。此类通过注入 Tracer 类来创建自定义 span。

    package com.example.opentelemetry;
    
    import javax.enterprise.context.RequestScoped;
    import javax.inject.Inject;
    import io.opentelemetry.api.trace.Span;
    import io.opentelemetry.api.trace.Tracer;
    
    @RequestScoped
    public class ExplicitlyTracedBean {
    
        @Inject
        private Tracer tracer; 
    1
    
    
        public String getHello() {
            Span prepareHelloSpan = tracer.spanBuilder("prepare-hello").startSpan(); 
    2
    
            prepareHelloSpan.makeCurrent();
    
            String hello = "hello";
    
            Span processHelloSpan = tracer.spanBuilder("process-hello").startSpan(); 
    3
    
            processHelloSpan.makeCurrent();
    
            hello = hello.toUpperCase();
    
            processHelloSpan.end();
            prepareHelloSpan.end();
    
            return hello;
        }
    }
    Copy to Clipboard Toggle word wrap
    1
    注入 Tracer 类以创建自定义范围。
    2
    创建名为 prepare-hello 的 span,以指示方法 getHello () 被调用。
    3
    创建名为 process-hello 的 span,以指示值 hello 已分配给名为 hello 的新 String 对象。
  5. TracedResource.java 类创建包含以下内容的 TracedResource.java 文件。此文件注入 ExplicitlyTracedBean 类,并声明两个端点: tracedcdi-trace

    package com.example.opentelemetry;
    
    import javax.enterprise.context.RequestScoped;
    import javax.inject.Inject;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    
    @Path("/hello")
    @RequestScoped
    public class TracedResource {
        @Inject
        private ExplicitlyTracedBean tracedBean;
    
        @GET
        @Path("/traced")
        @Produces(MediaType.TEXT_PLAIN)
        public String hello() {
            return "hello";
        }
    
        @GET
        @Path("/cdi-trace")
        @Produces(MediaType.TEXT_PLAIN)
        public String cdiHello() {
            return tracedBean.getHello();
        }
    }
    Copy to Clipboard Toggle word wrap
  6. 导航到应用程序根目录。

    语法

    $ cd <path_to_application_root>/<application_root>
    Copy to Clipboard Toggle word wrap

    Example

    $ cd ~/applications/simple-tracing-example
    Copy to Clipboard Toggle word wrap

  7. 使用以下命令编译并部署应用程序:

    $ mvn clean package wildfly:deploy
    Copy to Clipboard Toggle word wrap
  8. 启动 Jaeger 控制台。

    $ docker run -d --name jaeger \
      -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
      -p 5775:5775/udp \
      -p 6831:6831/udp \
      -p 6832:6832/udp \
      -p 5778:5778 \
      -p 16686:16686 \
      -p 14268:14268 \
      -p 14250:14250 \
      -p 9411:9411 \
      jaegertracing/all-in-one:1.29
    Copy to Clipboard Toggle word wrap
  9. 在浏览器中,导航到 \localhost:8080/simple-tracing-example/hello/cdi-trace
  10. 在一个浏览器中,打开位于 http://localhost:16686/search 的 Jaeger 控制台。
  11. 在 Jaeger 控制台中,选择 JBoss EAP XP 并点 Find Traces
  12. 单击 3 Spans
  13. Jaeger 控制台显示以下 trace:

    |GET /hello/cdi-trace 
    1
    
    -
     | prepare-hello 
    2
    
      -
       | process-hello 
    3
    Copy to Clipboard Toggle word wrap
    1
    这是自动隐式追踪的范围。
    2
    自定义 span prepare-hello 表示方法 getHello () 被调用。它是自动隐式追踪的 span 子级。
    3
    自定义 span process-hello 表示值 hello 已分配给一个新的 String 对象 hello。它是 prepare-hello 范围的子项。

每当您访问 http://localhost:16686/search 的应用程序端点时,都会使用所有子范围创建一个新的 trace。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部