天天看點

可直接拿來用的kafka+prometheus+grafana監控告警配置

kafka配置jmx_exporter

點選:https://github.com/prometheus/jmx_exporter,選擇下面的jar包下載下傳:

可直接拿來用的kafka+prometheus+grafana監控告警配置
将下載下傳好的這個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+prometheus+grafana監控告警配置
可直接拿來用的kafka+prometheus+grafana監控告警配置

消息積壓

在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處理繁忙'           

末語