Prometheus를 활용한 Kafka 컨슈머 Lag 모니터링
Kafka 환경에서 컨슈머(Consumer)가 메시지를 수신하지 못해 발생하는 지연(Lag)을 Prometheus Exporter를 통해 수집하고, 일정 임계치를 초과하면 Alert Center를 통해 알림을 발송합니다.
- 예상 소요 시간: 60분
- 권장 운영 체제: MacOS, Ubuntu
- 사전 준비 사항
시나리오 소개
본 튜토리얼은 Kafka 환경에서 컨슈머(Consumer)의 메시지 처리 지연(Lag)을 Prometheus와 Exporter를 활용해 모니터링하고, 임계치를 초과할 경우 Alert Center를 통해 메트릭 알림을 수신하는 방법을 단계별로 안내합니다.
이 시나리오의 주요 내용은 아래와 같습니다.
- Kafka Exporter 및 Prometheus Agent 설치
- Kafka Lag 메트릭 수집 및 확인
- Alert Center를 통한 임계치 초과 알림 설정
- Kafka Lag: Kafka Lag은 컨슈머가 아직 처리하지 못한 메시지의 수를 나타냅니다. 특정 컨슈머 그룹이 처리 중인 토픽에 대해 얼마나 지연이 있는지를 수치로 표현해, 시스템의 병목이나 장애를 감지하는 데 유용합니다.(
Lag = Kafka 파티션의 최신 오프셋 - 컨슈머 그룹이 커밋한 오프셋
) - Kafka Exporter: Kafka Exporter는 Kafka로부터 메트릭(Lag 포함)을 수집하여 Prometheus 형식으로 노출해주는 Exporter입니다.
카카오클라우드의 Advanced Managed Prometheus는 Kafka 클러스터에 직접 접근할 수 없기 때문에, Kafka가 실행 중인 VM 또는 동일 네트워크 내에 Prometheus Agent를 설치해 메트릭을 수집한 뒤 이를 Managed Prometheus로 전달하는 구조가 필요합니다.
시작하기 전에
이 튜토리얼을 진행하기에 앞서, 먼저 Kafka를 통한 메시지 처리 튜토리얼의 단계를 따라 Kakfa 메시지 송수신 처리가 가능한 상태를 구현해 주세요.
시작하기
Step 1. 컨슈머 그룹 생성
Kafka Exporter가 수집하는 Lag 지표(kafka_consumergroup_lag
)는 컨슈머 그룹 단위로 측정되며, 특정 컨슈머 그룹이 각 파티션을 어디까지 소비했는지를 기준으로 계산됩니다.
이 지표를 수집하기 위해 Kafka에 컨슈머 그룹을 먼저 생성합니다.
-
컨슈머 그룹 생성을 위해 아래 명령어를 실행합니다.
# Kafka 폴더로 이동
cd ~/kafka
# 컨슈머 그룹 생성
bin/kafka-console-consumer.sh --bootstrap-server ${BOOTSTRAP_SERVER} --topic ${TOPIC_NAME} --group ${GROUP_NAME} --from-beginning환경변수 설명 BOOTSTRAP_SERVER🖌︎ 카카오클라우드 콘솔에서 생성한 Kafka 클러스터의 부트스트랩 서버 TOPIC_NAME🖌︎ 사전 설정에서 생성한 Kafka 토픽 이름 GROUP_NAME🖌︎ 생성할 컨슈머 그룹 이름 지정 / 예시: lag-group
Step 2. Kafka Exporter 설치
Kafka에서 생성한 메트릭을 Prometheus가 수집할 수 있도록 kafka_exporter
를 설치하고 실행합니다.
-
Kafka Exporter를 설치하고 실행합니다.
# 설치 디렉터리 이동
cd ~/Downloads
# Kafka Exporter 설치
wget https://github.com/danielqsj/kafka_exporter/releases/download/v1.9.0/kafka_exporter-1.9.0.linux-amd64.tar.gz
tar -xvf kafka_exporter-1.9.0.linux-amd64.tar.gz
cd kafka_exporter-1.9.0.linux-amd64
# Kafka Exporter 실행
./kafka_exporter --kafka.server=${BROKER1} --kafka.server=${BROKER2} --log.level=info환경변수 설명 BROKER1🖌︎ 카카오클라우드 콘솔에서 생성한 Kafka 클러스터의 브로커 IP와 포트 입력 / 예시: 10.0.x.x:9092 BROKER2🖌︎ 카카오클라우드 콘솔에서 생성한 Kafka 클러스터의 브로커 IP와 포트 입력 / 예시: 10.0.x.x:9092 -
Kafka Exporter가 메트릭을 정상적으로 노출하는지 확인하기 위해 동일한 VM의 터미널에서 다음 명령어를 실행합니다.
curl http://localhost:9308/metrics | grep kafka_consumergroup_lag
Step 3. 로컬 Prometheus Agent 설치 및 설정
Kafka Exporter에서 노출한 메트릭을 수집하려면 Prometheus가 필요합니다. 아래 단계에 따라 로컬 Prometheus Agent를 설치하고 설정합니다.
로컬 Prometheus Agent 설치 전, 워크스페이스 생성 및 관리를 참고하여 카카오클라우드 콘솔에서 Advanced Managed Promethues 워크스페이스를 먼저 생성해 주세요.
-
Prometheus 설치를 위한 바이너리를 다운로드하고 압축을 해제합니다.
# 설치 디렉터리 이동
cd ~/kafka
# Prometheus 설치
wget https://github.com/prometheus/prometheus/releases/download/v2.33.1/prometheus-2.33.1.linux-amd64.tar.gz
tar xvfz prometheus-2.33.1.linux-amd64.tar.gz
cd prometheus-2.33.1.linux-amd64 -
Prometheus Agent 설정을 위한 YAML 파일을 생성하고 편집기를 엽니다.
mkdir -p /etc/prometheus
sudo vi /etc/prometheus/prometheus-agent.yaml -
생성한 YAML 파일에 수집 주기, 타깃 설정, Advanced Managed Prometheus 연동 정보를 입력한 후 저장합니다.
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'kafka_exporter'
static_configs:
- targets: ['localhost:9308']
remote_write:
- url: "${WRITE_ENDPOINT}"
headers:
Credential-ID: '${CREDENTIAL_ID}'
Credential-Secret: '${CREDENTIAL_SECRET}'환경변수 설명 WRITE_ENDPOINT🖌︎ 카카오클라우드 콘솔에서 생성한 워크스페이스의 Write 엔드포인트 CREDENTIAL_ID🖌︎ 사용자 액세스 키 ID CREDENTIAL_SECRET🖌︎ 사용자 보안 액세스 키 -
Prometheus 설치 디렉터리로 이동한 후, 설정 파일을 지정하여 Prometheus를 실행합니다.
cd ~/kafka/prometheus-2.33.1.linux-amd64
./prometheus --config.file=/etc/prometheus/prometheus-agent.yaml > prom.log 2>&1 & -
아래 명령어로 Prometheus가 실행 중인지 확인합니다.
curl http://localhost:9090
Step 4. Alert Center 알림 설정
Kafka Lag을 기준으로 메트릭 기반 알림 정책을 구성합니다.
알림 정책을 생성하려면 수신 채널이 최소 1개 이상 등록되어 있어야 합니다.
수신 채널 생성은 수신 채널 생성 및 관리를 참고하세요.
-
카카오클라우드 콘솔 > Mangement > Alert Center 메뉴로 이동합니다.
-
알림정책(프로젝트) 탭을 클릭 후 [알림 정책 생성] 버튼을 클릭합니다.
-
조건 유형에서 Advanced Managed Promethues를 선택합니다.
-
조건 설정에서 앞서 생성한 워크스페이스를 선택합니다.
-
아래 Alert 룰을 스크립트 작성 영역에 입력합니다.
groups:
- name: kafkaConsumergroupAlert
rules:
- alert: HighConsumergroupLag
expr: sum(kafka_consumergroup_lag) by (consumergroup, topic) >= 10
for: 1m
annotations:
summary: "Kafka Consumergroup Lag >= 10"
description: "consumer group: {{ $labels.consumergroup }} / topic: {{ $labels.topic }} / sum of lag: {{ $value }}" -
[다음] 버튼을 클릭하고, 메시지를 수신할 수신 채널을 선택합니다.
-
다시 [다음]을 클릭해 알림 정책의 이름을 입력합니다.
-
마지막으로 알림 정책 내용을 검토한 후 [생성] 버튼을 클릭해 정책 생성을 완료합니다.
Step 5. 알림 발생 테스트
Kafka Lag 조건이 충족되었을 때 알림이 정상적으로 발송되는지 검증합니다.
알림 설정이 제대로 작동하는지 확인하기 위해 컨슈머를 중지한 상태에서 프로듀서가 메시지를 전송하도록 하여 Lag 상황을 인위적으로 유도합니다.
-
컨슈머를 먼저 실행하여 메시지를 모두 소비한 뒤, 현재 Lag이 0인지 확인합니다.
cd ~/kafka
bin/kafka-console-consumer.sh \
--bootstrap-server ${BOOTSTARP_SERVER} \
--topic ${TOPIC_NAME} \
--group ${GROUP_NAME} \
--from-beginning환경변수 설명 BOOTSTARP_SERVER🖌︎ 카카오클라우드 콘솔에서 생성한 Kafka 클러스터의 부트스트랩 서버 TOPIC_NAME🖌︎ 사전 설정에서 생성한 Kafka 토픽 이름 GROUP_NAME🖌︎ 앞서 생성한 컨슈머 그룹 이름 / 예시: lag-group -
Ctrl+C로 컨슈머를 중지한 후, 새로운 메시지를 전송하여 Lag을 발생시킵니다.
cd ~/kafka
bin/kafka-console-producer.sh \
--bootstrap-server ${BOOTSTARP_SERVER} \
--topic ${TOPIC_NAME} \환경변수 설명 BOOTSTARP_SERVER🖌︎ 카카오클라우드 콘솔에서 생성한 Kafka 클러스터의 부트스트랩 서버 TOPIC_NAME🖌︎ 사전 설정에서 생성한 Kafka 토픽 이름 > test-1
> test-2
> test-3
...
> test-12 -
Alert 룰에서 지정한
for:1m
조건에 따라, Lag이 발생한 상태가 1분 이상 유지되어야 알림이 발송됩니다. 메시지를 전송한 후 1분이 지나 알림이 수신되는지 확인합니다.