Skip to content

helli0n/kafka-monitoring

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

45 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Welcome to the kafka-monitoring wiki!

Requirements

Solutions tested on:

Zabbix 4.4+
Kafka 2+
Burrow
CMAK
Grafana

First you have to install zabbix-java-gataway

yum install -y zabbix-java-gataway

Configuring zabbix-java-gataway

mcedit /etc/zabbix/zabbix_java_gateway.conf

Uncoment and set START_POLLERS=10

Configuring zabbix-server

mcedit /etc/zabbix/zabbix_server.conf

Uncoment and set to StartJavaPollers=5 Change IP for JavaGateway=IP_address_java_gateway

Restart zabbix-server

/etc/init.d/zabbix-java-gataway restart

Add to autorun zabbix-java-gataway

 chkconfig --level 345 zabbix-java-gataway on

Start zabbix-java-gataway

/etc/init.d/zabbix-java-gataway start

Kafka configuration

cd /opt/kafka/bin
mcedit kafka-run-class.sh

change from

# JMX settings
if [ -z "$KAFKA_JMX_OPTS" ]; then
KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false "
fi

to

# JMX settings
if [ -z "$KAFKA_JMX_OPTS" ]; then
KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -    Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
fi

Add Kafka as service

Add to /etc/supervisord.conf that lines

 [program:kafka]
 command=/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties
 directory=/opt/kafka/
 autostart=true
 autorestart=true
 stopasgroup=true
 startsecs=10
 startretries=999
 log_stdout=true
 log_stderr=true
 logfile=/var/log/kafka/supervisord-kafka.out
 logfile_maxbytes=20MB
 logfile_backups=10

Restart supervisor

 /etc/init.d/supervisord restart

Kafka systemd unit

For systemd is possible to use unit like example below. For this example kafka is installed in /usr/local/kafka/kafka_2.12-2.5.0

[Unit]
Description=Apache Kafka
Wants=network.target
After=network.target

[Service]
LimitNOFILE=32768
User=kafka

Environment=JAVA=/usr/bin/java
Environment="KAFKA_USER=kafka"
Environment="KAFKA_HOME=/usr/local/kafka/kafka_2.12-2.5.0"
Environment="SCALA_VERSION=2.12"
Environment="KAFKA_CONFIG=/usr/local/kafka/config"
Environment="KAFKA_BIN=/usr/local/kafka/bin"
Environment="KAFKA_LOG4J_OPTS=-Dlog4j.configuration=file:/usr/local/kafka/config/log4j.properties"
Environment="KAFKA_OPTS="
Environment="KAFKA_HEAP_OPTS=-Xmx512M -Xms256M"
Environment="KAFKA_JVM_PERFORMANCE_OPTS=-server -XX:+UseCompressedOops -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSScavengeBeforeRemark -XX:+DisableExplicitGC -Djava.awt.headless=true"
Environment="KAFKA_LOG_DIR=/var/log/kafka"
Environment="KAFKA_JMX_OPTS=-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.net.preferIPv4Stack=true -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=<REPLACE_WITH_YOUR_JMX_PORT> -Dcom.sun.management.jmxremote.rmi.port=<REPLACE_WITH_YOUR_JMX_PORT> -Djava.rmi.server.hostname=<REPLACE_WITH_YOUR_HOSTNAME>"

ExecStart=/usr/local/kafka/bin/kafka-server-start.sh ${KAFKA_CONFIG}/server.properties

SuccessExitStatus=0 143

Restart=on-failure
RestartSec=15

[Install]
WantedBy=multi-user.target

Please pay additional attention on options:

 -Dcom.sun.management.jmxremote.port=<REPLACE_WITH_YOUR_JMX_PORT>
 -Dcom.sun.management.jmxremote.rmi.port=<REPLACE_WITH_YOUR_JMX_PORT>

To avoid using dynamic TCP port and firewall/NAT issues it is better to set static port setting.

Restart kafka service

 systemctl daemon-reload
 systemctl restart kafka-service

Zabbix configuration

##Import template Log in to your zabbix web

Click Configuration->Templates->Import

Download template zbx_kafka_templates.xml and upload to zabbix Then add this template to Kafka and configure JMX interfaces on zabbix

Enter Kafka IP address and JMX port If you see jmx icon, you configured JMX monitoring good!

Troubles

if you have problems you can check JMX using this script #!/usr/bin/env bash

 ZBXGET="/usr/bin/zabbix_get"
 if [ $# != 5 ]
 then
 echo "Usage: $0 <JAVA_GATEWAY_HOST> <JAVA_GATEWAY_PORT> <JMX_SERVER> <JMX_PORT> <KEY>"
 exit;
 fi
 QUERY="{\"request\": \"java gateway jmx\",\"conn\": \"$3\",\"port\": $4,\"keys\": [\"$5\"]}"
 $ZBXGET -s $1 -p $2 -k "$QUERY"

eg.: ./zabb_get_java zabbix-java-gateway-ip 10052 server-test-ip 12345 'jmx[java.lang:type=Threading,PeakThreadCount]'

For monitoring kafka consumers you should install Burrow daemon and jq tools on kafka host


Kafka Consumer Monitoring

Clone all stuff

 ssh clone https://github.com/helli0n/kafka-monitoring.git
 cd kafka/kafkaconsumers

Install burrow

 cp -r burrow /opt/
 cp burrow/ /etc/init.d/burrow_script
 chkconfig --level 345 burrow_script on

You should change config file in /opt/burrow/burrow.cfg

Install jq

 cd /usr/bin
 wget https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64
 mv jq-linux64 jq
 chmod +x jq

Check jq

 # jq 
 # jq 
 jq - commandline JSON processor [version 1.5]
 Usage: jq [options] <jq filter> [file...]
 jq is a tool for processing JSON inputs, applying the
 given filter to its JSON text inputs and producing the
 filter's results as JSON on standard output.
 The simplest filter is ., which is the identity filter,
 copying jq's input to its output unmodified (except for
 formatting).
 For more advanced filters see the jq(1) manpage ("man jq")
 and/or https://stedolan.github.io/jq
 Some of the options include:
 -c compact instead of pretty-printed output;
 -n use `null` as the single input value;
 -e set the exit status code based on the output;
 -s read (slurp) all inputs into an array; apply filter to it;
 -r output raw strings, not JSON texts;
 -R read raw strings, not JSON texts;
 -C colorize JSON;
 -M monochrome (don't colorize JSON);
 -S sort keys of objects on output;
 --tab use tabs for indentation;
 --arg a v set variable $a to value <v>;
 --argjson a v set variable $a to JSON value <v>;
 --slurpfile a f set variable $a to an array of JSON texts read from <f>;
 See the manpage for more options.

Copy files to zabbix folder

 cp kafka_consumers.sh /etc/zabbix/
 cp userparameter_kafkaconsumer.conf /etc/zabbix/zabbix_agentd.d
Start burrow and restart zabbix-agent
 /etc/init.d/burrow_script start
 /etc/init.d/zabbix-agent restart

For using python script copy files to zabbix folder

 cp kafka_consumers.py /etc/zabbix/
 cp userparameter_kafkaconsumer_py.conf /etc/zabbix/zabbix_agentd.d
Install python libs
pip install requests
Start burrow and restart zabbix-agent
 /etc/init.d/burrow_script start
 /etc/init.d/zabbix-agent restart

Upload template zbx_templates_kafkaconsumers.xml and mapping value zbx_valuemaps_kafkaconsumers.xml to zabbix server using UI and link template to Kafka host

Troubleshooting

If it doesn't work you can check it use /etc/zabbix/kafka_consumers.sh e.g.: # /etc/zabbix/kafka_consumers.sh discovery {"data":[{ "{#CONSUMER}": "CONSUMER0", "{#PARTITION}": 0, "{#TOPIC}": "TOPIC0" },{ "{#CONSUMER}": "CONSUMER1", "{#PARTITION}": 0, "{#TOPIC}": "TOPIC1" }]}

For using Grafana

Need to deploy grafana-xxl docker container and add zabbix server as a source. Upload Grafana dashboard template

kafka-monitoring

https://github.com/helli0n/kafka-monitoring/wiki/Kafka-monitoring

https://engineering.linkedin.com/apache-kafka/burrow-kafka-consumer-monitoring-reinvented

https://github.com/linkedin/Burrow/wiki

https://community.hortonworks.com/articles/28103/monitoring-kafka-with-burrow.html

https://github.com/yahoo/CMAK

https://github.com/RiotGamesMinions/zabbix_jmxdiscovery

https://zabbix.org/wiki/Docs/howto/zabbix_get_jmx

https://www.zabbix.org/wiki/ConfigureJMX

https://www.zabbix.com/documentation/4.4/manual/discovery/low_level_discovery/jmx

https://www.zabbix.com/ru/integrations/kafka

https://github.com/monitoringartist/grafana-xxl