web-dev-qa-db-ja.com

表示方法kafkaヘッダー

ヘッダー付きのメッセージを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は、ペイロードのみを表示し、ヘッダーは表示しません。

10
Sammy Pawar

優れた 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ブローカーに到達する方法のネットワークへの影響に注意してください。

19
Robin Moffatt

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を使用して独自のミニプログラムを実装し、デバッグでヘッダーを確認することです。

3
tgrez

kafkactl を使用することもできます。例えば。 yamlとして出力:

kafkactl consume my-topic --print-headers -o yaml

出力例:

partition: 1
offset: 22
headers:
  key1: value1
  key2: value2
value: my-value

免責事項:私はこのプロジェクトに貢献しています

0
Dirk