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가 노출된 메트릭을 긁어가기면 하면 되기 때문이다.
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
위 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를 통해 시각화까지 처리할 수 있게 된다.
'Database' 카테고리의 다른 글
[Database] Vector DB Milvus 공식 문서 정리 (0) | 2024.04.22 |
---|---|
[DOIK 스터디 2기] Kafka 개념 및 Kafka 생태계 개념 정리 (0) | 2023.11.18 |
[DOIK 스터디 2기] Percona Operator for MongoDB 개념 및 실습 (3) | 2023.11.12 |
[DOIK 스터디 2기] CloudNativePG (PostgreSQL 오퍼레이터) 알아보기 및 간단한 실습 (2) | 2023.11.03 |
[DOIK 스터디 2기] MySQL Operator on Kubernetes를 이해하기 위한 MySQL, InnoDB Cluster 개념과 MySQL Operator 구조 (1) | 2023.10.28 |