Java 春季卡夫卡消费者-打印卡夫卡滞后信息
我已经创建了一个spring kafka消费者,它可以阅读某个主题。有没有一种方法可以像打印分区信息一样打印延迟信息?有一个命令行工具Java 春季卡夫卡消费者-打印卡夫卡滞后信息,java,kafka-consumer-api,spring-kafka,Java,Kafka Consumer Api,Spring Kafka,我已经创建了一个spring kafka消费者,它可以阅读某个主题。有没有一种方法可以像打印分区信息一样打印延迟信息?有一个命令行工具 $ kafka-consumer-groups --bootstrap-server localhost:9092 --describe --group myGroup TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID
$ kafka-consumer-groups --bootstrap-server localhost:9092 --describe --group myGroup
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
myTopic 0 66 66 0 -
编辑
您可以运行命令行工具并捕获输出
Process process = new ProcessBuilder()
.command("/usr/local/bin/kafka-consumer-groups", "--bootstrap-server", "localhost:9092",
"--describe", "--group", "siTestGroup")
.start();
InputStream inputStream = process.getInputStream();
process.waitFor(10, TimeUnit.SECONDS);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
FileCopyUtils.copy(inputStream, baos);
System.out.println(new String(baos.toByteArray()));
有一个命令行工具
$ kafka-consumer-groups --bootstrap-server localhost:9092 --describe --group myGroup
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
myTopic 0 66 66 0 -
编辑
您可以运行命令行工具并捕获输出
Process process = new ProcessBuilder()
.command("/usr/local/bin/kafka-consumer-groups", "--bootstrap-server", "localhost:9092",
"--describe", "--group", "siTestGroup")
.start();
InputStream inputStream = process.getInputStream();
process.waitFor(10, TimeUnit.SECONDS);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
FileCopyUtils.copy(inputStream, baos);
System.out.println(new String(baos.toByteArray()));
虽然没有提供源代码,但我假设您通过@KafkaListener注释实现了您的消费者。 如前所述,我已经克服了您描述的使用org.apache.kafka.clients.consumer.consumer接口的相同问题。它可以在@KafkaListener注释下的使用者方法中声明为参数。 此接口提供了metrics()方法,该方法包含存储在records max lag属性中的消费者滞后信息
private static final Logger LOGGER = LoggerFactory.getLogger(YourClass.class);
@KafkaListener(topics = "your-topic", groupId = "your-group-id", id = "your-client-id", containerFactory = "kafkaListenerContainerFactory")
public void listenerExample(List<String> msgs, @Header(KafkaHeaders.OFFSET) List<Long> offsets, Acknowledgment ack,
Consumer<?, ?> consumer) {
String lag = consumer.metrics().values().stream().filter(m -> "records-lag-max".equals(m.metricName().name()))
.map(Metric::metricValue).map(Object::toString).distinct()
.collect(Collectors.joining("", "[Kafka current consumer lag]", " records"));
LOGGER.info(lag);
}
虽然没有提供源代码,但我假设您通过@KafkaListener注释实现了您的消费者。 如前所述,我已经克服了您描述的使用org.apache.kafka.clients.consumer.consumer接口的相同问题。它可以在@KafkaListener注释下的使用者方法中声明为参数。 此接口提供了metrics()方法,该方法包含存储在records max lag属性中的消费者滞后信息
private static final Logger LOGGER = LoggerFactory.getLogger(YourClass.class);
@KafkaListener(topics = "your-topic", groupId = "your-group-id", id = "your-client-id", containerFactory = "kafkaListenerContainerFactory")
public void listenerExample(List<String> msgs, @Header(KafkaHeaders.OFFSET) List<Long> offsets, Acknowledgment ack,
Consumer<?, ?> consumer) {
String lag = consumer.metrics().values().stream().filter(m -> "records-lag-max".equals(m.metricName().name()))
.map(Metric::metricValue).map(Object::toString).distinct()
.collect(Collectors.joining("", "[Kafka current consumer lag]", " records"));
LOGGER.info(lag);
}
谢谢你,加里。有没有一种方法可以用SpringKafka编程实现呢。我想把延迟作为日志消息的一部分打印出来;与Scala版本不同,Java版本的
AdminClient
没有describeConsumerGroup()
方法。您必须将scala jar添加到类路径中,并编写一个scala类来完成当前在ConsumerGroupCommand.kafkanconSumerGroupService
中的大部分工作。谢谢您的帮助,Gary。有没有办法添加此功能请求?您必须打开一个窗口,要求他们在javaAdminClient
上实现此方法。如果你只是想记录信息,我已经在我的问题中添加了一个编辑,作为绕过限制的一种方法。谢谢Gary。有没有一种方法可以用SpringKafka编程实现呢。我想把延迟作为日志消息的一部分打印出来;与Scala版本不同,Java版本的AdminClient
没有describeConsumerGroup()
方法。您必须将scala jar添加到类路径中,并编写一个scala类来完成当前在ConsumerGroupCommand.kafkanconSumerGroupService
中的大部分工作。谢谢您的帮助,Gary。有没有办法添加此功能请求?您必须打开一个窗口,要求他们在javaAdminClient
上实现此方法。如果你只是想记录信息,我已经添加了一个编辑我的问题的一种方法来绕过限制。