EC2 上の Kafka モニタリング
概要
CloudWatch エージェントの JMX プラグインを使用して、EC2 インスタンス上で実行されるセルフマネージドの Apache Kafka クラスターをモニタリングします。 このソリューションは、Prometheus インフラストラクチャを必要とせずに、ブローカーの健全性、パーティションメトリクス、コンシューマーラグ、およびプロデューサーのスループットをキャプチャします。
Apache Kafka は Java Management Extensions(JMX)MBean を通じて内部状態を公開します。CloudWatch エージェントはブローカーの JMX ポートにローカルで接続し、設定した MBean をスクレイプして、CloudWatch カスタムメトリクスとして公開します。これにより、別のメトリクスバックエンドをデプロイすることなく、アラーム、ダッシュボード、および異常検出の機能を利用できます。
収集すべき最も重要なメトリクスカテゴリは以下の通りです:
- ブローカーの健全性 —
UnderReplicatedPartitions(ゼロ以外はレプリカが遅延していることを意味します)、ActiveControllerCount(クラスター全体で正確に 1 である必要があります)、OfflinePartitionsCount(アクティブなリーダーがないパーティション、データが利用不可であることを意味します)、およびIsrShrinksPerSec/IsrExpandsPerSec(頻繁な ISR の変動はディスクまたはネットワークの負荷を示します)。 - プロデューサーのスループット —
kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSecとBytesInPerSecで取り込みレートを追跡します。TotalProduceRequestsPerSecとFailedProduceRequestsPerSecは、プロデューサーにカスケードする前にリクエストエラーを表面化します。 - コンシューマーの健全性 — コンシューマーグループラグは最も重要なコンシューマーメトリクスです。
kafka.consumer:type=consumer-fetch-manager-metricsMBean は、コンシューマーグループごとのrecords-lag-maxとrecords-consumed-rateを公開します。ラグの増加は、コンシューマーが生産レートに追いつけないことを意味し、通常はデータ損失シナリオに先行します。 - JVM — 各ブローカープロセスのヒープ使用量、GC 一時停止時間、およびスレッド数。持続的な高い GC 圧力は、リクエストレイテンシの増加と最終的なブローカーの無応答と相関します。
更新が必要
このエントリは、CloudWatch エージェントを使用して JMX 経由で Kafka ブローカーメトリクスを収集します。現在の推奨事項より前のものであり、以下をカバーしていません:
- 新しいデプロイメントでエージェントの JMX プラグインを置き換える、JMX レシーバーを含む OpenTelemetry コレクション
- セルフマネージド Kafka の代替としての CloudWatch マネージド Prometheus コレクター
- オブザーバビリティアクセラレーターアーティファクトからのダッシュボード
以下の手順は引き続き動作します。セルフマネージド Kafka ではなく Amazon MSK を実行している場 合は、代わりに最新の Amazon MSK モニタリングを使用してください。
前提条件
- EC2 上で実行されている Kafka クラスター(v2.8 以降)
- Kafka ブローカーで JMX が有効(ポート 9999)
- CloudWatch エージェント v1.300025 以降
CloudWatchAgentServerPolicyを持つ IAM ロール- ブローカーインスタンスに Java 11 以降
アーキテクチャ
┌────────────────────────────────────────────────────────┐
│ EC2 Instance (Kafka Broker) │
│ │
│ ┌──────────────────┐ ┌──────────────────────────┐│
│ │ Kafka Broker │ │ CloudWatch Agent ││
│ │ │◄────│ • JMX Plugin ││
│ │ JMX Port: 9999 │ │ • Log collection ││
│ │ │ │ ││
│ └──────────────────┘ └────────────┬─────────────┘│
└────────────────────────────────────────┼───────────────┘
│
┌──────────▼──────────┐
│ CloudWatch │
│ • Custom/Kafka NS │
│ • Log Groups │
│ • Dashboards │
└─────────────────────┘
デプロイ
ステップ 1:Kafka ブローカーで JMX を有効にする
Kafka 起動環境(/etc/kafka/kafka-env.sh)に追加します:
export KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9999 \
-Dcom.sun.management.jmxremote.local.only=true \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false"
ステップ 2:CloudWatch エージェントをインストールする
sudo yum install -y amazon-cloudwatch-agent
ステップ 3:JMX コレクションを設定する
/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json を作成します:
{
"metrics": {
"namespace": "Custom/Kafka",
"metrics_collected": {
"jmx": [
{
"endpoint": "localhost:9999",
"metrics": [
{
"object_name": "kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec",
"measurement": ["Count"]
},
{
"object_name": "kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions",
"measurement": ["Value"]
},
{
"object_name": "kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec",
"measurement": ["Count"]
},
{
"object_name": "kafka.server:type=BrokerTopicMetrics,name=BytesOutPerSec",
"measurement": ["Count"]
}
]
}
]
}
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/kafka/server.log",
"log_group_name": "/kafka/broker",
"log_stream_name": "{instance_id}"
}
]
}
}
}
}