Prometheus
is monitoring opensource tool. Previous Article we have enabled Zookeeper
metrics and monitor in the Prometheus.
http://www.liferaysavvy.com/2021/07/enable-metrics-provider-in-zookeeper.html
 
This article demonstrates the Kafka monitoring using Prometheus.
Prometheus uses the JMX Exporter agent to get all JVM metrics from Kafka.
We need to run JMX Exported Java agent in each server
where Kafka is running.
Software’s and Tools
 
  |   Windows 10 Java 1.8 or
  higher Zookeeper 3.7.0 Kafka 2.8 JMX Exporter Java
  Agent 0.15.0 prometheus-2.28.1   | 
 
Prerequisite
Set up Zookeeper Cluster
http://www.liferaysavvy.com/2021/07/setup-zookeeper-cluster.html
 
Set up Kafka Cluster
http://www.liferaysavvy.com/2021/07/setup-kafka-cluster.html
 
- Download JMX Exporter
- Configure JMX Exporter for Kafka
- Start Kafka with JMX Exporter Agent
- Install Prometheus
- Configure Prometheus scrape for Kafka
- Verify Kafka brokers in Prometheus
 
Download and Start JMX Exporter
Download JMX Exporter jar file from following
location.
https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/
 
Direct link for latest JMX Exporter JAR
https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.15.0/jmx_prometheus_javaagent-0.15.0.jar
 
OR
https://github.com/LiferaySavvy/kafka-monitoring/raw/master/jmx_prometheus_javaagent-0.15.0.jar
 
 
Download and get the jar to local directory.
 
Configure JMX Exporter for Kafka
We need to configure the exporter configuration for
Kafka such a way JMX service exports the required metrics from Kafka.
Get the following JMX Exporter configuration file from
below location and place it in local drive.
https://github.com/confluentinc/jmx-monitoring-stacks/blob/6.1.0-post/shared-assets/jmx-exporter/kafka_broker.yml
OR
https://github.com/LiferaySavvy/kafka-monitoring/blob/master/kafka_broker.yml
 
We can use below one too.
 
  |   lowercaseOutputName:
  true rules: # Special cases
  and very specific rules - pattern :
  kafka.server<type=(.+), name=(.+), clientId=(.+), topic=(.+),
  partition=(.*)><>Value   name: kafka_server_$1_$2   type: GAUGE   labels:     clientId: "$3"     topic: "$4"     partition: "$5" - pattern :
  kafka.server<type=(.+), name=(.+), clientId=(.+), brokerHost=(.+),
  brokerPort=(.+)><>Value   name: kafka_server_$1_$2   type: GAUGE   labels:     clientId: "$3"     broker: "$4:$5"   - pattern :
  kafka.server<type=KafkaRequestHandlerPool, name=RequestHandlerAvgIdlePercent><>OneMinuteRate   name:
  kafka_server_kafkarequesthandlerpool_requesthandleravgidlepercent_total   type: GAUGE   - pattern :
  kafka.server<type=socket-server-metrics, clientSoftwareName=(.+),
  clientSoftwareVersion=(.+), listener=(.+),
  networkProcessor=(.+)><>connections   name:
  kafka_server_socketservermetrics_connections   type: GAUGE   labels:     client_software_name: "$1"     client_software_version: "$2"     listener: "$3"     network_processor: "$4"   - pattern :
  'kafka.server<type=socket-server-metrics, listener=(.+),
  networkProcessor=(.+)><>(.+):'   name: kafka_server_socketservermetrics_$3   type: GAUGE   labels:     listener: "$1"     network_processor: "$2"   # Count and
  Value - pattern:
  kafka.(.*)<type=(.+), name=(.+), (.+)=(.+),
  (.+)=(.+)><>(Count|Value)   name: kafka_$1_$2_$3   labels:     "$4": "$5"     "$6": "$7" - pattern:
  kafka.(.*)<type=(.+), name=(.+), (.+)=(.+)><>(Count|Value)   name: kafka_$1_$2_$3   labels:     "$4": "$5" - pattern:
  kafka.(.*)<type=(.+), name=(.+)><>(Count|Value)   name: kafka_$1_$2_$3   # Percentile - pattern:
  kafka.(.*)<type=(.+), name=(.+), (.+)=(.*),
  (.+)=(.+)><>(\d+)thPercentile   name: kafka_$1_$2_$3   type: GAUGE   labels:     "$4": "$5"     "$6": "$7"     quantile: "0.$8" - pattern:
  kafka.(.*)<type=(.+), name=(.+), (.+)=(.*)><>(\d+)thPercentile   name: kafka_$1_$2_$3   type: GAUGE   labels:     "$4": "$5"     quantile: "0.$6" - pattern:
  kafka.(.*)<type=(.+), name=(.+)><>(\d+)thPercentile   name: kafka_$1_$2_$3   type: GAUGE   labels:     quantile: "0.$4"   | 
 

 
Start Kafka with JMX Exporter Agent
It’s required to start JMX Exporter agent with Kafka. Set
JMX Exporter java agent in KAFKA_OPTS.
We can set KAFKA_OPTS different ways and below example
is setting up directly in windows command prompt and then start Kafka.
JAVA agent syntax
 
  |   -javaagent:C:/kafka-workspace/kafka-monitoring/jmx_prometheus_javaagent-0.15.0.jar=<port>:<exporter-config-file-path> 
 | 
Set KAFKA_OPTS in windows as follow
 
  |   set
  KAFKA_OPTS=-javaagent:C:/kafka-workspace/kafka-monitoring/jmx_prometheus_javaagent-0.15.0.jar=8181:C:/kafka-workspace/kafka-monitoring/kafka_broker.yml   | 
 
Kafka Broker1 Startup
Open command prompt and locate kafka-broker1 root
directory and use following commands.
 
  |   cd
  C:\kafka-workspace\kafka-broker1   set
  KAFKA_OPTS=-javaagent:C:/kafka-workspace/kafka-monitoring/jmx_prometheus_javaagent-0.15.0.jar=8181:C:/kafka-workspace/kafka-monitoring/kafka_broker.yml   bin\windows\kafka-server-start.bat
  .\config\server.properties   | 
 
Now Kafka broker1 started with JMX Exporter agent.
 
Repeat the same for other brokers in the cluster
Kafka Broker2 Startup
 
  |   cd
  C:\kafka-workspace\kafka-broker2   set
  KAFKA_OPTS=-javaagent:C:/kafka-workspace/kafka-monitoring/jmx_prometheus_javaagent-0.15.0.jar=8282:C:/kafka-workspace/kafka-monitoring/kafka_broker.yml   bin\windows\kafka-server-start.bat
  .\config\server.properties   | 
 
Kafka Broker3 Startup
 
  |   cd
  C:\kafka-workspace\kafka-broker3   set
  KAFKA_OPTS=-javaagent:C:/kafka-workspace/kafka-monitoring/jmx_prometheus_javaagent-0.15.0.jar=8383:C:/kafka-workspace/kafka-monitoring/kafka_broker.yml   bin\windows\kafka-server-start.bat
  .\config\server.properties   | 
 
Make sure all JMX Exporter are started successfully with
following URL’s. All java agents are running in same machine, its required to change
ports accordingly. 
 
 
 
Install Prometheus
Go to Prometheus download page and download latest
version.
https://prometheus.io/download/
Direct Links as follows
https://github.com/prometheus/prometheus/releases/download/v2.28.1/prometheus-2.28.1.windows-amd64.zip
 
Extract in local Drive
Configure Prometheus scrape for Kafka
Locate Prometheus directory and update “prometheus.yml”
file with following Kafka scrape.
Find file from following location
https://github.com/LiferaySavvy/kafka-monitoring/blob/master/prometheus.yml
 
 
  | 
 - job_name:
  "kafka"     static_configs:       - targets: ['localhost:8181','localhost:8282','localhost:8383']         labels:           env: "kafka-dev"   
 | 
 
Targets should be JMX Exporter java agent host:port.
 
Complete “prometheus.yml” file
 
  | 
 # my global
  config global:   scrape_interval:     15s # Set the scrape interval to every
  15 seconds. Default is every 1 minute.   evaluation_interval: 15s # Evaluate rules
  every 15 seconds. The default is every 1 minute.   # scrape_timeout is set to the global
  default (10s).   # Alertmanager
  configuration alerting:   alertmanagers:   - static_configs:     - targets:       # - alertmanager:9093   # Load rules
  once and periodically evaluate them according to the global
  'evaluation_interval'. rule_files:   # - "first_rules.yml"   # - "second_rules.yml"   # A scrape
  configuration containing exactly one endpoint to scrape: # Here it's
  Prometheus itself. scrape_configs:   # The job name is added as a label
  `job=<job_name>` to any timeseries scraped from this config.   - job_name: 'prometheus'       # metrics_path defaults to '/metrics'     # scheme defaults to 'http'.       static_configs:     - targets: ['localhost:9090']        - job_name: "kafka"     static_configs:       - targets:
  ['localhost:8181','localhost:8282','localhost:8383']         labels:           env: "kafka-dev"   | 
 
Start “Prometheus”
Open command prompt and locate to “Prometheus”
root directory. Use the following start command and pass web listen address
and config file as options.
 
  |   prometheus.exe
  --config.file prometheus.yml --web.listen-address ":9090"
  --storage.tsdb.path "data"   | 
 
Verify Kafka brokers in Prometheus
Access “Prometheus” web interface with
following URL and its running on 9090 port.
 
 
Targets Status
Go to Status menu and click on targets so we can see Kafka
cluster health for each Broker.
 
Kafka brokers health in the cluster.
 
 
 
 
Reference
https://github.com/confluentinc/jmx-monitoring-stacks
https://github.com/confluentinc/jmx-monitoring-stacks/tree/6.1.0-post/shared-assets/jmx-exporter
http://www.liferaysavvy.com/2021/07/enable-metrics-provider-in-zookeeper.html
 
Author