All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.icthh.xm.commons.metric.KafkaHealthIndicator Maven / Gradle / Ivy

package com.icthh.xm.commons.metric;

import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.StopWatch;
import org.apache.kafka.clients.admin.AdminClient;
import org.apache.kafka.clients.admin.DescribeTopicsOptions;
import org.apache.kafka.clients.admin.DescribeTopicsResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.actuate.health.AbstractHealthIndicator;
import org.springframework.boot.actuate.health.Health.Builder;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.kafka.core.KafkaAdmin;
import org.springframework.stereotype.Component;

import static java.util.Objects.nonNull;

@Slf4j
@Component
@ConditionalOnProperty(value = "application.kafkaHealth.enabled", matchIfMissing = false)
public class KafkaHealthIndicator extends AbstractHealthIndicator {

    private final KafkaAdmin kafkaAdmin;
    private final Integer connectionTimeout;
    private final String systemTopic;

    public KafkaHealthIndicator(KafkaAdmin kafkaAdmin,
                                @Value("${application.kafkaHealth.connectionTimeout:1000}")
                                Integer connectionTimeout,
                                @Value("${application.kafka-system-queue:'system_queue'}")
                                String systemTopic) {
        this.kafkaAdmin = kafkaAdmin;
        this.connectionTimeout = connectionTimeout;
        this.systemTopic = systemTopic;
    }

    @Override
    protected void doHealthCheck(Builder builder) {
        StopWatch executionTime = StopWatch.createStarted();
        DescribeTopicsOptions describeTopicsOptions = new DescribeTopicsOptions().timeoutMs(connectionTimeout);

        try (AdminClient adminClient = AdminClient.create(kafkaAdmin.getConfigurationProperties())) {
            DescribeTopicsResult describeTopicsResult = adminClient.describeTopics(List.of(systemTopic), describeTopicsOptions);
            var topicDescriptionMap = describeTopicsResult.all().get();
            boolean monitoringResult = nonNull(topicDescriptionMap);
            if (monitoringResult) {
                log.debug("Connection to kafka is {}, time: {}", monitoringResult, executionTime.getTime());
                builder.up();
            } else {
                log.error("Connection to kafka is {}, time: {}", monitoringResult, executionTime.getTime());
                builder.down();
            }
        } catch (Exception e) {
            log.error("Exception when try connect to kafka topic: {}, exception: {}, time: {}", systemTopic, e, executionTime.getTime());
            builder.down(e);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy