すべてのプロダクト
Search
ドキュメントセンター

Managed Service for OpenTelemetry:Java アプリケーションデータのレポートに Jaeger を使用する

最終更新日:Mar 04, 2025

Jaeger を使用して Java アプリケーションをインストルメント化し、トレースデータを Managed Service for OpenTelemetry にレポートすると、Managed Service for OpenTelemetry は Java アプリケーションの監視を開始します。アプリケーショントポロジー、トレース、異常トランザクション、低速トランザクション、SQL 分析など、アプリケーションの監視データを表示できます。このトピックでは、Java アプリケーションを手動でインストルメント化する方法と、Spring Cloud または gRPC を使用して Java アプリケーションを自動的にインストルメント化する方法について説明します。

重要

OpenTelemetry Protocol(OTLP)を使用して、アプリケーションを Managed Service for OpenTelemetry に接続することをお勧めします。この場合、より多くの機能、より高度なトレース機能、および最高のユーザーエクスペリエンスが提供されます。

Alibaba Cloud は、OpenTelemetry とアプリケーションを統合する方法、および Managed Service for OpenTelemetry をすぐに使い始めるのに役立つ OpenTelemetry の使用方法のベストプラクティスに関する詳細な手順を提供しています。詳細については、「Managed Service for OpenTelemetry を使用する準備」をご参照ください。

前提条件

エンドポイントを取得する

新しいコンソール

  1. Managed Service for OpenTelemetry コンソール にログオンします。左側のナビゲーションペインで、[統合センター] をクリックします。

  2. [統合センター] ページで、[オープンソースフレームワーク] セクションの [jaeger] カードをクリックします。

  3. [jaeger] パネルで、[統合の開始] タブをクリックし、データのレポート先のリージョンを選択します。

    説明

    初めてアクセスしたリージョンでリソースが自動的に初期化されます。

  4. [接続タイプ] パラメーターと [エクスポートプロトコル] パラメーターを設定し、エンドポイントをコピーします。

    • [接続タイプ]:サービスが Alibaba Cloud にデプロイされており、選択したリージョンにある場合は、このパラメーターを [alibaba Cloud VPC ネットワーク] に設定することをお勧めします。それ以外の場合は、このパラメーターを [パブリックネットワーク] に設定します。

    • [エクスポートプロトコル]:クライアントでサポートされているプロトコルに基づいて、このパラメーターを [grpc] に設定します。

    68

古いコンソール

  1. Managed Service for OpenTelemetry コンソール にログオンします。

  2. 左側のナビゲーションペインで、[クラスター構成] をクリックします。表示されるページで、[アクセスポイント情報] タブをクリックします。

  3. 上部のナビゲーションバーで、データのレポート先のリージョンを選択します。[クラスター情報] セクションで、[トークンの表示] をオンにします。

  4. [クライアント] パラメーターを [jaeger] に設定します。

    表の [関連情報] 列で、エンドポイントをコピーします。jager中国.jpg

    説明

    アプリケーションが Alibaba Cloud 本番環境にデプロイされている場合は、VPC エンドポイントを使用します。それ以外の場合は、パブリックエンドポイントを使用します。

背景情報

Jaeger は、オープンソースの分散トレースシステムです。OpenTracing API と互換性があり、Cloud Native Computing Foundation(CNCF) に加盟しています。Jaeger は、さまざまな異種システムからリアルタイムの監視データを収集します。OpenTracing コミュニティは、次の Java フレームワークをサポートする多くのコンポーネントを提供しています。

Jaeger を使用して Java アプリケーションデータを Managed Service for OpenTelemetry コンソールにレポートするには、最初にアプリケーションをインストルメント化する必要があります。アプリケーションは、手動で、または既存のコンポーネントを使用してインストルメント化できます。このトピックでは、アプリケーションをインストルメント化するために使用できる 3 つの方法について説明します。

  • Java アプリケーションを手動でインストルメント化する。

  • Spring Cloud を使用して Java アプリケーションをインストルメント化する。

  • gRPC を使用して Java アプリケーションをインストルメント化する。

データはどのようにレポートされますか?

  • 次の図は、Jaeger エージェントを使用せずにデータをレポートする方法を示しています。

    image
  • 次の図は、Jaeger エージェントを使用してデータをレポートする方法を示しています。

    image

Java アプリケーションをインストルメント化する

Jaeger を使用して Java アプリケーションのデータを Managed Service for OpenTelemetry に送信するには、最初にアプリケーションをインストルメント化する必要があります。この例では、アプリケーションは手動でインストルメント化されます。

  1. デモプロジェクト をダウンロードします。manualDemo ディレクトリに移動し、README.md ファイルの指示に従ってプログラムを実行します。

  2. pom.xml ファイルに Jaeger クライアントの次の依存関係を追加します。

    <dependency>
        <groupId>io.jaegertracing</groupId>
        <artifactId>jaeger-client</artifactId>
        <version>0.31.0</version>
    </dependency>
  3. 初期化パラメーターを設定し、トレーサーを作成します。

    トレーサーを使用して、分散操作時間を記録するスパンを作成したり、Extract または Inject メソッドを使用してサーバー間でパススルーモードでデータを送信したり、現在のスパンを指定したりできます。トレーサーには、データレポートに使用されるエンドポイント、ローカル IP アドレス、サンプリングレート、サービス名などのデータも含まれています。サンプリングレートを調整して、データレポートによるオーバーヘッドを削減できます。

    説明

    <endpoint> は、このトピックの「前提条件」セクションで取得したエンドポイントに置き換えてください。

    // manualDemo をアプリケーション名に置き換えます。
    io.jaegertracing.Configuration config = new io.jaegertracing.Configuration("manualDemo");
    io.jaegertracing.Configuration.SenderConfiguration sender = new io.jaegertracing.Configuration.SenderConfiguration();
    // <endpoint> は、このトピックの「前提条件」セクションで取得したエンドポイントに置き換えます。
    sender.withEndpoint("<endpoint>");
    config.withSampler(new io.jaegertracing.Configuration.SamplerConfiguration().withType("const").withParam(1));
    config.withReporter(new io.jaegertracing.Configuration.ReporterConfiguration().withSender(sender).withMaxQueueSize(10000));
    // アプリケーションのバージョンやデプロイ環境など、リソースタグを設定します。
    Map<String, String> map = new HashMap<>();
    map.put("service.version", "1.0.0");
    map.put("deployment.environment", "test");
    config.withTracerTags(map);
    GlobalTracer.register(config.getTracer());
  4. リクエストデータを記録します。

    Tracer tracer = GlobalTracer.get();
    // スパンを作成します。
    Span span = tracer.buildSpan("parentSpan").withTag("myTag", "spanFirst").start();
    tracer.scopeManager().activate(span, false);
    tracer.activeSpan().setTag("methodName", "testTracing");
    // ビジネスロジック。
    secondBiz();
    span.finish();
  5. オプション。 前述のコードを実行してルートスパンを作成し、リクエストのルート操作を記録できます。リクエストの前後の操作を記録する場合は、コンテキスト情報を指定します。

    Tracer tracer = GlobalTracer.get();
    Span parentspan = tracer.activeSpan();
    Tracer.SpanBuilder spanBuilder = tracer.buildSpan("childSpan").withTag("myTag", "spanSecond");
    if (parentspan !=null) {
        spanBuilder.asChildOf(parentspan).start();
    }
    Span childSpan = spanBuilder.start();
    Scope scope = tracer.scopeManager().activate(childSpan); // リクエストの開始時に 1 回実行されます。
    // ビジネスロジック。 buildSpan 関数は複数回実行できます。
    childSpan.finish();
    tracer.activeSpan().setTag("methodName", "testCall");
    
    // リクエストの終了時に 1 回実行されます。
    scope.close();
  6. オプション。 問題を効率的にトラブルシューティングするために、カスタムタグをスパンに追加できます。たとえば、エラーが発生したかどうかを確認したり、リクエストの戻り値を記録したりするために、カスタムタグを追加できます。

    tracer.activeSpan().setTag("methodName", "testCall");
  7. 分散システムでは、リモートプロシージャコール(RPC)リクエストはトレースデータとともに送信されます。トレースデータには、TraceId、ParentSpanId、SpanId、および Sampled パラメーターの値が含まれています。Extract または Inject メソッドを呼び出して、HTTP リクエストヘッダーでトレースデータをパススルーできます。次の図は、プロセス全体を示しています。

    1.jpg

    1. クライアントで Inject メソッドを呼び出して、コンテキスト情報を指定します。

      private void attachTraceInfo(Tracer tracer, Span span, final Request request) {
              tracer.inject(span.context(), Format.Builtin.TEXT_MAP, new TextMap() {
                  @Override
                  public void put(String key, String value) {
                      request.setHeader(key, value);
                  }
                  @Override
                  public Iterator<Map.Entry<String, String>> iterator() {
                      throw new UnsupportedOperationException("TextMapInjectAdapter should only be used with Tracer.inject()");
                  }
              });
          }
    2. サーバーで Extract メソッドを呼び出して、コンテキスト情報を抽出します。

      protected Span extractTraceInfo(Request request, Tracer tracer) {
          Tracer.SpanBuilder spanBuilder = tracer.buildSpan("/api/xtrace/test03");
          try {
              SpanContext spanContext = tracer.extract(Format.Builtin.TEXT_MAP, new TextMapExtractAdapter(request.getAttachments()));
              if (spanContext !=null) {
                  spanBuilder.asChildOf(spanContext);
              }
          } catch (Exception e) {
              spanBuilder.withTag("Error", "extract from request fail, error msg:" + e.getMessage());
          }
          return spanBuilder.start();
      }
                                      

Spring Cloud を使用して Java アプリケーションをインストルメント化する

Jaeger を使用して Java アプリケーションデータを Managed Service for OpenTelemetry コンソールにレポートするには、最初にアプリケーションをインストルメント化する必要があります。この例では、Spring Cloud を使用してアプリケーションをインストルメント化する方法を示します。Spring Cloud を使用して、次のアプリケーションをインストルメント化できます。

  • @Async、@Scheduled、Executors

  • Feign、HystrixFeign

  • Hystrix

  • JDBC

  • JMS

  • Mongo

  • RabbitMQ

  • Redis

  • RxJava

  • Spring Messaging:メッセージチャネルを使用してトレースメッセージが送信されます。

  • Spring Web(RestControllers、RestTemplates、WebAsyncTask)

  • 標準ロギング:ログが現在のスパンに追加されます。

  • WebSocket STOMP

  • Zuul

Spring Cloud を使用してアプリケーションをインストルメント化するには、次の手順を実行します。

説明

デモプロジェクト をダウンロードします。springMvcDemo/webmvc4-boot ディレクトリに移動し、README.md ファイルの指示に従ってプログラムを実行します。

  1. pom.xml ファイルを開き、JAR 依存関係を追加します。

    <dependency>
       <groupId>io.opentracing.contrib</groupId>
      <artifactId>opentracing-spring-cloud-starter</artifactId>
      <version>0.5.8</version>
    </dependency>
    <dependency>
      <groupId>io.jaegertracing</groupId>
      <artifactId>jaeger-client</artifactId>
      <version>1.4.0</version>
    </dependency>
  2. OpenTracing Tracer Bean を追加します。

    説明

    <endpoint> は、このトピックの「前提条件」セクションで取得したエンドポイントに置き換えてください。

    @Bean
    public io.opentracing.Tracer tracer() {
        io.jaegertracing.Configuration config = new io.jaegertracing.Configuration("springFrontend");
        io.jaegertracing.Configuration.SenderConfiguration sender = new io.jaegertracing.Configuration.SenderConfiguration();
        sender.withEndpoint("<endpoint>");
        config.withSampler(new io.jaegertracing.Configuration.SamplerConfiguration().withType("const").withParam(1));
        config.withReporter(new io.jaegertracing.Configuration.ReporterConfiguration().withSender(sender).withMaxQueueSize(10000));
        return config.getTracer();
    }

gRPC を使用して Java アプリケーションをインストルメント化する

Jaeger を使用して Java アプリケーションデータを Managed Service for OpenTelemetry コンソールにレポートするには、最初にアプリケーションをインストルメント化する必要があります。この例では、gRPC を使用してアプリケーションをインストルメント化する方法を示します。

次の手順を実行して、gRPC を使用してアプリケーションをインストルメント化します。

説明

デモプロジェクト をダウンロードします。grpcDemo ディレクトリに移動し、README.md ファイルの指示に従ってプログラムを実行します。

  1. pom.xml ファイルを開き、JAR 依存関係を追加します。

    <dependency>
        <groupId>io.opentracing.contrib</groupId>
        <artifactId>opentracing-grpc</artifactId>
        <version>0.2.3</version>
    </dependency>
  2. サーバーで Tracer オブジェクトを初期化し、ServerTracingInterceptor クラスを作成してから、インターセプターをサーバーに追加します。

    import io.opentracing.Tracer;
    
        public class YourServer {
    
            private int port;
            private Server server;
            private final Tracer tracer;
    
            private void start() throws IOException {
                ServerTracingInterceptor tracingInterceptor = new ServerTracingInterceptor(this.tracer);
    
                // GlobalTracer が使用されている場合:
                // ServerTracingInterceptor tracingInterceptor = new ServerTracingInterceptor();
    
                server = ServerBuilder.forPort(port)
                    .addService(tracingInterceptor.intercept(someServiceDef))
                    .build()
                    .start();
            }
        }
  3. クライアントで Tracer オブジェクトを初期化し、ClientTracingInterceptor クラスを作成してから、インターセプターをクライアントに追加します。

    import io.opentracing.Tracer;
    
        public class YourClient {
    
            private final ManagedChannel channel;
            private final GreeterGrpc.GreeterBlockingStub blockingStub;
            private final Tracer tracer;
    
            public YourClient(String host, int port) {
    
                channel = ManagedChannelBuilder.forAddress(host, port)
                    .usePlaintext(true)
                    .build();
    
                ClientTracingInterceptor tracingInterceptor = new ClientTracingInterceptor(this.tracer);
    
                // GlobalTracer が使用されている場合:
                // ClientTracingInterceptor tracingInterceptor = new ClientTracingInterceptor();
    
                blockingStub = GreeterGrpc.newBlockingStub(tracingInterceptor.intercept(channel));
            }
        }
                            

FAQ

Q:デモプログラムを実行した後、コンソールにデータがレポートされない場合はどうすればよいですか?

A:io.jaegertracing.thrift.internal.senders.HttpSender.send(Process process, List<Span> spans) メソッドをデバッグし、データレポートの戻り値を確認します。HTTP 403 エラーが返された場合は、無効なエンドポイントを指定しています。エンドポイントを有効なものに変更します。