메세지큐
메세지큐
Kafka 메시지 큐 모니터링 기능을 사용하여 Producer, Consumer, 토픽, 파티션의 성능을 분석하는 방법을 안내합니다.
개요
Messaging Queues는 Apache Kafka 클러스터의 성능을 실시간으로 모니터링하고 분석하는 기능입니다. OpenTelemetry 트레이스와 메트릭을 기반으로 Producer-Consumer 간의 데이터 흐름을 시각화합니다.
주요 기능
| 기능 | 설명 |
|---|---|
| Consumer Lag 분석 | Consumer 그룹별 지연 현황 모니터링 |
| Producer Latency | Producer의 토픽별 지연시간 분석 |
| Partition Latency | 파티션별 처리 지연시간 분석 |
| Drop Rate 분석 | 메시지 드롭율 및 에러율 추적 |
| 메트릭 대시보드 | Kafka 브로커, JVM 성능 지표 시각화 |
Messaging Queues 접근
- 좌측 메뉴에서 Messaging Queues 클릭
- Kafka 탭 선택
화면 구성
Messaging Queues 메뉴는 4개의 주요 탭으로 구성됩니다:
| 탭 | 설명 |
|---|---|
| Kafka | Kafka 개요 및 주요 지표 |
| Kafka Detail | 상세 분석 (Consumer Lag, Producer, Partition 등) |
| Celery Task | Celery 작업 모니터링 |
| Overview | 전체 메시징 큐 개요 |
Consumer Lag 분석
Consumer Lag는 Producer가 토픽에 쓴 메시지와 Consumer가 읽은 메시지 간의 차이를 나타냅니다.
표시 정보
| 컬럼 | 설명 |
|---|---|
| Service Name | Consumer 서비스 이름 |
| P99 Latency | 99번째 백분위수 지연시간 (ms) |
| Error Rate | 에러 비율 (%) |
| Throughput | 초당 처리량 (msg/s) |
| Avg Message Size | 평균 메시지 크기 (bytes) |
사용되는 수식
Consumer 데이터 조회 시 다음 수식이 적용됩니다:
-- P99 지연시간 (밀리초)
quantile(0.99)(durationNano) / 1000000 AS p99
-- 에러율 (%)
COALESCE((error_count * 100.0) / total_requests, 0) AS error_rate
-- 처리량 (초당 요청 수)
COALESCE(total_requests / time_range, 0) AS throughput
-- 평균 메시지 크기
avg(attributes_number['messaging.message.body.size']) AS avg_msg_size필터링 조건
| 조건 | 값 | 설명 |
|---|---|---|
kind |
5 | Consumer span |
attribute_string_messaging$$system |
kafka | Kafka 시스템 식별 |
Producer Latency 분석
Producer가 Kafka 브로커에 메시지를 전송하는 데 걸리는 시간을 분석합니다.
표시 정보
| 컬럼 | 설명 |
|---|---|
| Topic | 토픽 이름 |
| Service Name | Producer 서비스 이름 |
| P99 Latency | 99번째 백분위수 지연시간 (ms) |
| Error Rate | 에러 비율 (%) |
| Throughput | 초당 처리량 (msg/s) |
사용되는 수식
-- P99 지연시간 (밀리초)
quantile(0.99)(durationNano) / 1000000 AS p99
-- 에러율 (%)
COALESCE((error_count * 100.0) / total_requests, 0) AS error_rate
-- 처리량 (초당 요청 수)
COALESCE(total_requests / time_range, 0) AS throughput필터링 조건
| 조건 | 값 | 설명 |
|---|---|---|
kind |
4 | Producer span |
attribute_string_messaging$$system |
kafka | Kafka 시스템 식별 |
Partition Latency 분석
토픽의 각 파티션별 지연시간과 처리량을 분석합니다.
표시 정보
| 컬럼 | 설명 |
|---|---|
| Topic | 토픽 이름 |
| Partition | 파티션 ID |
| P99 Latency | 99번째 백분위수 지연시간 (ms) |
| Throughput | 초당 처리량 (msg/s) |
사용되는 수식
-- 토픽 및 파티션 식별
attributes_string['messaging.destination.name'] AS topic
attributes_string['messaging.destination.partition.id'] AS partition
-- P99 지연시간 (밀리초)
quantile(0.99)(durationNano) / 1000000 AS p99
-- 처리량 (초당 요청 수)
COALESCE(total_requests / time_range, 0) AS throughputProducer-Consumer 평가
Producer와 Consumer 간의 메시지 전달 시간을 분석하여 SLA 위반 여부를 확인합니다.
표시 정보
| 컬럼 | 설명 |
|---|---|
| Producer Service | Producer 서비스 이름 |
| Consumer Service | Consumer 서비스 이름 |
| Total Spans | 총 스팬 수 |
| Breached Spans | SLA 위반 스팬 수 |
| Breach Percentage | SLA 위반 비율 (%) |
| Top Trace IDs | 위반 트레이스 ID 목록 (상위 10개) |
사용되는 수식
-- 메시지 전달 시간 계산
time_difference = (consumer_timestamp - producer_timestamp) + producer_duration
-- SLA 위반 비율 (%)
breach_percentage = (breached_spans * 100.0) / total_spans
-- SLA 위반 스팬 수
SUM(time_difference > eval_time) AS breached_spans네트워크 레이턴시 및 처리량
Consumer 클라이언트별 네트워크 처리량을 분석합니다.
표시 정보
| 컬럼 | 설명 |
|---|---|
| Client ID | Kafka 클라이언트 ID |
| Service Instance ID | 서비스 인스턴스 식별자 |
| Service Name | 서비스 이름 |
| Throughput | 초당 처리량 (msg/s) |
사용되는 수식
-- 클라이언트 식별
attributes_string['messaging.client_id'] AS client_id
resources_string['service.instance.id'] AS service_instance_id
-- 처리량 (초당 요청 수)
count(*) / time_range AS throughput메트릭 대시보드
Kafka 브로커, Producer, Consumer의 상세 메트릭을 시각화합니다. 메트릭 대시보드는 5개 섹션으로 구성됩니다.
Broker Metrics
Kafka 브로커의 핵심 성능 지표를 모니터링합니다.
1. Broker Count
Kafka 클러스터 내 활성 브로커 수를 표시합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | kafka.brokers |
| 집계 | sum |
| 설명 | Total number of active brokers in the Kafka cluster. |
쿼리:
A: sum(kafka.brokers)2. Request Times
Kafka 브로커의 평균 요청 지연시간을 측정합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | kafka.request.time.avg |
| 집계 | avg |
| 설명 | This metric is used to measure the average latency experienced by requests across the Kafka broker. |
쿼리:
A: avg(kafka.request.time.avg)3. Producer and Fetch Request Purgatory
브로커가 수신했지만 즉시 처리할 수 없는 요청 수를 측정합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | kafka.purgatory.size |
| 집계 | avg |
| 설명 | Measures the number of requests that Kafka brokers have received but cannot immediately fulfill |
쿼리:
A: avg(kafka.purgatory.size)4. Broker Network Throughput
브로커에서 Consumer로 전송되는 데이터 처리량을 측정합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | kafka_server_brokertopicmetrics_bytesoutpersec_oneminuterate |
| 집계 | avg |
| 설명 | Helps gauge the data throughput from the Kafka broker to consumer clients, focusing on the network usage associated with serving messages to consumers. |
쿼리:
A: avg(kafka_server_brokertopicmetrics_bytesoutpersec_oneminuterate)Producer Metrics
Kafka Producer의 성능 지표를 모니터링합니다.
1. I/O Wait Time
Producer의 I/O 대기 시간을 측정하여 데이터 전송 병목 현상을 파악합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | kafka.producer.io_waittime_total |
| 타입 | Sum |
| 집계 | rate |
| 설명 | This metric measures the total time that producers are in an I/O wait state, indicating potential bottlenecks in data transmission from producers to Kafka brokers. |
쿼리:
A: rate(kafka.producer.io_waittime_total)2. Request and Response Rate
Producer의 요청/응답 속도를 측정합니다. 하나의 그래프에 2개의 쿼리가 포함됩니다.
| 항목 | 값 |
|---|---|
| 메트릭 A | kafka.producer.request_rate |
| 메트릭 B | kafka.producer.response_rate |
| 집계 | avg |
| 설명 | Indicates how many requests the producer is sending per second, reflecting the intensity of the producer's interaction with the Kafka cluster. Also, helps Kafka administrators gauge the responsiveness of brokers to producer requests. |
쿼리:
A: avg(kafka.producer.request_rate) -- Request Rate
B: avg(kafka.producer.response_rate) -- Response Rate3. Average Request Latency
Producer 요청의 평균 지연시간을 측정합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | kafka.producer.request_latency_avg |
| 집계 | avg |
| 설명 | Helps Kafka administrators and developers understand the average latency experienced by producer requests. |
쿼리:
A: avg(kafka.producer.request_latency_avg)4. kafka.producer.byte_rate
토픽별 Producer의 데이터 출력 속도를 측정합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | kafka.producer.byte_rate |
| 집계 | avg |
| Group By | topic |
| 설명 | Helps measure the data output rate from the producer, indicating the load a producer is placing on Kafka brokers. |
쿼리:
A: avg(kafka.producer.byte_rate) by (topic)5. Bytes Consumed
Consumer 그룹의 데이터 소비율을 모니터링합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | kafka.consumer.bytes_consumed_rate |
| 집계 | avg |
| 설명 | Helps Kafka administrators monitor the data consumption rate of a consumer group, showing how much data (in bytes) is being read from the Kafka cluster over time. |
쿼리:
A: avg(kafka.consumer.bytes_consumed_rate)Consumer Metrics
Kafka Consumer의 성능 지표를 모니터링합니다.
1. Consumer Offset
각 Consumer 그룹의 토픽 파티션별 현재 오프셋을 표시합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | kafka.consumer_group.offset |
| 집계 | avg |
| Group By | group, topic, partition |
| 설명 | Current offset of each consumer group for each topic partition |
쿼리:
A: avg(kafka.consumer_group.offset) by (group, topic, partition)2. Consumer Group Members
각 Consumer 그룹의 활성 멤버 수를 표시합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | kafka.consumer_group.members |
| 집계 | sum |
| Group By | group |
| 설명 | Number of active users in each group |
쿼리:
A: sum(kafka.consumer_group.members) by (group)3. Consumer Lag by Group
Consumer 그룹별 랙(지연)을 측정하여 데이터 스트림을 따라가는지 확인합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | kafka.consumer_group.lag |
| 집계 | avg |
| Group By | group, topic, partition |
| 설명 | Helps Kafka administrators assess whether consumer groups are keeping up with the incoming data stream or falling behind |
쿼리:
A: avg(kafka.consumer_group.lag) by (group, topic, partition)4. Consumer Fetch Rate
Consumer가 브로커에 Fetch 요청을 보내는 속도를 측정합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | kafka.consumer.fetch_rate |
| 집계 | avg |
| Group By | service.name |
| 설명 | Metric measures the rate at which fetch requests are made by a Kafka consumer to the broker, typically in requests per second. |
쿼리:
A: avg(kafka.consumer.fetch_rate) by (service.name)5. Messages Consumed
Consumer가 초당 소비하는 레코드(메시지) 수를 측정합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | kafka.consumer.records_consumed_rate |
| 집계 | avg |
| 설명 | Measures the rate at which a Kafka consumer is consuming records (messages) per second from Kafka brokers. |
쿼리:
A: avg(kafka.consumer.records_consumed_rate)Broker JVM Metrics
Kafka 브로커의 JVM 성능 지표를 모니터링합니다.
1. JVM GC Count
JVM에서 발생한 GC 이벤트 횟수를 추적합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | jvm.gc.collections.count |
| 타입 | Sum |
| 집계 | rate |
| 설명 | Tracks the total number of garbage collection (GC) events that have occurred in the Java Virtual Machine (JVM). |
쿼리:
A: rate(jvm.gc.collections.count)2. jvm.gc.collections.elapsed
GC에 소요된 총 시간(밀리초)을 측정합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | jvm.gc.collections.elapsed |
| 타입 | Sum |
| 집계 | rate |
| 설명 | Measures the total time (usually in milliseconds) spent on garbage collection (GC) events in the Java Virtual Machine (JVM). |
쿼리:
A: rate(jvm.gc.collections.elapsed)3. CPU Recent Utilization
JVM의 최근 CPU 사용률(%)을 측정합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | jvm.cpu.recent_utilization |
| 집계 | avg |
| 설명 | This metric measures the recent CPU usage by the Java Virtual Machine (JVM), typically expressed as a percentage. |
쿼리:
A: avg(jvm.cpu.recent_utilization)4. JVM memory heap
JVM에 사용 가능한 최대 힙 메모리 크기를 표시합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | jvm.memory.heap.max |
| 집계 | avg |
| 설명 | The metric represents the maximum amount of heap memory available to the Java Virtual Machine (JVM) |
쿼리:
A: avg(jvm.memory.heap.max)Partition Metrics
Kafka 파티션의 상태와 오프셋 정보를 모니터링합니다.
1. Partition Count per Topic
토픽별 파티션 수를 표시합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | kafka.topic.partitions |
| 집계 | sum |
| Group By | topic |
| 설명 | Number of partitions for each topic |
쿼리:
A: sum(kafka.topic.partitions) by (topic)2. Current Offset ( Partition )
각 파티션의 현재 오프셋(최신 위치)을 표시합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | kafka.partition.current_offset |
| 집계 | avg |
| Group By | topic, partition |
| 설명 | Current offset of each partition, showing the latest position in each partition |
쿼리:
A: avg(kafka.partition.current_offset) by (topic, partition)3. Oldest Offset (Partition)
각 파티션의 가장 오래된 오프셋을 표시하여 로그 보존 상태를 확인합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | kafka.partition.oldest_offset |
| 집계 | avg |
| Group By | topic, partition |
| 설명 | Oldest offset of each partition to identify log retention and offset range. |
쿼리:
A: avg(kafka.partition.oldest_offset) by (topic, partition)4. In-Sync Replicas (ISR)
각 파티션의 동기화된 레플리카 수를 표시하여 데이터 가용성을 확인합니다.
| 항목 | 값 |
|---|---|
| 메트릭 | kafka.partition.replicas_in_sync |
| 집계 | avg |
| Group By | topic, partition |
| 설명 | Count of in-sync replicas for each partition to ensure data availability. |
쿼리:
A: avg(kafka.partition.replicas_in_sync) by (topic, partition)데이터 수집 요구사항
Kafka 모니터링을 위해 OpenTelemetry 계측이 필요합니다.
필수 트레이스 속성 (Producer)
| 속성 | 설명 |
|---|---|
messaging.system |
kafka |
messaging.destination.name |
토픽 이름 |
messaging.destination.partition.id |
파티션 ID |
span.kind |
PRODUCER (kind=4) |
필수 트레이스 속성 (Consumer)
| 속성 | 설명 |
|---|---|
messaging.system |
kafka |
messaging.destination.name |
토픽 이름 |
messaging.destination.partition.id |
파티션 ID |
messaging.kafka.consumer.group |
Consumer 그룹 이름 |
messaging.message.body.size |
메시지 크기 (선택) |
messaging.client_id |
클라이언트 ID (선택) |
span.kind |
CONSUMER (kind=5) |
권장 메트릭
Kafka JMX 메트릭을 OpenTelemetry로 수집:
# otel-collector-config.yaml
receivers:
jmx:
jar_path: /opt/opentelemetry-jmx-metrics.jar
endpoint: localhost:1099
target_system: kafka,jvm온보딩 검증
Kafka 데이터 수집 상태를 확인합니다.
Producer 온보딩 체크
| 항목 | 설명 |
|---|---|
| entries | 트레이스 데이터 존재 여부 |
| queue | kafka 시스템 식별자 존재 여부 |
| kind | Producer span (kind=4) 존재 여부 |
| destination | messaging.destination.name 속성 존재 여부 |
| partition | messaging.destination.partition.id 속성 존재 여부 |
Consumer 온보딩 체크
| 항목 | 설명 |
|---|---|
| entries | 트레이스 데이터 존재 여부 |
| queue | kafka 시스템 식별자 존재 여부 |
| kind | Consumer span (kind=5) 존재 여부 |
| svc | service.name 존재 여부 |
| destination | messaging.destination.name 속성 존재 여부 |
| partition | messaging.destination.partition.id 속성 존재 여부 |
| cgroup | messaging.kafka.consumer.group 속성 존재 여부 |
| bodysize | messaging.message.body.size 속성 존재 여부 |
| clientid | messaging.client_id 속성 존재 여부 |
| instanceid | service.instance.id 속성 존재 여부 |
필터링 및 시간 범위
시간 범위 선택
- 빠른 선택: 15분, 1시간, 6시간, 24시간, 7일
- 커스텀: 특정 시작/종료 시간 지정
필터 옵션
| 필터 | 설명 |
|---|---|
| Topic | 특정 토픽 선택 |
| Partition | 특정 파티션 선택 |
| Consumer Group | 특정 Consumer 그룹 선택 |
| Service Name | 특정 서비스 선택 |
알림 설정
Kafka 메트릭 기반 알림을 설정합니다.
Consumer Lag 알림
조건: kafka.consumer_group.lag > 10000 (5분 이상)
알림 채널: Slack #kafka-alerts에러율 알림
조건: error_rate > 5%
알림 채널: PagerDuty처리량 급감 알림
조건: throughput < 정상 대비 50% 감소
알림 채널: Email자세한 내용은 알림 문서를 참조하세요.
문제 해결
데이터가 표시되지 않음
- OpenTelemetry 계측이 올바르게 설정되었는지 확인
messaging.system속성이kafka로 설정되었는지 확인- 시간 범위가 올바른지 확인
- 온보딩 검증 실행하여 누락된 속성 확인
Consumer Lag가 높음
- Consumer 처리 속도 확인
- 파티션 수 대비 Consumer 수 확인
- Consumer 그룹 리밸런싱 여부 확인
- 네트워크 지연 확인
Producer 지연시간이 높음
- 브로커 응답 시간 확인
- 배치 설정 (batch.size, linger.ms) 검토
- 압축 설정 확인
- 네트워크 대역폭 확인
메트릭이 수집되지 않음
- JMX 익스포터 설정 확인
- OTel Collector 설정 확인:
receivers: jmx: jar_path: /opt/opentelemetry-jmx-metrics.jar endpoint: localhost:1099 target_system: kafka,jvm
다음 단계
- 메트릭 - PromQL을 사용한 고급 쿼리
- 대시보드 - 커스텀 Kafka 대시보드 생성
- 알림 - Kafka 알림 설정
- 트레이스 - 분산 트레이싱 상세 분석