Comprehensive monitoring guide for Apache Kafka clusters.
Kafka Cluster Metrics Collection Monitoring Stack Broker 1 Broker 2 Broker 3 JMX Exporter Metrics Store Alerting Dashboards JMX JMX JMX
Metric Description Alert Threshold kafka.controller:ActiveControllerCountActive controller count ≠ 1 kafka.server:UnderReplicatedPartitionsUnder-replicated partitions > 0 kafka.controller:OfflinePartitionsCountOffline partitions > 0 kafka.server:UnderMinIsrPartitionCountBelow min ISR > 0
Metric Description Notes kafka.server:MessagesInPerSecMessages per second Per broker/topic kafka.server:BytesInPerSecBytes in per second Per broker/topic kafka.server:BytesOutPerSecBytes out per second Per broker/topic kafka.server:TotalProduceRequestsPerSecProduce requests Per broker kafka.server:TotalFetchRequestsPerSecFetch requests Per broker
Metric Description Alert Threshold kafka.network:TotalTimeMs,request=ProduceProduce latency P99 > 100ms kafka.network:TotalTimeMs,request=FetchConsumerFetch latency P99 > 100ms kafka.network:RequestQueueTimeMsQueue time > 10ms kafka.network:ResponseQueueTimeMsResponse queue time > 10ms
Metric Description Alert Threshold Consumer lag Records behind Growing continuously Lag growth rate Lag increase rate Positive for extended period
export KAFKA_JMX_OPTS = " -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.port=9999 "
bin/kafka-server-start.sh config/server.properties
lowercaseOutputName : true
lowercaseOutputLabelNames : true
- pattern : kafka.server<type=(.+), name=(.+), topic=(.+)><>Count
name : kafka_server_$1_$2_total
- pattern : kafka.server<type=(.+), name=(.+)><>Count
name : kafka_server_$1_$2_total
- pattern : kafka.network<type=RequestMetrics, name=(.+), request=(.+)><>Count
name : kafka_network_request_$1_total
- pattern : kafka.network<type=RequestMetrics, name=(.+)Percentile, request=(.+)><>(\d+)thPercentile
name : kafka_network_request_$1_percentile
- pattern : kafka.controller<type=(.+), name=(.+)><>Value
name : kafka_controller_$1_$2
Alert Condition Action Offline Partitions OfflinePartitionsCount > 0Investigate broker failures No Controller ActiveControllerCount != 1Check controller election Under Min ISR UnderMinIsrPartitionCount > 0Check broker health
Alert Condition Action Under-Replicated UnderReplicatedPartitions > 0 for 5minCheck replication lag High Produce Latency P99 > 100ms Check disk I/O, network Consumer Lag Growing Lag increasing continuously Scale consumers Disk Usage High > 80% used Add storage or adjust retention
- alert : KafkaOfflinePartitions
expr : kafka_controller_offline_partitions_count > 0
summary : " Kafka has offline partitions "
- alert : KafkaNoActiveController
expr : kafka_controller_active_controller_count != 1
summary : " Kafka cluster has no active controller "
- alert : KafkaUnderReplicatedPartitions
expr : kafka_server_replica_manager_under_replicated_partitions > 0
summary : " Kafka has under-replicated partitions "
- alert : KafkaConsumerLagGrowing
expr : rate(kafka_consumer_group_lag[5m]) > 0
summary : " Consumer lag is continuously growing "
# Check lag for all groups
kafka-consumer-groups.sh --bootstrap-server kafka:9092 \
kafka-consumer-groups.sh --bootstrap-server kafka:9092 \
--describe --group my-consumer-group
GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG
my-group my-topic 0 1000 1050 50
my-group my-topic 1 2000 2000 0
my-group my-topic 2 1500 1600 100
Column Description CURRENT-OFFSET Consumer's committed offset LOG-END-OFFSET Latest offset in partition LAG LOG-END-OFFSET - CURRENT-OFFSET
Panel Metrics Active Controller kafka_controller_active_controller_countOnline Brokers Count of responding brokers Offline Partitions kafka_controller_offline_partitions_countUnder-Replicated kafka_server_replica_manager_under_replicated_partitions
Panel Metrics Messages In/s kafka_server_broker_topic_metrics_messages_in_total rateBytes In/s kafka_server_broker_topic_metrics_bytes_in_total rateBytes Out/s kafka_server_broker_topic_metrics_bytes_out_total rateRequests/s kafka_network_request_total rate
Panel Metrics Produce P99 kafka_network_request_total_time_ms{quantile="0.99"}Fetch P99 kafka_network_request_total_time_ms{quantile="0.99"}Queue Time kafka_network_request_queue_time_ms
Panel Metrics CPU Usage Host CPU metrics Memory Usage Host memory metrics Disk Usage kafka_log_size per partitionNetwork I/O Host network metrics
BOOTSTRAP_SERVER = ${1 :- " localhost:9092 " }
echo " === Kafka Health Check === "
# Check broker connectivity
echo -n " Broker connectivity: "
if kafka-broker-api-versions.sh --bootstrap-server $BOOTSTRAP_SERVER > /dev/null 2>&1 ; then
# Check offline partitions
OFFLINE = $( kafka-topics.sh --bootstrap-server $BOOTSTRAP_SERVER \
--describe --unavailable-partitions 2> /dev/null | wc -l )
echo " Offline partitions: $OFFLINE "
if [ " $OFFLINE " -gt 0 ]; then
echo " CRITICAL: Offline partitions detected "
# Check under-replicated partitions
UNDER_REP = $( kafka-topics.sh --bootstrap-server $BOOTSTRAP_SERVER \
--describe --under-replicated-partitions 2> /dev/null | wc -l )
echo " Under-replicated partitions: $UNDER_REP "
if [ " $UNDER_REP " -gt 0 ]; then
echo " WARNING: Under-replicated partitions detected "
echo " === All checks passed === "
Metric Description Alert Threshold kafka.server:type=ReplicaManager,name=IsrShrinksPerSecISR shrink rate > 0 during normal operation kafka.server:type=ReplicaManager,name=IsrExpandsPerSecISR expansion rate Should follow shrinks kafka.server:type=ReplicaManager,name=FailedIsrUpdatesPerSecFailed ISR update rate > 0 kafka.server:type=ReplicaManager,name=LeaderCountLeader replicas per broker Uneven distribution kafka.server:type=ReplicaManager,name=PartitionCountPartitions per broker Uneven distribution kafka.server:type=ReplicaManager,name=OfflineReplicaCountOffline replicas > 0 kafka.server:type=ReplicaFetcherManager,name=MaxLag,clientId=ReplicaMax follower lag Proportional to batch size
Metric Description Notes kafka.network:type=RequestMetrics,name=TotalTimeMsTotal request time Sum of all phases kafka.network:type=RequestMetrics,name=RequestQueueTimeMsTime waiting in request queue High values indicate overload kafka.network:type=RequestMetrics,name=LocalTimeMsTime processing at leader Disk I/O bound kafka.network:type=RequestMetrics,name=RemoteTimeMsTime waiting for followers Non-zero with acks=all kafka.network:type=RequestMetrics,name=ResponseQueueTimeMsTime in response queue Network thread saturation kafka.network:type=RequestMetrics,name=ResponseSendTimeMsTime sending response Network bandwidth
Metric Description Alert Threshold kafka.network:type=SocketServer,name=NetworkProcessorAvgIdlePercentNetwork thread idle ratio < 0.3 kafka.server:type=KafkaRequestHandlerPool,name=RequestHandlerAvgIdlePercentRequest handler idle ratio < 0.3 kafka.network:type=RequestChannel,name=RequestQueueSizePending requests Growing continuously
Purgatory holds requests waiting for conditions to be met (e.g., acks from replicas).
Metric Description Notes kafka.server:type=DelayedOperationPurgatory,name=PurgatorySize,delayedOperation=ProducePending produce requests Non-zero with acks=-1 kafka.server:type=DelayedOperationPurgatory,name=PurgatorySize,delayedOperation=FetchPending fetch requests Depends on fetch.wait.max.ms
Metric Description Notes kafka.log:type=LogFlushStats,name=LogFlushRateAndTimeMsLog flush rate and time Disk performance indicator kafka.log:type=LogManager,name=OfflineLogDirectoryCountOffline log directories Should be 0 kafka.log:type=Log,name=Size,topic=X,partition=YPartition size in bytes Per-partition storage kafka.log:type=Log,name=NumLogSegments,topic=X,partition=YSegment count per partition Segment management kafka.log:type=Log,name=LogStartOffset,topic=X,partition=YFirst available offset Retention tracking kafka.log:type=Log,name=LogEndOffset,topic=X,partition=YLatest offset Progress tracking
Metric Description Alert Threshold kafka.controller:type=ControllerStats,name=LeaderElectionRateAndTimeMsLeader election rate Non-zero during failures kafka.controller:type=ControllerStats,name=UncleanLeaderElectionsPerSecUnclean elections > 0 (potential data loss) kafka.controller:type=KafkaController,name=TopicsToDeleteCountPending topic deletions Should decrease kafka.controller:type=KafkaController,name=ReplicasToDeleteCountPending replica deletions Should decrease kafka.controller:type=ControllerEventManager,name=EventQueueSizeController event queue Growing continuously kafka.controller:type=ControllerEventManager,name=EventQueueTimeMsEvent wait time High latency
KRaft clusters expose Raft consensus metrics on both controllers and brokers.
Metric Description Notes kafka.server:type=raft-metrics,name=current-stateNode state leader, follower, candidate, observer kafka.server:type=raft-metrics,name=current-leaderCurrent leader ID -1 indicates unknown kafka.server:type=raft-metrics,name=current-epochCurrent quorum epoch Increments on elections kafka.server:type=raft-metrics,name=high-watermarkCommitted log offset -1 if unknown kafka.server:type=raft-metrics,name=log-end-offsetEnd of Raft log Replication progress
Metric Description Alert Threshold kafka.server:type=raft-metrics,name=commit-latency-avgAverage commit latency Increasing trend kafka.server:type=raft-metrics,name=commit-latency-maxMaximum commit latency Spikes kafka.server:type=raft-metrics,name=election-latency-avgAverage election time Extended elections kafka.server:type=raft-metrics,name=fetch-records-rateRecord fetch rate Replication throughput kafka.server:type=raft-metrics,name=append-records-rateRecord append rate Write throughput
The group coordinator manages consumer group membership and offset storage.
Metric Description Notes kafka.server:type=group-coordinator-metrics,name=num-partitions,state=loadingLoading partitions Should be transient kafka.server:type=group-coordinator-metrics,name=num-partitions,state=activeActive partitions Normal operation kafka.server:type=group-coordinator-metrics,name=num-partitions,state=failedFailed partitions Should be 0
Metric Description Notes kafka.server:type=group-coordinator-metrics,name=consumer-group-count,state=stableStable groups Normal state kafka.server:type=group-coordinator-metrics,name=consumer-group-count,state=emptyEmpty groups No active members kafka.server:type=group-coordinator-metrics,name=consumer-group-count,state=assigningGroups assigning partitions Rebalance in progress kafka.server:type=group-coordinator-metrics,name=consumer-group-count,state=reconcilingGroups reconciling Incremental rebalance kafka.server:type=group-coordinator-metrics,name=consumer-group-rebalance-rateRebalance frequency High rate indicates instability
Metric Description Notes kafka.server:type=group-coordinator-metrics,name=offset-commit-rateOffset commit rate Consumer activity kafka.server:type=group-coordinator-metrics,name=offset-expiration-rateOffset expiration rate Inactive consumers kafka.server:type=GroupMetadataManager,name=NumOffsetsTotal committed offsets Storage overhead kafka.server:type=GroupMetadataManager,name=NumGroupsTotal consumer groups Group management
For clusters with tiered storage enabled, monitor remote storage operations.
Metric Description Notes kafka.server:type=BrokerTopicMetrics,name=RemoteFetchBytesPerSecBytes read from remote Cold read volume kafka.server:type=BrokerTopicMetrics,name=RemoteFetchRequestsPerSecRemote fetch requests Cold read frequency kafka.server:type=BrokerTopicMetrics,name=RemoteCopyBytesPerSecBytes copied to remote Upload throughput kafka.server:type=BrokerTopicMetrics,name=RemoteCopyRequestsPerSecCopy requests to remote Upload frequency kafka.server:type=BrokerTopicMetrics,name=RemoteDeleteRequestsPerSecDelete requests Retention cleanup
Metric Description Alert Threshold kafka.server:type=BrokerTopicMetrics,name=RemoteCopyLagBytesBytes pending upload Growing continuously kafka.server:type=BrokerTopicMetrics,name=RemoteCopyLagSegmentsSegments pending upload > configured threshold kafka.server:type=BrokerTopicMetrics,name=RemoteDeleteLagBytesBytes pending deletion Growing continuously kafka.server:type=BrokerTopicMetrics,name=RemoteDeleteLagSegmentsSegments pending deletion > configured threshold
Metric Description Alert Threshold kafka.server:type=BrokerTopicMetrics,name=RemoteFetchErrorsPerSecRemote read errors > 0 kafka.server:type=BrokerTopicMetrics,name=RemoteCopyErrorsPerSecRemote write errors > 0 kafka.server:type=BrokerTopicMetrics,name=RemoteDeleteErrorsPerSecRemote delete errors > 0
Metric Description Alert Threshold org.apache.kafka.storage.internals.log:type=RemoteStorageThreadPool,name=RemoteLogReaderTaskQueueSizeRead task queue Growing continuously org.apache.kafka.storage.internals.log:type=RemoteStorageThreadPool,name=RemoteLogReaderAvgIdlePercentRead thread utilization < 0.3 kafka.log.remote:type=RemoteLogManager,name=RemoteLogManagerTasksAvgIdlePercentCopy thread utilization < 0.3
Client-side metrics for monitoring producer applications.
Metric Description Notes kafka.producer:type=producer-metrics,name=record-send-rateRecords sent per second Production rate kafka.producer:type=producer-metrics,name=byte-rateBytes sent per second Bandwidth usage kafka.producer:type=producer-metrics,name=compression-rate-avgCompression ratio < 1.0 indicates compression kafka.producer:type=producer-metrics,name=record-size-avgAverage record size Sizing validation
Metric Description Alert Threshold kafka.producer:type=producer-metrics,name=request-latency-avgAverage request latency Increasing trend kafka.producer:type=producer-metrics,name=request-latency-maxMaximum request latency Spikes kafka.producer:type=producer-metrics,name=record-queue-time-avgTime in buffer High indicates backpressure kafka.producer:type=producer-metrics,name=produce-throttle-time-avgThrottle time > 0 indicates quota hit
Metric Description Alert Threshold kafka.producer:type=producer-metrics,name=buffer-available-bytesAvailable buffer space Approaching 0 kafka.producer:type=producer-metrics,name=buffer-total-bytesTotal buffer size Configuration reference kafka.producer:type=producer-metrics,name=bufferpool-wait-ratioTime waiting for buffer > 0 indicates memory pressure kafka.producer:type=producer-metrics,name=batch-size-avgAverage batch size Tuning indicator
Metric Description Alert Threshold kafka.producer:type=producer-metrics,name=record-error-rateRecord error rate > 0 kafka.producer:type=producer-metrics,name=record-retry-rateRecord retry rate High rate
Client-side metrics for monitoring consumer applications.
Metric Description Notes kafka.consumer:type=consumer-fetch-manager-metrics,name=records-consumed-rateRecords consumed per second Consumption rate kafka.consumer:type=consumer-fetch-manager-metrics,name=bytes-consumed-rateBytes consumed per second Bandwidth usage kafka.consumer:type=consumer-fetch-manager-metrics,name=fetch-rateFetch request rate Request frequency kafka.consumer:type=consumer-fetch-manager-metrics,name=records-per-request-avgRecords per fetch Efficiency indicator
Metric Description Alert Threshold kafka.consumer:type=consumer-fetch-manager-metrics,name=records-lag-maxMaximum partition lag Growing continuously kafka.consumer:type=consumer-fetch-manager-metrics,name=records-lag,partition=XPer-partition lag Above threshold kafka.consumer:type=consumer-fetch-manager-metrics,name=records-lead-minMinimum lead (distance to start) Approaching 0
Metric Description Alert Threshold kafka.consumer:type=consumer-coordinator-metrics,name=rebalance-totalTotal rebalances High count kafka.consumer:type=consumer-coordinator-metrics,name=rebalance-rate-per-hourRebalance frequency > 1-2 per hour kafka.consumer:type=consumer-coordinator-metrics,name=rebalance-latency-avgAverage rebalance time > configured session timeout kafka.consumer:type=consumer-coordinator-metrics,name=assigned-partitionsAssigned partition count Uneven distribution
Metric Description Alert Threshold kafka.consumer:type=consumer-coordinator-metrics,name=heartbeat-rateHeartbeats per second Below expected rate kafka.consumer:type=consumer-coordinator-metrics,name=heartbeat-response-time-maxMax heartbeat response time Approaching session timeout kafka.consumer:type=consumer-coordinator-metrics,name=last-heartbeat-seconds-agoTime since last heartbeat Approaching session timeout
Metric Description Notes kafka.consumer:type=consumer-coordinator-metrics,name=commit-rateCommit rate Commit frequency kafka.consumer:type=consumer-coordinator-metrics,name=commit-latency-avgAverage commit latency Performance indicator
For Kafka Streams applications, monitor stream processing performance.
Metric Description Notes kafka.streams:type=stream-thread-metrics,name=stateThread state RUNNING, PARTITIONS_ASSIGNED, etc. kafka.streams:type=stream-thread-metrics,name=commit-rateCommits per second Processing frequency kafka.streams:type=stream-thread-metrics,name=poll-ratePolls per second Input rate kafka.streams:type=stream-thread-metrics,name=process-rateRecords processed per second Processing throughput
Metric Description Alert Threshold kafka.streams:type=stream-thread-metrics,name=process-latency-avgAverage processing time Increasing trend kafka.streams:type=stream-thread-metrics,name=commit-latency-avgAverage commit time High latency kafka.streams:type=stream-thread-metrics,name=poll-latency-avgAverage poll time High latency kafka.streams:type=stream-thread-metrics,name=punctuate-latency-avgAverage punctuate time High latency
Metric Description Notes kafka.streams:type=stream-thread-metrics,name=task-created-rateTask creation rate Rebalance activity kafka.streams:type=stream-thread-metrics,name=task-closed-rateTask close rate Rebalance activity kafka.streams:type=stream-task-metrics,name=process-ratePer-task processing rate Task-level throughput kafka.streams:type=stream-task-metrics,name=dropped-records-rateDropped record rate Data loss indicator
Metric Description Notes kafka.streams:type=stream-state-metrics,name=put-rateState store write rate Write throughput kafka.streams:type=stream-state-metrics,name=get-rateState store read rate Read throughput kafka.streams:type=stream-state-metrics,name=flush-rateState store flush rate Persistence frequency kafka.streams:type=stream-state-metrics,name=restore-rateState restoration rate Recovery progress
Monitor client quota enforcement.
Metric Description Notes kafka.server:type=Produce,user=X,client-id=Y,name=throttle-timeProducer throttle time > 0 indicates quota exceeded kafka.server:type=Fetch,user=X,client-id=Y,name=throttle-timeConsumer throttle time > 0 indicates quota exceeded kafka.server:type=Request,user=X,client-id=Y,name=throttle-timeRequest throttle time > 0 indicates quota exceeded
Monitor authentication and authorization.
Metric Description Alert Threshold kafka.server:type=socket-server-metrics,name=successful-authentication-rateSuccessful auth rate Reference baseline kafka.server:type=socket-server-metrics,name=failed-authentication-rateFailed auth rate > 0 kafka.network:type=SocketServer,name=ExpiredConnectionsKilledCountConnections killed (auth expiry) > 0 with re-auth enabled
Metric Naming Convention (KIP-1100)
Kafka 4.2 corrects metric names to follow the kafka.COMPONENT naming convention. Some metric names from earlier versions have been renamed. Monitor for any dashboard or alerting rule breakage after upgrading.
Metric KIP Description kafka.controller:AvgIdleRatioKIP-1190 Controller thread idle ratio. Low values indicate the controller is under heavy load kafka.server:AvgIdleRatio (MetadataLoader)KIP-1229 MetadataLoader thread idle ratio. Monitors metadata processing capacity kafka.server:RequestHandlerAvgIdlePercentKIP-1207 Fixed in KRaft combined mode to report accurately (previously incorrect in combined controller+broker nodes) Feature level metrics KIP-1180 Generic metrics for finalized and supported feature levels across the cluster client-id tag on AppInfoKIP-1120 AppInfo metrics now include a client-id tag for distinguishing between client instances application-id tag on Streams stateKIP-1221 Kafka Streams client state metric now includes an application-id tag Share partition lag KIP-1226 Lag metrics for share group partition consumption progress