web-dev-qa-db-fra.com

comment afficher les en-têtes kafka

Nous envoyons un message avec des en-têtes à Kafka using 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);
}

Comment puis-je réellement voir ces en-têtes à l'aide de la commande. kafka-console-consumer.sh ne me montre que la charge utile et aucun en-tête.

10
Sammy Pawar

Vous pouvez utiliser l'excellent outil kafkacat .

Exemple de commande:

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'

Exemple de sortie:

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:

L'option d'en-tête kafkacat n'est disponible que dans les versions récentes de kafkacat; vous voudrez peut-être build de la branche master vous-même si votre version actuelle ne l'inclut pas.


Vous pouvez également exécuter kafkacat à partir de Docker:

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'

Si vous utilisez Docker, gardez à l'esprit les implications réseau de la façon d'atteindre le courtier Kafka.

19
Robin Moffatt

De kafka-console-consumer.sh script:

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

Dans kafka.tools.ConsoleConsumer l'en-tête est fourni au Formateur, mais aucun des Formateurs existants ne l'utilise:

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

Au bas du lien ci-dessus, vous pouvez voir les formats existants.

Si vous souhaitez imprimer des en-têtes, vous devez implémenter votre propre kafka.common.MessageFormatter et en particulier sa méthode d'écriture:

def writeTo(consumerRecord: ConsumerRecord[Array[Byte], Array[Byte]], output: PrintStream): Unit

puis exécutez votre console consommateur avec --formatter fournissant votre propre formateur (il doit également être présent sur le chemin de classe).

Un autre moyen, plus simple et plus rapide, serait d'implémenter votre propre mini-programme en utilisant KafkaConsumer et de vérifier les en-têtes dans le débogage.

3
tgrez

Vous pouvez également utiliser kafkactl pour cela. Par exemple. avec sortie en yaml:

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

Exemple de sortie:

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

Avertissement: je contribue à ce projet

0
Dirk