kafka配置jmx_exporter
點選:https://github.com/prometheus/jmx_exporter,選擇下面的jar包下載下傳:
将下載下傳好的這個agent jar包上傳到kafka的broker節點所在伺服器上,每個broker都需要,比如上傳到如下路徑:/opt/agent/jmx_prometheus_javaagent-0.16.1.jar
修改kafka啟動腳本: bin/kafka-server-start.sh,增加java agent配置如下:
JMX_EXPORTER_OPTS="-javaagent:/opt/agent/jmx_prometheus_javaagent-0.16.1.jar=9095:/opt/agent/kafka_broker.yml"
export KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS $JMX_EXPORTER_OPTS"
這兩行代碼可以添加在腳本首部。
這裡指定了9095作為端口,jmx_exporter用到的kafka_broker.yml 配置如下:https://github.com/xxd763795151/kafka-exporter/blob/main/kafka_broker.yml
将kafka每個broker都這樣配置,重新開機kafka。
Prometheus配置
修改prometheus的配置prometheus.yml,增加如下配置:
- job_name: 'kafka'
metrics_path: /metrics
static_configs:
- targets: ['kafka1:9095', 'kafka2:9095', 'kafka3:9095']
labels:
env: "test"
p.s. 注意job_name不要修改,值就是"kafka",要不我下面的grafana不能直接用,還需要每個面闆依次修改。
Grafana配置
下面的Grafana面闆我已經配置好,可以直接拿來用,之後可以根據需要增加或删除相關面闆:https://github.com/xxd763795151/kafka-exporter/blob/main/grafana.json
貼幾個截圖:
消息積壓
在kafka的broker端無法直接擷取消息積壓等名額資訊,這些資料在消費端上,我們也不太可能去連接配接所有的消費端擷取監控資訊。
是以,我單獨寫了一個kafka-exporter可以擷取消息積壓的監控名額:https://github.com/xxd763795151/kafka-exporter
點選這個連結進入github倉庫後,根據說明進行部署并配置啟動後,然後在prometheus.yml增加如下配置:
- job_name: 'kafka-exporter'
metrics_path: /prometheus
static_configs:
- targets: ['kafka-expoter-host:9097']
labels:
env: "test"
上面的grafana配置裡已經包含了消息積壓的面闆:
如果後續有其它名額在jmx裡不提供,也可以繼續補充kafka-exporter,刮取更多需要的metrics。
告警
最新的配置代碼會送出在這裡: https://github.com/xxd763795151/kafka-exporter/blob/main/kafka_alert.yml
groups:
- name: Kafka測試叢集告警
rules:
- alert: "kafka叢集,出現腦裂"
expr: sum(kafka_controller_kafkacontroller_activecontrollercount{env="test"}) by (env) > 1
for: 0m
labels:
severity: warning
annotations:
description: '激活狀态的控制器數量為{{$value}},叢集可能出現腦裂'
summary: '{{$labels.env}} 叢集出現腦裂,請檢查叢集之前的網絡'
- alert: "kafka叢集沒有活躍的控制器"
expr: sum(kafka_controller_kafkacontroller_activecontrollercount{env="test"}) by (env) < 1
for: 0m
labels:
severity: warning
annotations:
description: '激活狀态的控制器數量為{{$value}},沒有活躍的控制器'
summary: '{{$labels.env}} 叢集沒有活躍的控制器,叢集可能無法正常管理'
- alert: "kafka節點挂了"
expr: count(kafka_server_replicamanager_leadercount{env="test"}) by (env) < 3
for: 0m
labels:
severity: warning
annotations:
description: '{{$labels.env}} 叢集的節點挂了,目前可用節點:{{$value}}'
summary: '{{$labels.env}} 叢集的節點挂了'
- alert: "kafka叢集出現leader不在首選副本上的分區"
expr: sum(kafka_controller_kafkacontroller_preferredreplicaimbalancecount{env="test"}) by (env) > 0
for: 1m
labels:
severity: warning
annotations:
description: '{{$labels.env}} 叢集出現leader不在首選副本上的分區,數量:{{$value}}'
summary: '{{$labels.env}} 叢集出現leader不在首選副本上的分區,分區副本負載不均衡,考慮使用kafka-preferred-replica-election腳本校正'
- alert: "kafka叢集離線分區數量大于0"
expr: sum(kafka_controller_kafkacontroller_offlinepartitionscount{env="test"}) by (env) > 0
for: 0m
labels:
severity: warning
annotations:
description: '{{$labels.env}} 叢集離線分區數量大于0,數量:{{$value}}'
summary: '{{$labels.env}} 叢集離線分區數量大于0'
- alert: "kafka叢集未保持同步的分區數大于0"
expr: sum(kafka_server_replicamanager_underreplicatedpartitions{env="test"}) by (env) > 0
for: 0m
labels:
severity: warning
annotations:
description: '{{$labels.env}} 叢集未保持同步的分區數大于0,數量:{{$value}}'
summary: '{{$labels.env}} 叢集未保持同步的分區數大于0,可能丢失消息'
- alert: "kafka節點所在主機的CPU使用率過高"
expr: irate(process_cpu_seconds_total{env="test"}[5m])*100 > 50
for: 10s
labels:
severity: warning
annotations:
description: '{{$labels.env}} 叢集CPU使用率過高,主機:{{$labels.instance}},目前CPU使用率:{{$value}}'
summary: '{{$labels.env}} 叢集CPU使用率過高'
- alert: "kafka節點YCG太頻繁"
expr: jvm_gc_collection_seconds_count{env="test", gc=~'.*Young.*'} - jvm_gc_collection_seconds_count{env="test", gc=~'.*Young.*'} offset 1m > 30
for: 0s
labels:
severity: warning
annotations:
description: '{{$labels.env}} 叢集節點YCG太頻繁,主機:{{$labels.instance}},最近1分鐘YGC次數:{{$value}}'
summary: '{{$labels.env}} 叢集節點YCG太頻繁'
- alert: "kafka叢集消息積壓告警"
expr: sum(consumer_lag{env="test"}) by (groupId, topic, env) > 20000
for: 30s
labels:
severity: warning
annotations:
description: '{{$labels.env}} 叢集出現消息積壓,消費組:{{$labels.groupId}},topic:{{$labels.topic}},目前積壓值:{{$value}}'
summary: '{{$labels.env}} 叢集出現消息積壓'
- alert: "kafka叢集網絡處理繁忙"
expr: kafka_network_socketserver_networkprocessoravgidlepercent{env="test"} < 0.3
for: 0s
labels:
severity: warning
annotations:
description: '{{$labels.env}} 叢集網絡線程池不太空閑,可能網絡處理壓力太大,主機:{{$labels.instance}},目前空閑值:{{$value}}'
summary: '{{$labels.env}} 叢集網絡處理繁忙'
- alert: "kafka叢集IO處理繁忙"
expr: kafka_server_kafkarequesthandlerpool_requesthandleravgidlepercent_total{env="test"} < 0.3
for: 0s
labels:
severity: warning
annotations:
description: '{{$labels.env}} 叢集IO線程池不太空閑,可能處理壓力太大,需要調整線程數,主機:{{$labels.instance}},目前空閑值:{{$value}}'
summary: '{{$labels.env}} 叢集IO處理繁忙'
末語