21.3. 分散トレースの設定
カスタムリソースでトレースタイプを指定して、Kafka コンポーネントで分散トレースを有効にします。メッセージをエンドツーエンドで追跡するために Kafka クライアントにトレーサーをインストルメント化します。
分散トレースを設定するには、次の手順を順番に実行します。
- MirrorMaker、Kafka Connect、Kafka Bridge のトレースを設定します。
クライアントのトレースを設定します。
トレーサーでクライアントをインストルメント化します。
21.3.1. 前提条件 リンクのコピーリンクがクリップボードにコピーされました!
分散トレースを設定する前に、Jaeger バックエンドコンポーネントが OpenShift クラスターにデプロイされていることを確認してください。OpenShift クラスターに Jaeger をデプロイするには、Jaeger Operator を使用することを推奨します。
デプロイメント手順は、Jaeger のドキュメント を参照してください。
AMQ Streams 以外のアプリケーションおよびシステムにトレースを設定する方法については、このコンテンツの対象外となります。
21.3.2. MirrorMaker、Kafka Connect、および Kafka Bridge リソースでのトレーシングの有効化 リンクのコピーリンクがクリップボードにコピーされました!
分散トレースは、MirrorMaker、MirrorMaker 2、Kafka Connect、および AMQ Streams Kafka Bridge でサポートされています。コンポーネントのカスタムリソースを設定して、トレーサーサービスを指定して有効にします。
リソースでトレースを有効にすると、次のイベントがトリガーされます。
- インターセプタークラスは、コンポーネントの統合コンシューマーとプロデューサーで更新されます。
- MirrorMaker、MirrorMaker 2、および Kafka Connect の場合、トレースエージェントは、リソースで定義されたトレース設定に基づいてトレーサーを初期化します。
- Kafka Bridge の場合、リソースで定義されたトレース設定に基づくトレーサーは、Kafka Bridge 自体によって初期化されます。
OpenTelemetry または OpenTracing を使用するトレースを有効にできます。
MirrorMaker および MirrorMaker 2 でのトレース
MirrorMaker および MirrorMaker 2 の場合、メッセージはソースクラスターからターゲットクラスターまでトレースされます。トレースデータは、MirrorMaker または MirrorMaker 2 コンポーネントに出入りするメッセージを記録します。
Kafka Connect でのトレーシング
Kafka Connect の場合、Kafka Connect によって生成および消費されたメッセージのみがトレースされます。Kafka Connect と外部システム間で送信されるメッセージをトレースするには、これらのシステムのコネクターでトレースを設定する必要があります。
Kafka Bridge でのトレーシング
Kafka Bridge の場合、Kafka Bridge によって生成および消費されるメッセージがトレースされます。Kafka Bridge を介してメッセージを送受信するクライアントアプリケーションから受信する HTTP リクエストもトレーシングされます。エンドツーエンドのトレーシングを設定するために、HTTP クライアントでトレーシングを設定する必要があります。
手順
以下の手順を、KafkaMirrorMaker、KafkaMirrorMaker2、KafkaConnect、および KafkaBridge リソースごとに実行します。
spec.templateプロパティーで、トレーサーサービスを設定します。- トレーシング環境変数 をテンプレートの設定プロパティーとして使用します。
-
OpenTelemetry の場合、
spec.tracing.typeプロパティーをopentelemetryに設定します。 -
OpenTracing の場合、
spec.tracing.typeプロパティーをjaegerに設定します。
OpenTelemetry を使用した Kafka Connect のトレース設定の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OpenTelemetry を使用した MirrorMaker のトレース設定の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OpenTelemetry を使用した MirrorMaker 2 のトレース設定の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OpenTelemetry を使用した Kafka Bridge のトレース設定の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OpenTracing を使用した Kafka Connect のトレース設定の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OpenTracing を使用した MirrorMaker のトレース設定の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OpenTracing を使用した MirrorMaker 2 のトレース設定の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OpenTracing を使用した Kafka Bridge のトレース設定の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow リソースを作成または更新します。
oc apply -f <resource_configuration_file>
oc apply -f <resource_configuration_file>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
21.3.3. Kafka クライアントのトレースの初期化 リンクのコピーリンクがクリップボードにコピーされました!
トレーサーを初期化し、分散トレース用にクライアントアプリケーションをインストルメント化します。Kafka プロデューサークライアントとコンシューマークライアント、および Kafka Streams API アプリケーションをインストルメント化できます。OpenTracing または OpenTelemetry のトレーサーを初期化できます。
一連の トレース環境変数 を使用して、トレーサーを設定および初期化します。
手順
各クライアントアプリケーションで、トレーサーの依存関係を追加します。
クライアントアプリケーションの
pom.xmlファイルに Maven 依存関係を追加します。OpenTelemetry の依存関係
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OpenTracing の依存関係
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - トレース環境変数 を使用して、トレーサーの設定を定義します。
環境変数で初期化されるトレーサーを作成します。
OpenTelemetry のトレーサーの作成
OpenTelemetry ot = GlobalOpenTelemetry.get();
OpenTelemetry ot = GlobalOpenTelemetry.get();Copy to Clipboard Copied! Toggle word wrap Toggle overflow OpenTracing のトレーサーの作成
Tracer tracer = Configuration.fromEnv().getTracer();
Tracer tracer = Configuration.fromEnv().getTracer();Copy to Clipboard Copied! Toggle word wrap Toggle overflow トレーサーをグローバルトレーサーとして登録します。
GlobalTracer.register(tracer);
GlobalTracer.register(tracer);Copy to Clipboard Copied! Toggle word wrap Toggle overflow クライアントをインストルメント化します。
21.3.4. Kafka プロデューサーおよびコンシューマーをトレース用にインストルメント化 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションコードを計測して、Kafka プロデューサーとコンシューマーでのトレースを有効にします。デコレーターパターンまたはインターセプターを使用して、Java プロデューサーおよびコンシューマーアプリケーションコードをトレース用にインストルメント化します。続いて、メッセージが生成されたとき、またはトピックから取得されたときにトレースを記録できます。
OpenTelemetry および OpenTracing インストルメント化プロジェクトは、プロデューサーとコンシューマーのインストルメント化をサポートするクラスを提供します。
- デコレーターのインストルメント化
- デコレーターのインストルメント化では、トレース用に変更したプロデューサーまたはコンシューマーインスタンスを作成します。OpenTelemetry と OpenTracing では、デコレーターのインストルメント化が異なります。
- インターセプターのインストルメント化
- インターセプターのインストルメント化の場合、トレース機能をコンシューマーまたはプロデューサーの設定に追加します。インターセプターのインストルメント化は、OpenTelemetry と OpenTracing で同じです。
前提条件
クライアントのトレースを初期化 している。
トレース JAR を依存関係としてプロジェクトに追加して、プロデューサーアプリケーションとコンシューマーアプリケーションでインストルメント化を有効にしている。
手順
各プロデューサーおよびコンシューマーアプリケーションのアプリケーションコードで、これらの手順を実行します。デコレーターパターンまたはインターセプターのいずれかを使用して、クライアントアプリケーションコードをインストルメント化します。
デコレーターパターンを使用するには、変更したプロデューサーまたはコンシューマーインスタンスを作成して、メッセージを送受信します。
元の
KafkaProducerまたはKafkaConsumerクラスを渡します。OpenTelemetry のデコレーターインストルメント化の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OpenTracing のデコレーターインストルメント化の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow インターセプターを使用するには、プロデューサーまたはコンシューマーの設定でインターセプタークラスを設定します。
通常の方法で
KafkaProducerクラスとKafkaConsumerクラスを使用します。TracingProducerInterceptorおよびTracingConsumerInterceptorインターセプタークラスは、トレース機能を処理します。インターセプターを使用したプロデューサー設定の例
senderProps.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingProducerInterceptor.class.getName()); KafkaProducer<Integer, String> producer = new KafkaProducer<>(senderProps); producer.send(...);senderProps.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingProducerInterceptor.class.getName()); KafkaProducer<Integer, String> producer = new KafkaProducer<>(senderProps); producer.send(...);Copy to Clipboard Copied! Toggle word wrap Toggle overflow インターセプターを使用したコンシューマー設定の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
21.3.5. Kafka Streams アプリケーションのトレース用のインストルメント化 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションコードを計測して、Kafka Streams API アプリケーションでのトレースを有効にします。デコレーターパターンまたはインターセプターを使用して、トレース用に Kafka Streams API アプリケーションをインストルメント化します。続いて、メッセージが生成されたとき、またはトピックから取得されたときにトレースを記録できます。
- デコレーターのインストルメント化
-
デコレーターのインストルメント化は、トレース用に変更した Kafka Streams インスタンスを作成します。OpenTracing インストルメント化プロジェクトは、Kafka Streams のインストルメント化をサポートする
TracingKafkaClientSupplierクラスを提供します。TracingKafkaClientSupplierサプライヤーインターフェイスのインスタンスをラップして作成し、Kafka Streams のトレースインストルメント化を行います。OpenTelemetry の場合、プロセスは同じですが、サポートを提供するためにカスタムTracingKafkaClientSupplierクラスを作成する必要があります。 - インターセプターのインストルメント化
- インターセプターインストルメント化の場合は、トレース機能を Kafka Streams プロデューサーおよびコンシューマー設定に追加します。
前提条件
クライアントのトレースを初期化 している。
トレース JAR を依存関係としてプロジェクトに追加して、Kafka Streams アプリケーションでインストルメント化を有効にしている。
-
OpenTelemetry で Kafka Streams をインストルメント化するために、カスタムの
TracingKafkaClientSupplierを記述している。 カスタム
TracingKafkaClientSupplierが Kafka のDefaultKafkaClientSupplierを拡張し、プロデューサーとコンシューマーの作成メソッドを上書きして、インスタンスを Telemetry 関連のコードでラップできるようにしている。カスタム
TracingKafkaClientSupplierの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow
手順
Kafka Streams API アプリケーションごとにこの手順を実行します。
デコレーターパターンを使用するには、
TracingKafkaClientSupplierサプライヤーインターフェイスのインスタンスを作成し、そのサプライヤーインターフェイスをKafkaStreamsに提供します。デコレーターのインストルメント化の例
KafkaClientSupplier supplier = new TracingKafkaClientSupplier(tracer); KafkaStreams streams = new KafkaStreams(builder.build(), new StreamsConfig(config), supplier); streams.start();
KafkaClientSupplier supplier = new TracingKafkaClientSupplier(tracer); KafkaStreams streams = new KafkaStreams(builder.build(), new StreamsConfig(config), supplier); streams.start();Copy to Clipboard Copied! Toggle word wrap Toggle overflow インターセプターを使用するには、Kafka Streams プロデューサーおよびコンシューマー設定でインターセプタークラスを設定します。
TracingProducerInterceptorおよびTracingConsumerInterceptorインターセプタークラスは、トレース機能を処理します。インターセプターを使用したプロデューサーとコンシューマーの設定例
props.put(StreamsConfig.PRODUCER_PREFIX + ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingProducerInterceptor.class.getName()); props.put(StreamsConfig.CONSUMER_PREFIX + ConsumerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingConsumerInterceptor.class.getName());
props.put(StreamsConfig.PRODUCER_PREFIX + ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingProducerInterceptor.class.getName()); props.put(StreamsConfig.CONSUMER_PREFIX + ConsumerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingConsumerInterceptor.class.getName());Copy to Clipboard Copied! Toggle word wrap Toggle overflow
21.3.6. 別の OpenTelemetry トレースシステムの導入 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトの OTLP システムの代わりに、OpenTelemetry でサポートされている他のトレースシステムを指定できます。これを行うには、AMQ Streams で提供される Kafka イメージに必要なアーティファクトを追加します。必要な実装固有の環境変数も設定する必要があります。次に、OTEL_TRACES_EXPORTER 環境変数を使用して、新しいトレースの実装を有効にします。
この手順では、Zipkin トレースを実装する方法を示します。
手順
トレースアーティファクトを AMQ Streams Kafka イメージの
/opt/kafka/libs/ディレクトリーに追加します。新しいカスタムイメージを作成するための基本イメージとして、Red Hat Ecosystem Catalog の Kafka コンテナーイメージを使用できます。
Zipkin の OpenTelemetry アーティファクト
io.opentelemetry:opentelemetry-exporter-zipkin
io.opentelemetry:opentelemetry-exporter-zipkinCopy to Clipboard Copied! Toggle word wrap Toggle overflow 新しいトレース実装のトレースエクスポーターとエンドポイントを設定します。
Zikpin トレーサーの設定例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
21.3.7. カスタムスパン名 リンクのコピーリンクがクリップボードにコピーされました!
トレース スパン は Jaeger の論理作業単位で、操作名、開始時間、および期間が含まれます。スパンには組み込みの名前がありますが、使用する Kafka クライアントインストルメント化で、カスタムスパン名を指定できます。
カスタムスパン名の指定はオプションであり、プロデューサーおよびコンシューマークライアントインストルメント化 または Kafka Streams インストルメント化 でデコレーターパターンを使用する場合にのみ適用されます。
21.3.7.1. OpenTelemetry のスパン名の指定 リンクのコピーリンクがクリップボードにコピーされました!
OpenTelemetry でカスタムスパン名を直接指定できません。代わりに、コードをクライアントアプリケーションに追加してスパン名を取得し、追加のタグと属性を抽出します。
属性を抽出するコード例
21.3.7.2. OpenTracing のスパン名の指定 リンクのコピーリンクがクリップボードにコピーされました!
OpenTracing のカスタムスパン名を指定するには、プロデューサーとコンシューマーをインストルメント化するときに BiFunction オブジェクトを追加の引数として渡します。
組み込みの名前とカスタムスパン名を指定して、デコレーターパターンでクライアントアプリケーションコードをインストルメント化する方法の詳細は、OpenTracing Apache Kafka client instrumentation を参照してください。