認可が取り消された¶
Confluent Cloud CLI を使用して、プロデューサーに付与されている、トピックへの書き込みの認可を取り消します。
このシナリオでは、Metrics API からの Confluent Cloud メトリクス、およびクライアントアプリケーションの MBean オブジェクト kafka.producer:type=producer-metrics,client-id=producer-1
からのクライアントメトリクスを確認します。
障害のシナリオの導入¶
サービスアカウントにトピックへの書き込みを許可していた ACL を削除します。
184498
の部分には実際のサービスアカウント ID を挿入します。ccloud kafka acl delete --service-account 184498 --operation write --topic '*' --allow
問題の診断¶
Web ブラウザーで Grafana ダッシュボード(http://localhost:3000)に移動し、ユーザー名
admin
およびパスワードpassword
を使用してログインします。Producer Client Metrics
ダッシュボードに移動します。2 分待ってから、以下の点を観察します。- 最上部のパネルの
Record error rate
(record-error-rate
)が赤色になっています。これは、何か問題があることをわかりやすく示しています。 Outgoing byte rate
(outgoing-byte-rate
)などのスループットは、プロデューサーからブローカーに正常にメッセージが送信されていることを示しています。これは技術的に正しい状態です。プロデューサーはレコードのバッチをクラスターに送信していますが、認可が不足しているため、ブローカーのログには書き込まれていません。
- 最上部のパネルの
Confluent Cloud クラスターの状態、具体的には、リクエストを受け付けていることを確認します。
Confluent Cloud
ダッシュボードに移動します。Confluent Cloud
ダッシュボードで、上部のパネルを確認します。すべて緑色で表示されています。これは、クラスターがリソースの範囲内で問題なく動作していることを意味します。demo-topic-1
のみが表示されるようにトピックフィルターを変更します。以下を確認します。Topic received bytes
(io.confluent.kafka.server/received_bytes
)は高いままです。これは、Confluent Cloud は、認可エラーで拒否されるまでは、依然としてレコードを受信し、ネットワーク帯域幅を使用しているためです。Topic retained bytes
(io.confluent.kafka.server/retained_bytes
)は上がっていません。プロデューサーから送信されたレコードはログに書き込まれていないためです。Topic sent bytes
(io.confluent.kafka.server/sent_bytes
)は、コンシューマーに送信されたレコードを示し、この値はゼロに下がっています。新しいレコードが送信されていないためです。
どこに問題があるのかについて詳しくは、プロデューサーのログを確認します。プロデューサーのログを取得するには、次の Docker コマンドを使用します。
docker-compose logs producer
以下のようなログメッセージが表示されることを確認します。
org.apache.kafka.common.errors.TopicAuthorizationException: Not authorized to access topics: [demo-topic-1]
ログにより、何が起きているかが明確にわかることを確認してください(
org.apache.kafka.common.errors.TopicAuthorizationException
)。これは想定どおりです。ここで使用した障害のシナリオでは、サービスアカウントがトピックに書き込むことを許可する ACL を削除したためです。Callback()
を使用してこの例外をキャッチするソースコードを確認します(ccloud-observability/src)。producer.send(new ProducerRecord<String, PageviewRecord>(topic, key, record), new Callback() { @Override public void onCompletion(RecordMetadata m, Exception e) { if (e != null) { e.printStackTrace(); } else { System.out.printf("Produced record to topic %s%n", topic); } } });
障害のシナリオの解決¶
トピックへの書き込みを許可する ACL を追加します。
184498
の部分には実際のサービスアカウント ID を挿入します。ccloud kafka acl create --service-account 184498 --operation write --topic '*' --allow
producer
コンテナでorg.apache.kafka.common.errors.TopicAuthorizationException
のログメッセージが出力されなくなったことを確認します。docker-compose logs producer