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.
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.
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.
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