본문 바로가기

Database

[DOIK 스터디 2기] JMX를 통한 Kafka Connect 모니터링

반응형

DOIK 스터디 2기 - 6번째 글로 JMX를 통해 Kafka 모니터링하는 방법에 대해서 소개한다.

 

공부하는 내용을 정리하는 글이라 부정확할 수 있음 주의

 


 

Kafka를 모니터링하기 위해서는 JMX(Java Management Extentions)를 사용하여 모니터링할 수 있다.

Kafka는 JMX를 지원하여 여러 가지 관리 및 모니터링 작업을 수행할 수 있다.

 

JMX Exporter는 Java 기반의 Application을 모니터링하기 위해 Prometheus 재단에서 만든 공식 Exporter이다.

 

JMX Exporter는 Agent 형태로 실행되며 JMX Exporter가 JAVA Application의 Metric을 수집하기 위해서는 Java Application에 JMX가 필히 활성화되어있어야 한다. 그래야 수집되기 때문이다.

 

따라서 JMX Exporter를 통해 Kafka 혹은 Kafka Connect 등을 모니터링하기 위해서는 다음의 과정이 필요하다.

 

1. JAVA Application에서는 JMX가 활성화되어 있어야 한다.

2. JMX Exporter는 활성화된 JMX를 통해 JMX 메트릭을 수집한 뒤 /metrics 경로를 통해 노출시킨다.

 

이렇게 한 뒤에는 매우 쉬워진다. Prometheus가 노출된 메트릭을 긁어가기면 하면 되기 때문이다.

 

 

https://grafana.com/docs/grafana-cloud/monitor-infrastructure/integrations/integration-reference/integration-kafka/

 

 

Kafka Broker, Zookeeper, KSQL, Schema Registry, Kafka Connect 모두 지원되기 때문에 방법만 알면 Prometheues 기반으로 모니터링을 쉽게 적용할 수 있다.

 

 

Kafka Connect - JMX Exporter 설정 방법

Kafka Connect JMX Metrics를 통해 다음을 모니터링할 수 있다.

 

Kafka Connect의 JVM Metrics (Heap memory, NonHeap Memory, ..)

 

Connector 메트릭
Connector 상태 (running, paused, failed 등)
Connector에서 처리한 레코드 수
Connector의 에러 수

 

Task 메트릭
Task 상태 (running, failed, completed 등)
Task에서 처리한 레코드 수
Task의 에러 수

 

Worker 메트릭
Worker 상태 (running, failed, rebalancing 등)
Worker의 총 할당된 쓰레드 수
Worker의 사용 중인 쓰레드 수

 

 

 

https://github.com/prometheus/jmx_exporter

 

GitHub - prometheus/jmx_exporter: A process for exposing JMX Beans via HTTP for Prometheus consumption

A process for exposing JMX Beans via HTTP for Prometheus consumption - GitHub - prometheus/jmx_exporter: A process for exposing JMX Beans via HTTP for Prometheus consumption

github.com

 

 

위 Prometheus JMX Exporter 깃허브를 참고하면서 읽어보자.

 

 

1. Kafka Connect 설정 - JMX_PORT

Connect 워커의 'connect-distributed.properties'  파일 내 JMX_PORT를 사용하지 않는 임의의 Port Number로 설정한다.

(당연히 환경변수로 JMX_PORT를 설정해도 된다.)

 

ex) JMX_PORT: 9876

 

2. KAFKA_OPTS에 JMX 활성화

Kafka Connect 설정 시 KAFKA_OPTS 환경변수를 통해 JMX를 활성화한다고 명시한다.

 

ex)

export KAFKA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9876"

 

 

 

3. JMX Exporter 설정

본 글은 Kafka Connect에 대해서 설명하지만 Kafka Streams, Kafka 등 다른 서비스에도 적용된다. 왜냐하면 Java 기반 Application이기 때문이다.

 

 

3.1. jmx_prometheus_javaagent 설치

Dockerfile로 Kafka Connect를 설정한다면 Dockerfile 내 특정 경로에 jmx_prometheus_javaagent를 다운로드받아야 할 것이고

Kubernetes로 운영한다면 Init Container에서 다운로드받을수도 있고, Base Image에 미리 설치해놓을수도 있다.

 

방법은 다양하니까 기호에 맞게 설치해두자.

 

 

3.2. jmx_exporter.yaml 설정 파일

: JMX Exporter는 YAML 형식으로 작서되며 설정 예시는 다음과 같다.

---
lowercaseOutputName: true
lowercaseOutputLabelNames: true
whitelistObjectNames: ["org.apache.kafka.connect:*"]
rules:
  - pattern: 'kafka.connect<type=(.+), connector=(.+), task=(.+)><>Value'
    name: 'kafka_connect_$1_$2_$3'
    labels: 
      connector: "$2"
      task: "$3"

 

 

주요 설정들은 다음과 같다.

 

lowercaseOutputName (기본값: false)
: 메트릭의 이름을 소문자로 변환한다.

 

lowercaseOutputLabelNames (기본값: false)
레이블 이름을 소문자로 변환한다.

 

whitelistObjectNames (기본값: [])
내보내려는 JMX 객체의 이름을 필터링하기 위한 정규 표현식 패턴 목록

 

blacklistObjectNames (기본값: [])
내보내지 않을 JMX 객체의 이름을 필터링하기 위한 정규 표현식 패턴 목록

 

rules (기본값: [])
메트릭 이름 및 레이블을 매핑하기 위한 규칙 목록입니다. 규칙은 패턴, 메트릭 이름, 레이블을 포함한다.

 

username 및 password
JMX 인증을 사용하는 경우에 지정하며, 인증 미설정할 경우 username, password는 기입하지 않아도 된다.

 

 

 

4. javaagent 옵션을 통해 jmx exporter 설정

 

ex)

KAFKA_JMX_OPTS: -javaagent:/opt/kafka/libs/jmx_prometheus_javaagent-0.19.0.jar=8080:/etc/kafka-connect/jmx_exporter.yaml -Dcom.sun.management.jmxremote.authenticate=false

 

 

/opt/kafka/libs/jmx_prometheus_javaagent-0.19.0.jar → 기 다운로드 받아둔 JAR 파일 명시

=8080 → [HOST]:EXPOSED_IP 명시 (HOST가 생략되었으므로 노출시킬 IP인 8080만 나옴)

/etc/kafka-connect/jmx_exporter.yaml → jmx_exporter 설정 파일 위치 명시

-Dcom.sun.management.jmxremote.authenticate=false → 인증 X

 

 

 

Kafka Connect - JMX Exporter 간단한 데모

Demo는 docker-compose 파일로 간단하게 테스트해본다.

 

 

version: '2'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    hostname: zookeeper
    container_name: zookeeper
    environment:
      ZOOKEEPER_SERVER_ID: 1
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
      ZOOKEEPER_INIT_LIMIT: 5
      ZOOKEEPER_SYNC_LIMIT: 2
    ports:
      - "22181:2181"

  kafka:
    image: confluentinc/cp-kafka:latest
    hostname: kafka
    container_name: kafka
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0

  connect:
    image: confluentinc/cp-kafka-connect:7.1.10
    hostname: connect
    container_name: connect
    depends_on:
      - zookeeper
      - kafka
    ports:
      - "8083:8083"
      - "8080:8080"
    environment:
      CONNECT_BOOTSTRAP_SERVERS: 'kafka:9092'
      CONNECT_REST_ADVERTISED_HOST_NAME: connect
      CONNECT_REST_PORT: 8083
      CONNECT_GROUP_ID: compose-connect-group
      CONNECT_CONFIG_STORAGE_TOPIC: docker-connect-configs
      CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR: 1
      CONNECT_OFFSET_STORAGE_TOPIC: docker-connect-offsets
      CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR: 1
      CONNECT_STATUS_STORAGE_TOPIC: docker-connect-status
      CONNECT_STATUS_STORAGE_REPLICATION_FACTOR: 1
      CONNECT_KEY_CONVERTER: org.apache.kafka.connect.json.JsonConverter
      CONNECT_VALUE_CONVERTER: org.apache.kafka.connect.json.JsonConverter
      CONNECT_INTERNAL_KEY_CONVERTER: org.apache.kafka.connect.json.JsonConverter
      CONNECT_INTERNAL_VALUE_CONVERTER: org.apache.kafka.connect.json.JsonConverter
      CONNECT_PLUGIN_PATH: "/usr/share/java,/etc/kafka-connect/jars"
      CONNECT_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      JMX_PORT: 9876
      KAFKA_JMX_OPTS: -javaagent:/opt/kafka/libs/jmx_prometheus_javaagent-0.19.0.jar=8080:/etc/kafka-connect/jmx_exporter.yaml -Dcom.sun.management.jmxremote.authenticate=false
    volumes:
      - ./plugins/confluentinc-kafka-connect-jdbc/lib:/etc/kafka-connect/jars
      - ./config/jmx_exporter/test-config.yaml:/etc/kafka-connect/jmx_exporter.yaml
      - ./libs/jmx_prometheus_javaagent-0.19.0.jar:/opt/kafka/libs/jmx_prometheus_javaagent-0.19.0.jar

 

 

 

 

 

위 과정들을 통해 Prometheus 호환 메트릭으로 손쉽게 모니터링을 수행할 수 있다.

 

이렇게 노출된 메트릭들은 Prometheus를 통해 Metric을 Scrape하고 Grafana를 통해 시각화까지 처리할 수 있게 된다.

 

 

반응형