How to check whether Kafka Server is running?
Asked Answered
W

10

75

I want to ensure whether kafka server is running or not before starting production and consumption jobs. It is in windows environment and here's my kafka server's code in eclipse...

Properties properties = new Properties();
properties.setProperty("broker.id", "1");
properties.setProperty("port", "9092");
properties.setProperty("log.dirs", "D://workspace//");
properties.setProperty("zookeeper.connect", "localhost:2181"); 

Option<String> option = Option.empty();
KafkaConfig config = new KafkaConfig(properties);       
KafkaServer kafka = new KafkaServer(config, new CurrentTime(), option);
kafka.startup();

In this case if (kafka != null) is not enough because it is always true. So is there any way to know that my kafka server is running and ready for producer. It is necessary for me to check this because it causes loss of some starting data packets.

Weatherproof answered 20/6, 2016 at 11:5 Comment(0)
S
54

All Kafka brokers must be assigned a broker.id. On startup a broker will create an ephemeral node in Zookeeper with a path of /broker/ids/$id. As the node is ephemeral it will be removed as soon as the broker disconnects, e.g. by shutting down.

You can view the list of the ephemeral broker nodes like so:

echo dump | nc localhost 2181 | grep brokers

The ZooKeeper client interface exposes a number of commands; dump lists all the sessions and ephemeral nodes for the cluster.

Note, the above assumes:

  • You're running ZooKeeper on the default port (2181) on localhost, and that localhost is the leader for the cluster
  • Your zookeeper.connect Kafka config doesn't specify a chroot env for your Kafka cluster i.e. it's just host:port and not host:port/path
Subcritical answered 20/3, 2017 at 15:31 Comment(2)
So, this actually checks to see if zookeeper has at least one kafka connected. It doesn't test that your kafka is running. It will be correct in the OP's situation, but it is an indirect test. May have to research what can be done on port 9092 for a direct test.Jakob
Thanks for sharing the tip. Would you share the source? I want to read more.Becket
V
26

You can install Kafkacat tool on your machine

For example on Ubuntu You can install it using

apt-get install kafkacat

once kafkacat is installed then you can use following command to connect it

kafkacat -b <your-ip-address>:<kafka-port> -t test-topic
  • Replace <your-ip-address> with your machine ip
  • <kafka-port> can be replaced by the port on which kafka is running. Normally it is 9092

once you run the above command and if kafkacat is able to make the connection then it means that kafka is up and running

Vorticella answered 19/8, 2020 at 15:32 Comment(2)
kafkacat -b localhost:9092 -L // as per docs.confluent.io/platform/current/app-development/…, -L displays the current state of the Kafka cluster and its topics, partitions, replicas ...Illuviation
For anyone on a mac: - brew install kafkacat #usage kcat -b <broker> -t <topic> -p <partition>Anodize
T
21

I used the AdminClient api.

Properties properties = new Properties();
properties.put("bootstrap.servers", "localhost:9092");
properties.put("connections.max.idle.ms", 10000);
properties.put("request.timeout.ms", 5000);
try (AdminClient client = KafkaAdminClient.create(properties))
{
    ListTopicsResult topics = client.listTopics();
    Set<String> names = topics.names().get();
    if (names.isEmpty())
    {
        // case: if no topic found.
    }
    return true;
}
catch (InterruptedException | ExecutionException e)
{
    // Kafka is not available
}
Tubate answered 16/4, 2018 at 7:54 Comment(5)
This seems not correct, as it returns true when only one broker is up.Nitrate
@Nitrate can you elaborate more on your comment?Tubate
If you have >=3 brokers and replica is 3, the code returns true if 1 broker is up while the other >=2 are down. Actually it requires 1 zk node only and you can get topic name list without any broker up running.Nitrate
@Nitrate I find this answer valuable. Of course you need to understand what it is that you are actually "monitoring". Probing Zookeeper and probing the bootstrap servers as here are going to answer two different sets of questions. I argue that from a client perspective connecting to the bootstrap server(s) is the right thing to do. Even though you should have dedicated monitoring for the Kafka cluster (ZK and nodes) it makes sense to verify that a specific client can actually connect to the cluster.Rataplan
This should be marked as the accepted answer!Dartmoor
A
11

For Linux, "ps aux | grep kafka" see if kafka properties are shown in the results. E.g. /path/to/kafka/server.properties

Abamp answered 22/2, 2019 at 3:43 Comment(1)
they have specified its in Windows no?Peggi
U
5

Paul's answer is very good and it is actually how Kafka & Zk work together from a broker point of view.

I would say that another easy option to check if a Kafka server is running is to create a simple KafkaConsumer pointing to the cluste and try some action, for example, listTopics(). If kafka server is not running, you will get a TimeoutException and then you can use a try-catch sentence.

  def validateKafkaConnection(kafkaParams : mutable.Map[String, Object]) : Unit = {
    val props = new Properties()
    props.put("bootstrap.servers", kafkaParams.get("bootstrap.servers").get.toString)
    props.put("group.id", kafkaParams.get("group.id").get.toString)
    props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
    props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
    val simpleConsumer = new KafkaConsumer[String, String](props)
    simpleConsumer.listTopics()
  }
Underproof answered 24/11, 2017 at 16:57 Comment(2)
I started the zookeeper only not the Kafka and then executed the kafka-topics.bat --list and I got all the topics. It seems that only listing topics could not verify that Kafka is running.Tubate
@MohammadFaisal That command will get the information metadata from Zookeeper (github.com/apache/kafka/blob/0.8.1/core/src/main/scala/kafka/…). The solution I provided is getting the information from Kafka Cluster (if you follow the source code, you will get to this: github.com/apache/kafka/blob/0.10.0/clients/src/main/java/org/…). That is because you are not getting any error when Kafka cluster is down.Underproof
O
1

The good option is to use AdminClient as below before starting to produce or consume the messages

private static final int ADMIN_CLIENT_TIMEOUT_MS = 5000;           
 try (AdminClient client = AdminClient.create(properties)) {
            client.listTopics(new ListTopicsOptions().timeoutMs(ADMIN_CLIENT_TIMEOUT_MS)).listings().get();
        } catch (ExecutionException ex) {
            LOG.error("Kafka is not available, timed out after {} ms", ADMIN_CLIENT_TIMEOUT_MS);
            return;
        }
Ovolo answered 8/3, 2018 at 10:24 Comment(2)
Note that AdminClient is only available since version 0.11Underproof
Is there a way to disable the console logs emitted by above call. If I am going to try this in a loop, then the no. of log lines is huge.Krona
U
1

Firstly you need to create AdminClient bean:

 @Bean
 public AdminClient adminClient(){
   Map<String, Object> configs = new HashMap<>();
   configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG,
   StringUtils.arrayToCommaDelimitedString(new Object[]{"your bootstrap server address}));
   return AdminClient.create(configs);
 }

Then, you can use this script:

while (true) {
   Map<String, ConsumerGroupDescription> groupDescriptionMap =
         adminClient.describeConsumerGroups(Collections.singletonList(groupId))
         .all()
         .get(10, TimeUnit.SECONDS);

   ConsumerGroupDescription consumerGroupDescription = groupDescriptionMap.get(groupId);

   log.debug("Kafka consumer group ({}) state: {}",
                groupId,
                consumerGroupDescription.state());

   if (consumerGroupDescription.state().equals(ConsumerGroupState.STABLE)) {
        boolean isReady = true;
        for (MemberDescription member : consumerGroupDescription.members()) {
            if (member.assignment() == null || member.assignment().topicPartitions().isEmpty()) {
            isReady = false;
            }
        }

        if (isReady) {
            break;
           }
        }

        log.debug("Kafka consumer group ({}) is not ready. Waiting...", groupId);
        TimeUnit.SECONDS.sleep(1);
}

This script will check the state of the consumer group every second till the state will be STABLE. Because all consumers assigned to topic partitions, you can conclude that server is running and ready.

Uraninite answered 25/5, 2020 at 10:45 Comment(0)
A
1

Adding to answer above:

For anyone on a mac:

- brew install kafkacat

 #usage
  kcat -b <broker> -t <topic> -p <partition>

Anodize answered 13/3, 2023 at 18:5 Comment(0)
J
0

you can use below code to check for brokers available if server is running.

import org.I0Itec.zkclient.ZkClient;
     public static boolean isBrokerRunning(){
        boolean flag = false;
        ZkClient zkClient = new ZkClient(endpoint.getZookeeperConnect(), 10000);//, kafka.utils.ZKStringSerializer$.MODULE$);
        if(zkClient!=null){
            int brokersCount = zkClient.countChildren(ZkUtils.BrokerIdsPath());
            if(brokersCount > 0){
                logger.info("Following Broker(s) {} is/are available on Zookeeper.",zkClient.getChildren(ZkUtils.BrokerIdsPath()));
                flag = true;    
            }
            else{
                logger.error("ERROR:No Broker is available on Zookeeper.");
            }
            zkClient.close();

        }
        return flag;
    }
Jennelljenner answered 13/2, 2019 at 9:44 Comment(2)
Here, If I have multiple brokers running already, then false results would be returned. Your solution may work accurately for single broker environment.Weatherproof
Yes, for single broker it is perfect. BTW you did not mention for multiple. let me give it a try then. you can check if any one of the broker is up do not check for others, so as long as any broker is up you can skip others. On the other hand you still need to check for the last running broker as first N brokers may be down in very unfortunate case.Jennelljenner
M
0

I found an event OnError in confluent Kafka:

consumer.OnError += Consumer_OnError;

 private void Consumer_OnError(object sender, Error e)
    {
        Debug.Log("connection error: "+ e.Reason);
        ConsumerConnectionError(e);
    }

And its documentation in code:

    //
    // Summary:
    //     Raised on critical errors, e.g. connection failures or all brokers down. Note
    //     that the client will try to automatically recover from errors - these errors
    //     should be seen as informational rather than catastrophic
    //
    // Remarks:
    //     Executes on the same thread as every other Consumer event handler (except OnLog
    //     which may be called from an arbitrary thread).
    public event EventHandler<Error> OnError;
Mark answered 19/2, 2019 at 4:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.