こんにちは!日々のシステムの監視やトラブルシューティング、本当にお疲れ様です。
マイクロサービスやイベント駆動型アーキテクチャの要として、Apache Kafkaなどの非同期メッセージング基盤を導入しているチームは多いはずです。しかし、ここで一つ、こんな悩みを抱えていませんか?
- 「なんだかAPIのレスポンスが遅い気がするが、Kafkaのどこで詰まっているのか分からない……」
- 「コンシューマLAG(遅延)はある程度見えているけど、メッセージが『いつ作られて、いつ処理されたのか』というエンドツーエンドの遅延がパッと出てこない……」
- 「障害が起きた時に、どのトピックの、どのパーティションがボトルネックになっているかを即座に特定したい……」
従来の監視ツールでは、プロデューサー側とコンシューマ側のメトリクスがバラバラに表示され、その間の「流れ(ストリーム)」を直感的に追うことができませんでした。
それを鮮やかに解決してくれるのが、今回紹介する Datadog Data Streams Monitoring(DSM) です。これをマスターすれば、Kafkaメッセージングの遅延やボトルネックの特定が驚くほど簡単になり、毎日のオンコール対応のストレスが劇的に軽くなりますよ。
今回は、初心者の方でも迷わず導入できるように、ツールの役割から基礎セットアップ、そして精度の高い「HelloWorld」的な動作確認まで、優しく丁寧に解説していきますね。
—
1. Datadog Data Streams Monitoring(DSM)とは何か?
まず、「DSMって従来のメトリクス監視やAPMと何が違うの?」という疑問にお答えしましょう。
一般的な監視では、Kafkaの「BrokerのCPU使用率」や「コンシューマLAG(未処理メッセージ数)」を見ています。これらは「今、どれくらい詰まっているか」の目安にはなりますが、「ユーザーのリクエストから、メッセージがKafkaを経由して最終的に処理されるまでに、何ミリ秒かかったのか(エンドツーエンド・レイテンシー)」までは測れません。
DSMは、プロデューサーがメッセージを送信する際、およびコンシューマがそれを読み込んで処理する際に、メッセージのヘッダーに軽量なメタデータ(コンテキスト)を自動的に埋め込みます。これにより、Datadog側で「メッセージの流通経路(Topology)」を自動構築し、以下の3つを完全に可視化します。
1. エンドツーエンドの遅延(Path Latency): メッセージが生成されてから処理されるまでの正確な時間
2. 正確なスループット(Throughput): トピックごとのリアルタイムな流通量
3. ボトルネックの特定: どのサービス、どのトピック、どのコンシューマグループでメッセージが滞留しているかのピンポイント特定
これらを一つのトポロジーマップとして視覚的に見せてくれるのが、DSMの真骨頂です。
—
2. 導入の全体像と前提条件
DSMを動かすためには、以下のコンポーネントが連携する必要があります。
- Datadog Agent: バージョン `7.34.0` 以降(推奨は最新版)
- Datadog Tracer(APM): Java, Go, Python, Node.jsなどの言語別トレーサー
- Kafka Client: アプリケーションで使用しているKafkaクライアントライブラリ
今回は、最も一般的な Java (Spring Boot / Kafka Client) を例に取って、最短でDSMの動作確認(HelloWorld)まで進んでみましょう。
—
3. ステップ・バイ・ステップ:基礎セットアップ
それでは、実際に手を動かして環境を整えていきましょう。
ステップ1: Datadog Agentの設定確認
まずは、Datadog AgentがAPMとDSMのデータを受け取れる状態になっているか確認します。`datadog.yaml` において、APM(Trace Receiver)とプロセスが有効になっていることを確認してください。
通常、コンテナ環境(KubernetesやDocker)であれば、環境変数を設定するだけでOKです。
例: Docker環境での環境変数設定
environment:
- DD_API_KEY=your_datadog_api_key
- DD_SITE=datadoghq.com
- DD_APM_ENABLED=true
- DD_DATA_STREAMS_ENABLED=true # ← DSMを有効にする最重要フラグ
ステップ2: アプリケーション(トレーサー)の設定
次に、メッセージをやり取りするアプリケーション側にDatadog Tracerを組み込みます。ここではJavaを例にします。
アプリケーション起動時に、JVM引数としてDatadogのJavaトレーサー(`dd-java-agent.jar`)をアタッチし、環境変数でDSMを有効にします。
java -javaagent:/path/to/dd-java-agent.jar \
-Ddd.service=my-kafka-app \
-Ddd.env=production \
-Ddd.data.streams.enabled=true \
-jar target/my-kafka-app.jar
たったこれだけで、トレーサーがKafkaの `Producer` および `Consumer` のメソッドをフックし、メッセージの送受信時に自動的にトレーシングコンテキスト(Data Streamsのパケット)をKafkaのメッセージヘッダーにインジェクト・抽出してくれます。特別なボイラープレートコードを書く必要は一切ありません。これが非常に楽なポイントです。
—
4. 精度高い「HelloWorld」で動作確認を行う
設定ができたら、実際にメッセージを流して、Datadog上にデータが綺麗に反映されるか確認してみましょう。
ここでは、非常にシンプルな「プロデューサー」と「コンシューマ」のコードを用意しました。
① プロデューサー側のコード(Java / Spring Kafkaの例)
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
@Service
public class HelloProducer {
private final KafkaTemplate
private static final String TOPIC_NAME = “hello.dsm.topic”;
public HelloProducer(KafkaTemplate
this.kafkaTemplate = kafkaTemplate;
}
public void sendMessage(String message) {
System.out.println(“Sending message to Kafka: ” + message);
// メッセージ送信。Datadogトレーサーが自動的にKafkaヘッダーにDSMコンテキストを付与します
kafkaTemplate.send(TOPIC_NAME, message);
}
}
② コンシューマ側のコード
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
@Component
public class HelloConsumer {
@KafkaListener(topics = “hello.dsm.topic”, groupId = “hello-dsm-group”)
public void consume(String message) {
// コンシューマ側でも自動的にヘッダーからコンテキストが抽出され、DSMにスパンが送信されます
System.out.println(“Consumed message: ” + message);
// 意図的に少し処理時間を模倣する(遅延のテスト)
try {
Thread.sleep(50);
} catch (InterruptedException e) {
Thread.currentThread().formatted(e);
}
}
}
③ 動作確認の手順
1. 上記のアプリケーションを起動し、適当なエンドポイント等から `HelloProducer.sendMessage(“Hello, Datadog DSM!”)` を呼び出します。
2. メッセージが送信され、コンシューマによって正常に処理されることをログで確認します。
3. DatadogのUI画面へ移動します。
—
5. Datadog UIでの確認とボトルネック特定の実践
Datadogにログインしたら、左メニューの [APM] -> [Data Streams] (または Service Catalog や Dashboards周辺)を開いてみてください。
そこには、あなたを感動させる光景が広がっています。
- サービス・トポロジーマップ: `my-kafka-app` (Producer) ──> `hello.dsm.topic` ──> `my-kafka-app` (Consumer: `hello-dsm-group`) という美しいパイプラインの図が自動描画されています。
- エンドツーエンド・レイテンシー: メッセージが生成されてからコンシューマで処理が完了するまでの正確なミリ秒数がグラフ化されています。
- コンシューマLAGの連動: 「ラグが溜まっている瞬間」と「エンドツーエンドの遅延が悪化している瞬間」がタイムライン上で完全に一致して見えるため、原因究明のスピードが桁違いに上がります。
万が一、データが表示されないときは?
もし「画面に何も出てこないな?」という場合は、以下のチェックリストを疑ってみてください。
1. Datadog Agentのバージョンは古くないか?(7.34+必須)
2. 環境変数は正しく設定されているか? (`DD_DATA_STREAMS_ENABLED=true` がプロセスの起動時に読み込まれているか確認)
3. APMのトレース自体はDatadogに届いているか?(まず通常のAPM画面でサービス名が見えていることが大前提です)
—
まとめ:毎日の監視業務を「推測」から「確信」へ
今回は、Datadog Data Streams Monitoring(DSM)の基本的な役割から、導入のためのセットアップ、そしてHelloWorldを通じた動作確認までを解説しました。
非同期メッセージングの最大の敵は「ブラックボックス化」です。「どこかでメッセージが詰まっているらしい」という曖昧な推測や、ログを一つずつgrepしてタイムスタンプを突き合わせる苦行から、もう解放されましょう。
DSMを導入すれば、「どのトピックの、どのパスで、何ミリ秒の遅延が発生しているか」がひと目でクリアになります。これをマスターすれば、障害対応のスピードが劇的に上がり、チーム全体の心理的安全性も大きく向上するはずです。
ぜひ、あなたの開発・検証環境でまずは小さく試してみてください。その圧倒的な視認性に、きっと思わずニヤリとしてしまうはずですよ!