Spring boot 2.3.4 - метрики Kafka не отображаются в / actator / prometheus

У меня есть приложение для весенней загрузки (версия 2.3.4), и я использую @KafkaListener для использования записей. Я также использую актуатор и микрометр (версия 1.5.5) для метрик.

Проблема в том, что я не вижу метрики Kafka в / actator / prometheus. Я использую следующие зависимости:

'org.springframework.boot' version '2.3.4.RELEASE'
implementation group: 'org.springframework.kafka', name: 'spring-kafka', version: '2.5.10.RELEASE'
implementation group: 'org.apache.kafka', name: 'kafka-clients', version: '2.5.1'

И добавил эти свойства в application.yaml:

management:
  server:
    port: 9091
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      probes:
        enabled: true

spring:
  jmx:
    enabled: true

Пытаюсь понять, должен ли я добавить что-нибудь еще, чтобы сделать метрики kafka видимыми в / actator / prometheus

Обратите внимание, что метрики видны, когда я использую KafkaTemplate по умолчанию, но при попытке создать собственный KafkaTemplate метрики исчезают:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public ProducerFactory<String, String> customProducerFactory() {
        Map<String, Object> configProps = new HashMap<>();
        configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092");
        configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, Serdes.String().serializer().getClass().getName());
        configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, Serdes.String().serializer().getClass().getName());
        return new DefaultKafkaProducerFactory<>(configProps);
    }

    @Bean
    public KafkaTemplate<String, String> customProducer() {
        return new KafkaTemplate<>(customProducerFactory());
    }

    @KafkaListener(id = "test", topics = "test_topic")
    public void listen(String in) {
        System.out.println(in);
    }

    @Bean
    public NewTopic topic() {
        return TopicBuilder.name("test_topic").partitions(1).replicas(1).build();
    }


    @Bean
    public ApplicationRunner runner(KafkaTemplate<String, String> template) {
        return args -> {
            template.send("test_topic", "foo");
        };
    }
}

person Ashley Shuler    schedule 19.01.2021    source источник


Ответы (2)


Решением было добавить слушателя к настраиваемому шаблону kafkaTemplate:

@Bean
    public ProducerFactory<String, String> customProducerFactory() {
        Map<String, Object> configProps = new HashMap<>();
        configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092");
        configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, Serdes.String().serializer().getClass().getName());
        configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, Serdes.String().serializer().getClass().getName());
        DefaultKafkaProducerFactory<String, String> producerFactory = new DefaultKafkaProducerFactory<>(configProps);
        producerFactory.addListener(new MicrometerProducerListener<>(meterRegistry));
    }

@Bean
public KafkaTemplate<String, String> customProducer() {
    return new KafkaTemplate<>(customProducerFactory());
}
person Ashley Shuler    schedule 20.01.2021

Я просто попробовал с Boot 2.4.2 (spring-kafka 2.6.5) без проблем:

@SpringBootApplication
public class So65791799Application {

    public static void main(String[] args) {
        SpringApplication.run(So65791799Application.class, args);
    }


    @KafkaListener(id = "so65791799", topics = "so65791799")
    public void listen(String in) {
        System.out.println(in);
    }

    @Bean
    public NewTopic topic() {
        return TopicBuilder.name("so65791799").partitions(1).replicas(1).build();
    }


    @Bean
    public ApplicationRunner runner(KafkaTemplate<String, String> template) {
        return args -> {
            template.send("so65791799", "foo");
        };
    }

}
server:
  port: 9091
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      probes:
        enabled: true

spring:
  jmx:
    enabled: true

  kafka:
    consumer:
      auto-offset-reset: earliest

http: // локальный: 9091 / исполнительный механизм / прометей

...
# HELP kafka_consumer_fetch_manager_records_per_request_avg The average number of records in each request
# TYPE kafka_consumer_fetch_manager_records_per_request_avg gauge
kafka_consumer_fetch_manager_records_per_request_avg{client_id="consumer-so65791799-1",kafka_version="2.6.0",spring_id="kafkaConsumerFactory.consumer-so65791799-1",} 0.5
...

Я сбросил его обратно в Boot 2.3.5, и он все еще работает у меня.

person Gary Russell    schedule 19.01.2021
comment
Грей, спасибо за ответ. Это работает и для меня при использовании шаблона KafkaTemplate по умолчанию (как в вашем примере), но при попытке создать собственный шаблон метрики исчезают. Я отредактировал свой вопрос, включив в него код приложения. - person Ashley Shuler; 20.01.2021