10.7. OpenTelemetry トレースアプリケーションの開発


JBoss EAP は Jakarta RESTful Web Services アプリケーションへの REST 呼び出しを自動的かつ暗黙的にトレースしますが、アプリケーションからカスタムスパンを作成して詳細なトレースを行うことができます。span は、トレース内の単一の操作です。アプリケーションで、たとえば、リソースが定義されているとき、メソッドが呼び出されているときなどに、スパンを作成できます。Tracer インスタンスを挿入することにより、アプリケーションでカスタムトレースを作成します。

10.7.1. OpenTelemetry トレース用の 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

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

  2. アプリケーションのルートディレクトリーに移動します。

    構文

    $ cd <name-of-your-application>

    $ cd simple-tracing-example

  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>
    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>
    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>

検証

  • アプリケーションのルートディレクトリーで、次のコマンドを入力します。

    $ mvn install

    次のような出力が得られます。

    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 1.440 s
    [INFO] Finished at: 2021-12-27T14:45:12+05:30
    [INFO] ------------------------------------------------------------------------

これで、OpenTelemetry トレースアプリケーションを作成できます。

10.7.2. カスタムスパンを作成するアプリケーションの作成

次の手順は、次のような 2 つのカスタムスパンを作成できるアプリケーションを作成する方法を示しています。

  • prepare-hello - アプリケーションのメソッド getHello() が呼び出されたとき。
  • process-hello - 値 hello が新しい String オブジェクト hello に割り当てられたとき。

この手順では、Jaeger コンソールでこれらのスパンを表示する方法も示します。プロシージャ内の <application_root> は、アプリケーションの Maven 設定を含む pom.xml ファイルを含むディレクトリーを示します。

前提条件

手順

  1. <application_root> で、Java ファイルを保存するディレクトリーを作成します。

    構文

    $ mkdir -p src/main/java/com/example/opentelemetry

    $ mkdir -p src/main/java/com/example/opentelemetry

  2. 新しいディレクトリーに移動します。

    構文

    $ cd src/main/java/com/example/opentelemetry

    $ cd src/main/java/com/example/opentelemetry

  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 {
    }
  4. クラス ExplicitlyTracedBean の次のコンテンツを含む ExplicitlyTracedBean.java ファイルを作成します。このクラスは、Tracer クラスを挿入することによってカスタムスパンを作成します。

    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;
        }
    }
    1
    Tracer クラスを挿入して、カスタムスパンを作成します。
    2
    getHello() メソッドが呼び出されたことを示すために、prepare-hello というスパンを作成します。
    3
    process-hello というスパンを作成して、値 hellohello という新しい String オブジェクトに割り当てられたことを示します。
  5. TracedResource クラスの次のコンテンツを含む TracedResource.java ファイルを作成します。このファイルは、ExplicitlyTracedBean クラスを挿入し、tracedcdi-trace の 2 つのエンドポイントを宣言します。

    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();
        }
    }
  6. アプリケーションのルートディレクトリーに移動します。

    構文

    $ cd <path_to_application_root>/<application_root>

    $ cd ~/applications/simple-tracing-example

  7. 次のコマンドを使用して、アプリケーションをコンパイルおよびデプロイします。

    $ mvn clean package wildfly:deploy
  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
  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 コンソールには、次のトレースが表示されます。

    |GET /hello/cdi-trace 
    1
    
    -
     | prepare-hello 
    2
    
      -
       | process-hello 
    3
    1
    これは、自動暗黙的トレースのスパンです。
    2
    カスタムスパン prepare-hello は、メソッド getHello() が呼び出されたことを示します。これは、自動暗黙的トレースのスパンの子です。
    3
    カスタムスパン process-hello は、値 hello が新しい String オブジェクト hello に割り当てられたことを示します。これは prepare-hello スパンの子です。

http://localhost:16686/search でアプリケーションエンドポイントにアクセスするたびに、すべての子スパンで新しいトレースが作成されます。

Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

Red Hat ドキュメントについて

Legal Notice

Theme

© 2026 Red Hat
トップに戻る