Мониторинг Kafka с помощью Proto Observability

Визуализация производительности вашего кластера в режиме реального времени

Сбор метрик Kafka

Конфигурация ProtoOBP агента

  1. В файле конфигурации Kafka проверки ProtoOBP Агента (/etc/protoobp-agent/conf.d/kafka.d/conf.yaml) укажите следующее:

    init_config:
      is_jmx: true, 
      collect_default_metrics: true, 
      new_gc_metrics: true
    instances:
      - host: http://localhost
        port: 9997 #JMX 
        user: user #Если используется аутентификациия 
        password: password #Если используется аутентификациия
    
  2. Перезапустите ProtoOBP Агента выполнив systemctl restart protoobp-agent

  1. Убедитесь, что у вас установлен Агент для Kubernetes с тегом образа Агента с -jmx суффиксом.
  2. Убедитесь, что JMX включен для Kafka и доступен для подключения.
  3. Добавьте необходимую аннотацию и, опционально, лейблы.

Полностью рабочий пример для запуска Kafka с аннотациями для автодискавернга агентом:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: kafka
  labels:
    app: kafka
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kafka
  template:
    metadata:
      labels:
        app: kafka
        tags.proto.group/service: "my-kafka"  # тег для метрик Kafka в ProtoOBP
        tags.proto.group/env: "dev"           # тег для метрик Kafka в ProtoOBP
        tags.proto.group/version: "3.0"       # тег для метрик Kafka в ProtoOBP
      annotations:
        ad.proto.group/kafka.checks: |-
          {
            "kafka": {
              "init_config": {
                "is_jmx": true,
                "collect_default_metrics": true,
                "new_gc_metrics": true
              },
              "instances": [
                {
                  "host": "%%host%%",
                  "port": "9101",
                  "monitor_unlisted_consumer_groups": true,
                  "monitor_all_broker_highwatermarks": true
                }
              ]
            }
          }          
    spec:
      containers:
        - name: kafka
          image: confluentinc/cp-kafka:7.7.0
          ports:
            - name: broker
              containerPort: 9092
            - name: jmx                 # обязательно JMX порт
              containerPort: 9101
          env:
            - name: KAFKA_PROCESS_ROLES
              value: "controller,broker"
            - name: KAFKA_NODE_ID
              value: "1"
            - name: KAFKA_CONTROLLER_QUORUM_VOTERS
              value: "1@kafka-broker:9093"
            - name: KAFKA_LISTENERS
              value: "PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093"
            - name: KAFKA_ADVERTISED_LISTENERS
              value: "PLAINTEXT://kafka-broker:9092"
            - name: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
              value: "PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT"
            - name: KAFKA_INTER_BROKER_LISTENER_NAME
              value: "PLAINTEXT"
            - name: KAFKA_CONTROLLER_LISTENER_NAMES
              value: "CONTROLLER"
            - name: KAFKA_AUTO_CREATE_TOPICS_ENABLE
              value: "true"
            - name: CLUSTER_ID
              value: "MkU3OEVBNTcwNTJENDM2Qk"

            - name: POD_IP                    # для того чтобы Kafka использовала IP пода для JXM host 
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: KAFKA_JMX_PORT           # порт должен соответствовать порту в instances
              value: "9101"
            - name: KAFKA_JMX_HOSTNAME       # для того чтобы Kafka использовала IP пода для JXM host 
              value: "$(POD_IP)"
            - name: KAFKA_JMX_OPTS           # включение опций JMX 
              value: "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9101 -Dcom.sun.management.jmxremote.rmi.port=9101 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=$(POD_IP)"

          volumeMounts:
            - name: data
              mountPath: /var/lib/kafka/data
      volumes:
        - name: data
          emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: kafka-broker
spec:
  selector:
    app: kafka
  ports:
    - name: kafka
      port: 9092
      targetPort: 9092
      nodePort: 30092
  type: NodePort