{"id":17042325,"url":"https://github.com/stepio/spring-actuator-kafka","last_synced_at":"2025-04-12T14:42:41.746Z","repository":{"id":72378880,"uuid":"62220793","full_name":"stepio/spring-actuator-kafka","owner":"stepio","description":"POC for gathering Kafka metrics into Spring Boot Actuator","archived":false,"fork":false,"pushed_at":"2020-03-21T20:39:36.000Z","size":125,"stargazers_count":10,"open_issues_count":1,"forks_count":7,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-26T09:21:15.135Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stepio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-06-29T11:31:28.000Z","updated_at":"2021-05-30T23:38:21.000Z","dependencies_parsed_at":null,"dependency_job_id":"28974b13-d77b-4ad4-90a1-ceae1e990ecc","html_url":"https://github.com/stepio/spring-actuator-kafka","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stepio%2Fspring-actuator-kafka","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stepio%2Fspring-actuator-kafka/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stepio%2Fspring-actuator-kafka/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stepio%2Fspring-actuator-kafka/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stepio","download_url":"https://codeload.github.com/stepio/spring-actuator-kafka/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248583378,"owners_count":21128577,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-14T09:16:16.624Z","updated_at":"2025-04-12T14:42:41.714Z","avatar_url":"https://github.com/stepio.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# spring-actuator-kafka\n\n[![Build Status](https://travis-ci.org/stepio/spring-actuator-kafka.svg?branch=master)](https://travis-ci.org/stepio/spring-actuator-kafka)\n[![Sonarcloud Status](https://sonarcloud.io/api/project_badges/measure?project=stepio_spring-actuator-kafka\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=stepio_spring-actuator-kafka)\n[![Codacy Badge](https://api.codacy.com/project/badge/Grade/100dd036555647f689505fee873af770)](https://app.codacy.com/app/stepio/spring-actuator-kafka?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=stepio/spring-actuator-kafka\u0026utm_campaign=Badge_Grade_Dashboard)\n[![DepShield Badge](https://depshield.sonatype.org/badges/stepio/spring-actuator-kafka/depshield.svg)](https://depshield.github.io)\n[![Apache 2.0 License](https://img.shields.io/badge/license-Apache%202-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0.txt)\n\n**Update:** Project is outdated and not supported, use [Micrometer](https://github.com/micrometer-metrics) for exporting metrics (including Kafka metrics).\n\nThis tiny project provides reference implementation for `MetricsReporter` interface, backed with Spring Actuator's `GaugeService`.\n\nTested with [spring-projects/spring-kafka](https://github.com/spring-projects/spring-kafka). Example for consumer creation:\n```java\n    private Class\u003cS\u003e deserializerClass;\n    private String kafkaBroker;\n    private String kafkaGroup;\n    private Integer kafkaConcurrency;\n    // Spring Actuator's GaugeService should be initialized before passing it to Kafka\n    // Use @Autowired, for example\n    private GaugeService gaugeService;\n\n    public ConcurrentKafkaListenerContainerFactory\u003cString, T\u003e listenerContainerFactory() {\n        ConcurrentKafkaListenerContainerFactory\u003cString, T\u003e factory = new ConcurrentKafkaListenerContainerFactory\u003c\u003e();\n        factory.setConsumerFactory(new DefaultKafkaConsumerFactory\u003c\u003e(consumerConfigs()));\n        factory.setConcurrency(kafkaConcurrency);\n        return factory;\n    }\n\n    private Map\u003cString, Object\u003e consumerConfigs() {\n        Map\u003cString, Object\u003e props = new HashMap\u003c\u003e();\n        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaBroker);\n        props.put(ConsumerConfig.GROUP_ID_CONFIG, kafkaGroup);\n        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);\n        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, deserializerClass);\n        // implemented a \"helper\" method which sets the required properties:\n        KafkaConfigUtils.configureKafkaMetrics(props, gaugeService);\n        // alternalive option: public static void configureKafkaMetrics(Map\u003cString, Object\u003e configs, GaugeService gaugeService, String prefix, ScheduledExecutorService executorService, Long updateInterval)\n        return props;\n    }\n```\n\nSimilar approach is relevant for producer creation:\n```java\n    private String kafkaBroker;\n    // Spring Actuator's GaugeService should be initialized before passing it to Kafka\n    // Use @Autowired, for example\n    private GaugeService gaugeService;\n\n    public KafkaTemplate\u003cString, T\u003e kafkaTemplate() {\n        new KafkaTemplate\u003c\u003e(new DefaultKafkaProducerFactory\u003c\u003e(createProducerConfigs()));\n    }\n\n    public Map\u003cString, Object\u003e createProducerConfigs() {\n        Map\u003cString, Object\u003e props = new HashMap\u003c\u003e();\n        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, broker);\n        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);\n        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);\n        // implemented a \"helper\" method which sets the required properties:\n        KafkaConfigUtils.configureKafkaMetrics(props, gaugeService);\n        // alternalive option: public static void configureKafkaMetrics(Map\u003cString, Object\u003e configs, GaugeService gaugeService, String prefix, ScheduledExecutorService executorService, Long updateInterval)\n        return props;\n    }\n```\n\nAs the result, your `/metrics` endoints gets lots of additional data, e.g.:\n```properties\ngauge.kafka.consumer-14.node-2.consumer-node-metrics.request-size-avg: 91,\ngauge.kafka.consumer-7.consumer-fetch-manager-metrics.fetch-throttle-time-avg: 0,\ngauge.kafka.consumer-15.consumer-metrics.request-size-avg: 95.13245033112582,\ngauge.kafka.consumer-1.node-2.consumer-node-metrics.outgoing-byte-rate: 168.6803914951063,\ngauge.kafka.consumer-11.consumer-metrics.io-ratio: 0.0002161823165518282,\ngauge.kafka.consumer-14.consumer-fetch-manager-metrics.fetch-size-avg: 0,\ngauge.kafka.consumer-11.node-2147483645.consumer-node-metrics.request-latency-max: \"-Infinity\",\ngauge.kafka.consumer-16.node-2147483645.consumer-node-metrics.response-rate: 0.5638636920813925,\ngauge.kafka.consumer-14.consumer-coordinator-metrics.commit-rate: 0.22379500377654069,\ngauge.kafka.consumer-14.node-3.consumer-node-metrics.request-size-avg: 0,\ngauge.kafka.consumer-8.consumer-coordinator-metrics.sync-time-max: 0,\ngauge.kafka.consumer-11.consumer-fetch-manager-metrics.fetch-latency-avg: 500.9,\ngauge.kafka.consumer-11.node-1.consumer-node-metrics.outgoing-byte-rate: 174.0321740153642,\ngauge.kafka.consumer-9.consumer-fetch-manager-metrics.fetch-throttle-time-avg: 0,\ngauge.kafka.consumer-14.node--2.consumer-node-metrics.request-size-max: \"-Infinity\",\ngauge.kafka.consumer-15.consumer-coordinator-metrics.join-time-avg: 0,\ngauge.kafka.consumer-4.node-2.consumer-node-metrics.request-latency-max: \"-Infinity\",\ngauge.kafka.consumer-1.consumer-metrics.request-rate: 4.555501189491977,\ngauge.kafka.consumer-2.node--2.consumer-node-metrics.request-size-avg: 0,\n\n```\n\nThis implementation is just a POC - appreciate your feedback/recommendations. As a side effect, I do not intend to publish it to maven central as of now, so to get the jar you may do the following:\n\n1.  Clone the project locally and navigate to its folder via console/terminal.\n2.  Make sure that java 8 is installed and `JAVA_HOME` is set properly.\n3.  Execute `./mvnw clean install`\n4.  Enrich your project's pom.xml with next block:\n\n```xml\n    \u003cdependency\u003e\n        \u003cgroupId\u003eorg.stepio.kafka\u003c/groupId\u003e\n        \u003cartifactId\u003espring-actuator-kafka\u003c/artifactId\u003e\n        \u003cversion\u003e0.0.1-SNAPSHOT\u003c/version\u003e\n    \u003c/dependency\u003e\n```\n\nRelated issues:\n-   [spring-kafka/issues/127](https://github.com/spring-projects/spring-kafka/issues/127)\n-   [spring-boot/issues/6227](https://github.com/spring-projects/spring-boot/issues/6227)\n-   [KAFKA-3923](https://issues.apache.org/jira/browse/KAFKA-3923)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstepio%2Fspring-actuator-kafka","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstepio%2Fspring-actuator-kafka","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstepio%2Fspring-actuator-kafka/lists"}