ヘッダー付きのメッセージをKafka org.Apache.kafka.clients.producer.ProducerRecordを使用して送信しています
public ProducerRecord(String topic, Integer partition, K key, V value, Iterable<Header> headers) {
this(topic, partition, (Long)null, key, value, headers);
}
コマンドを使用してこれらのヘッダーを実際に表示するにはどうすればよいですか。 kafka-console-consumer.shは、ペイロードのみを表示し、ヘッダーは表示しません。
優れた kafkacat ツールを使用できます。
コマンド例:
kafkacat -b kafka-broker:9092 -t my_topic_name -C \
-f '\nKey (%K bytes): %k
Value (%S bytes): %s
Timestamp: %T
Partition: %p
Offset: %o
Headers: %h\n'
出力例:
Key (-1 bytes):
Value (13 bytes): {foo:"bar 5"}
Timestamp: 1548350164096
Partition: 0
Offset: 34
Headers: __connect.errors.topic=test_topic_json,__connect.errors.partition=0,__connect.errors.offset=94,__connect.errors.connector.name=file_sink_03,__connect.errors.task.id=0,__connect.errors.stage=VALU
E_CONVERTER,__connect.errors.class.name=org.Apache.kafka.connect.json.JsonConverter,__connect.errors.exception.class.name=org.Apache.kafka.connect.errors.DataException,__connect.errors.exception.message=Co
nverting byte[] to Kafka Connect data failed due to serialization error: ,__connect.errors.exception.stacktrace=org.Apache.kafka.connect.errors.DataException: Converting byte[] to Kafka Connect data failed
due to serialization error:
Kafkacatヘッダーオプションは、kafkacat
の最近のビルドでのみ使用できます。現在のバージョンに含まれていない場合は、マスターブランチから build を自分で作成することもできます。
Dockerからkafkacatを実行することもできます。
docker run --rm edenhill/kafkacat:1.5.0 \
-b kafka-broker:9092 \
-t my_topic_name -C \
-f '\nKey (%K bytes): %k
Value (%S bytes): %s
Timestamp: %T
Partition: %p
Offset: %o
Headers: %h\n'
Dockerを使用する場合は、Kafkaブローカーに到達する方法のネットワークへの影響に注意してください。
kafka-console-consumer.sh
スクリプトから:
exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleConsumer "$@"
src: https://github.com/Apache/kafka/blob/2.1.1/bin/kafka-console-consumer.sh
kafka.tools.ConsoleConsumer
では、ヘッダーはフォーマッターに提供されますが、既存のフォーマッターはそれを利用しません。
formatter.writeTo(new ConsumerRecord(msg.topic, msg.partition, msg.offset, msg.timestamp,
msg.timestampType, 0, 0, 0, msg.key, msg.value, msg.headers),
output)
src: https://github.com/Apache/kafka/blob/2.1.1/core/src/main/scala/kafka/tools/ConsoleConsumer.scala
上記のリンクの下部に、既存のフォーマッターがあります。
ヘッダーを印刷する場合は、独自のkafka.common.MessageFormatter
、特にその書き込みメソッドを実装する必要があります。
def writeTo(consumerRecord: ConsumerRecord[Array[Byte], Array[Byte]], output: PrintStream): Unit
次に、独自のフォーマッターを提供する--formatterを使用してコンソールコンシューマーを実行します(クラスパスにも存在する必要があります)。
もう1つのより簡単で高速な方法は、KafkaConsumerを使用して独自のミニプログラムを実装し、デバッグでヘッダーを確認することです。
kafkactl を使用することもできます。例えば。 yamlとして出力:
kafkactl consume my-topic --print-headers -o yaml
出力例:
partition: 1
offset: 22
headers:
key1: value1
key2: value2
value: my-value
免責事項:私はこのプロジェクトに貢献しています