この記事はInstana Observability Advent Calendar 2023 20日目のエントリになります。
はじめに
Kafkaのような分散ストリーミング基盤は、コンポーネント間が疎結合になるため、システムに柔軟性をもたらしてくれます。
一方で、様々なコンポーネント間をリクエストが流れていくので、エラーや障害が発生した場合にどのコンポーネントで問題が起こっているのかを把握するのは難しいのではないでしょうか?
本記事では IBM Instana Observability(以下Instana)を使用し、IBM EventStreams(≒Kafka)を使用したシステムのモニタリングをしてみようと思います。
IBM Event Streams(以下Event Streams)はIBMが提供しているKafkaのディストリービューションです。
注意点
本記事では環境構築手順などは説明しておりません。
Instanaのインストール手順や、EventStreamsのインストール手順などをお探しの方は、以下のような公式ドキュメントを参照ください。
- Instana
- Event Streams
システム構成
今回は以下の構成のシステムをInstanaを使用してモニタリングします。
コンポーネント
本システムは以下のコンポーネントで構成されてます。
-
Event Streamsクラスター
- dev-scram-origin
- dev-scram-target
Event Streamsクラスターは2つ存在していて、
dev-scram-origin
からdev-scram-target
に対して、Mirror Makerを構成し、トピックの同期を行っています。 -
アプリケーション
-
Producerアプリ
- nest-kafka-app
Producerアプリは、dev-scram-origin
のトピックに対してメッセージの送信を行います。
- nest-kafka-app
-
Consumerアプリ
- target-nest-kafka-app
Consumerアプリは、dev-scram-target
のトピックからメッセージの受信を行います。
受信するトピックは、dev-scram-origin
からMirror Makerで複製されたトピックです。
- target-nest-kafka-app
-
検証
それでは上記のシステムに対して、実際にリクエストを行い、その結果をInstana上でみてみましょう。
リクエストの送信
- ProducerアプリにCURLでリクエストを送信
ここではdev-scram-origin
のsample-topic-1
に対してメッセージを送信しています。
送信しているメッセージは、キーがexternal-message
、バリューがmessage send from external listener.0011
のメッセージです。
(Producerアプリケーションのドメインはマスクしてます。)
- ConsumerアプリにCURLでリクエストを送信
ここではdev-scram-target
のdev-scram-origin.sample-topic-1
トピックからデータの読み出しを行っています。
dev-scram-origin.sample-topic-1
トピックはdev-scram-origin
のsample-topic-1
トピックがMirror Makerにより複製されたトピックです。
先ほどdev-scram-origin
のsample-topic-1
に対して送信したメッセージが読み出せていることが確認できます。
Instana上で確認する
- アプリケーション・パースペクティブの確認
今回は上記のシステムを1つのアプリケーションパースペクティブで表示するように構成してます。
呼び出し
のセクションを見ると先ほど実行したリクエストが記録されていることが確認できます。
- 依存関係の確認
依存関係のタブから、コンポーネント間の依存関係を確認することができます。
このグラフからコンポーネント間がシステム構成図と同じ構成で繋がっていることがわかります。
-
呼び出しの分析
からリクエストの詳細を確認
上記から先ほど送ったリクエストが分散トレースの形で確認できることがわかります。
また詳細を確認したいリクエストをクリックすると、「詳細」からリクエストの詳細情報を確認することができます。
補足
今回はリクエスト中にエラーは発生していませんが、エラーが発生した際には「依存関係」「呼び出しの分析」画面でそれぞれ以下のようにエラー確認することができます。
- 依存関係の画面
エラーが発生しているコンポーネントに赤く印がつきます。
エラーが発生しているコンポーネントをクリックして、ドリルダウンしていくことでより詳しい原因の調査をすることができます。
- 呼び出しの分析の画面
エラーが発生しているリクエストに赤く印がつきます。
またエラーが発生しているリクエストをクリックすると、リクエストの詳細を確認することができます。
余談
今回ProducerアプリケーションとConsumerアプリケーションは、KafkaJS + NestJSで実装しました。
Node.jsでProducer/Consumerアプリケーションを実装して、Instanaでモニタリングしたい場合には、KafkaJSを使用するようにしてください。
kafka-nodeだとInstanaのモニタリング機能の一部がうまく動かない可能性があります。
詳しくは以下を参照ください。
When you use the npm package kafka-node to send or consume messages. That package does not support Kafka record headers. For more information, see kafka-node#763 and kafka-node#1309. Trace continuity is supported for Kafka in general starting with Kafka version 0.11 for other runtime and also when you use the package kafkajs. Therefore, it is recommended to use kafkajs instead of kafka-node when you use Kafka and Instana in your Node.js application.
参考ドキュメント
- IBM Event Streamsの公式ドキュメント
- Instana Monitoring Kakfa