从Kafka向执行器报告指标

时间:2018-12-10 13:42:16

标签: spring spring-boot apache-kafka kafka-consumer-api spring-kafka

我正在尝试从kafka获取一些指标(客户滞后等),以提供给普罗米修斯消费。

我的方法是编写一个简单的springboot应用程序,该应用程序公开普罗米修斯的指标。我了解kafka通过MetricsReporter接口向所有消费者提供了指标。

因此,我实现了一个应该完全做到这一点的类:

public class MonitoringIntegration implements MetricsReporter {

    @Override
    public void init(List<KafkaMetric> list) {
        System.out.println("init");
        for (KafkaMetric kafkaMetric : list) {
            System.out.println(kafkaMetric.metricName());
            System.out.println(kafkaMetric.metricValue());
        }
    }

    @Override
    public void metricChange(KafkaMetric kafkaMetric) {
        System.out.println("Metric Change");
        System.out.println(kafkaMetric.metricName());
        System.out.println(kafkaMetric.metricValue());
    }

    @Override
    public void metricRemoval(KafkaMetric kafkaMetric) {
        System.out.println("Removal");
        System.out.println(kafkaMetric.metricName());
        System.out.println(kafkaMetric.metricValue());
    }

    @Override
    public void close() {
        System.out.println("close");
    }

    @Override
    public void configure(Map<String, ?> map) {
        System.out.println("Configuring");
        System.out.println(map);
    }
}

我用一个bean注册了这个课程:

@Configuration
public class MetricConfiguration {

    @Bean
    public ProducerFactory<?, ?> kafkaProducerFactory(KafkaProperties properties) {
        Map<String, Object> producerProperties = properties.buildProducerProperties();
        producerProperties.put(CommonClientConfigs.METRIC_REPORTER_CLASSES_CONFIG,
                MonitoringIntegration.class.getName());
        return new DefaultKafkaProducerFactory<>(producerProperties);
    }

    @Bean
    public ConsumerFactory<?, ?> kafkaConsumerFactory(KafkaProperties properties) {
        Map<String, Object> consumererProperties = properties.buildConsumerProperties();
        consumererProperties.put(CommonClientConfigs.METRIC_REPORTER_CLASSES_CONFIG,
                MonitoringIntegration.class.getName());
        return new DefaultKafkaConsumerFactory<>(consumererProperties);
    }
}

当我启动应用程序时,一些度量标准将被打印到cmd,但是它们具有所有默认值(0.0,无限,..),并且仅在应用程序启动后提供一次。

为什么我没有得到指标?我做错了什么?

干杯

Fabian

2 个答案:

答案 0 :(得分:1)

Spring Kafka已经将Kafka指标公开为JMX指标。您不需要将指标更新/发送到Prometheus。 Prometheus服务器将自动从您的应用程序的“ / prometheus”端点读取。在您的Spring项目中启用带有Prometheus的Spring Actuator,并配置Prometheus服务器以从中读取信息。

这是使用Spring Boot的一个很好的例子-https://www.callicoder.com/spring-boot-actuator-metrics-monitoring-dashboard-prometheus-grafana/

MetricsReporter不能用于“报告”度量值更改。检查文档。 (由于某种原因,我找不到最新的API)。

https://archive.apache.org/dist/kafka/0.8.2-beta/java-doc/org/apache/kafka/common/metrics/MetricsReporter.html

  

一个插件界面,允许在创建新指标时进行监听,以便进行报告。

metricChange()方法将仅在更改度量标准时调用。这是您在应用程序启动期间看到前几个输出的原因,因为指标已创建。

答案 1 :(得分:0)

消费者指标支持仅在Spring Boot 2.1+版本上可用。

  

对新指标的自动配置支持   指标覆盖范围已得到改进,包括:

     

休眠指标

     

Spring Framework的WebClient

     

Kafka消费者指标

     

Log4j2指标

     

Jetty服务器线程池指标

     

服务器端Jersey HTTP请求指标

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.1-Release-Notes#auto-configuration-support-for-new-metrics

我建议您升级到较新的版本。但是,如果您确实需要使用Spring Boot以前的版本,则可以在以下位置检查我的kafka度量千分尺实现:

https://github.com/luiztoscano/spring-boot-kmetrics