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

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

最終更新日:Dec 30, 2024

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 の使用に関するベストプラクティスを提供しています。詳細については、準備 を参照してください。

背景情報

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 エージェントを使用せずにデータをレポートする方法を示しています。

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

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

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

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

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

    <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 エラーが返された場合は、無効なエンドポイントを指定しています。エンドポイントを有効なものに変更します。