주요 메트릭

Kafka 클러스터를 효과적으로 모니터링하기 위한 핵심 메트릭을 살펴봅니다.

메트릭 개요

메트릭 분류

┌─────────────────────────────────────────────────────────────────┐
│                     Kafka Metrics Categories                     │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │                    Broker Metrics                        │   │
│  │  - 클러스터 상태, 처리량, 파티션 상태                      │   │
│  └─────────────────────────────────────────────────────────┘   │
│                            │                                    │
│  ┌────────────────────────┴────────────────────────┐           │
│  │                                                  │           │
│  ▼                                                  ▼           │
│  ┌─────────────────────┐      ┌─────────────────────┐          │
│  │  Producer Metrics   │      │  Consumer Metrics   │          │
│  │  - 전송률, 지연시간   │      │  - 처리량, Lag       │          │
│  │  - 실패율, 배치 크기  │      │  - Rebalance 빈도    │          │
│  └─────────────────────┘      └─────────────────────┘          │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

Broker 메트릭

클러스터 상태 메트릭

메트릭MBean설명정상 범위
ActiveControllerCountkafka.controller:type=KafkaController,name=ActiveControllerCount활성 컨트롤러 수1
OfflinePartitionsCountkafka.controller:type=KafkaController,name=OfflinePartitionsCount오프라인 파티션 수0
UnderReplicatedPartitionskafka.server:type=ReplicaManager,name=UnderReplicatedPartitionsUnder-replicated 파티션0
UnderMinIsrPartitionCountkafka.server:type=ReplicaManager,name=UnderMinIsrPartitionCountISR 부족 파티션0

처리량 메트릭

# Broker 수준 처리량
kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec
kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec
kafka.server:type=BrokerTopicMetrics,name=BytesOutPerSec

# Topic 수준 처리량
kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec,topic=<topic>
kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec,topic=<topic>
kafka.server:type=BrokerTopicMetrics,name=BytesOutPerSec,topic=<topic>

요청 처리 메트릭

메트릭설명경고 임계값
RequestsPerSec초당 요청 수-
TotalTimeMs총 요청 처리 시간-
RequestQueueTimeMs요청 큐 대기 시간> 5ms
LocalTimeMs로컬 처리 시간-
RemoteTimeMs원격 처리 시간 (복제)> 100ms
ResponseQueueTimeMs응답 큐 대기 시간> 5ms
ResponseSendTimeMs응답 전송 시간-
# 요청 타입별 메트릭
kafka.network:type=RequestMetrics,name=TotalTimeMs,request=Produce
kafka.network:type=RequestMetrics,name=TotalTimeMs,request=FetchConsumer
kafka.network:type=RequestMetrics,name=TotalTimeMs,request=FetchFollower

네트워크 메트릭

# 네트워크 프로세서 유휴율
kafka.network:type=SocketServer,name=NetworkProcessorAvgIdlePercent

# 요청 핸들러 유휴율
kafka.server:type=KafkaRequestHandlerPool,name=RequestHandlerAvgIdlePercent

# 권장: 유휴율 > 30%

로그 메트릭

# 로그 플러시 레이트
kafka.log:type=LogFlushStats,name=LogFlushRateAndTimeMs

# 로그 세그먼트 수
kafka.log:type=Log,name=NumLogSegments,topic=<topic>,partition=<partition>

# 로그 크기
kafka.log:type=Log,name=Size,topic=<topic>,partition=<partition>

Producer 메트릭

핵심 메트릭

메트릭MBean설명
record-send-ratekafka.producer:type=producer-metrics,client-id=*초당 전송 레코드 수
record-send-totalkafka.producer:type=producer-metrics,client-id=*총 전송 레코드 수
byte-ratekafka.producer:type=producer-metrics,client-id=*초당 전송 바이트
record-error-ratekafka.producer:type=producer-metrics,client-id=*초당 에러 레코드 수
record-retry-ratekafka.producer:type=producer-metrics,client-id=*초당 재시도 수

지연 시간 메트릭

# 레코드 전송 지연 (Producer 내부)
kafka.producer:type=producer-metrics,client-id=*
├── record-queue-time-avg    # 배치 대기 시간
├── record-queue-time-max    # 최대 대기 시간
├── request-latency-avg      # 평균 요청 지연
└── request-latency-max      # 최대 요청 지연

배치 메트릭

kafka.producer:type=producer-metrics,client-id=*
├── batch-size-avg           # 평균 배치 크기
├── batch-size-max           # 최대 배치 크기
├── records-per-request-avg  # 요청당 평균 레코드 수
└── compression-rate-avg     # 압축률

버퍼 메트릭

kafka.producer:type=producer-metrics,client-id=*
├── buffer-total-bytes       # 총 버퍼 크기
├── buffer-available-bytes   # 사용 가능 버퍼
├── bufferpool-wait-time-ns  # 버퍼 대기 시간
└── waiting-threads          # 대기 중인 스레드 수

스로틀링 메트릭

kafka.producer:type=producer-metrics,client-id=*
├── produce-throttle-time-avg  # 평균 스로틀 시간
└── produce-throttle-time-max  # 최대 스로틀 시간

# 0보다 크면 Quota 제한 중

Consumer 메트릭

핵심 메트릭

메트릭MBean설명
records-consumed-ratekafka.consumer:type=consumer-fetch-manager-metrics초당 소비 레코드
bytes-consumed-ratekafka.consumer:type=consumer-fetch-manager-metrics초당 소비 바이트
records-lagkafka.consumer:type=consumer-fetch-manager-metrics현재 Lag
records-lag-maxkafka.consumer:type=consumer-fetch-manager-metrics최대 Lag

Consumer Lag 메트릭

# 파티션별 Lag
kafka.consumer:type=consumer-fetch-manager-metrics,
    client-id=*,topic=*,partition=*
├── records-lag              # 현재 Lag
├── records-lag-avg          # 평균 Lag
└── records-lag-max          # 최대 Lag

# Consumer Group 수준 Lag (Broker)
kafka.server:type=FetcherLagMetrics,name=ConsumerLag,
    clientId=*,topic=*,partition=*

Fetch 메트릭

kafka.consumer:type=consumer-fetch-manager-metrics,client-id=*
├── fetch-latency-avg        # 평균 Fetch 지연
├── fetch-latency-max        # 최대 Fetch 지연
├── fetch-rate               # Fetch 요청 비율
├── fetch-size-avg           # 평균 Fetch 크기
└── fetch-throttle-time-avg  # 스로틀 시간

Coordinator 메트릭

kafka.consumer:type=consumer-coordinator-metrics,client-id=*
├── assigned-partitions      # 할당된 파티션 수
├── commit-latency-avg       # 평균 커밋 지연
├── commit-latency-max       # 최대 커밋 지연
├── commit-rate              # 커밋 비율
├── join-rate                # Join 요청 비율
├── sync-rate                # Sync 요청 비율
├── heartbeat-rate           # Heartbeat 비율
└── last-rebalance-seconds-ago  # 마지막 Rebalance 경과 시간

Rebalance 메트릭

kafka.consumer:type=consumer-coordinator-metrics,client-id=*
├── rebalance-latency-avg    # 평균 Rebalance 시간
├── rebalance-latency-max    # 최대 Rebalance 시간
├── rebalance-latency-total  # 총 Rebalance 시간
├── rebalance-rate-per-hour  # 시간당 Rebalance 횟수
└── failed-rebalance-rate-per-hour  # 실패한 Rebalance

알림 설정 권장값

Critical (즉시 대응)

alerts:
  - name: OfflinePartitions
    condition: OfflinePartitionsCount > 0
    severity: critical
    action: 즉시 조사 필요
 
  - name: NoActiveController
    condition: sum(ActiveControllerCount) != 1
    severity: critical
    action: 클러스터 상태 확인
 
  - name: ConsumerLagCritical
    condition: records-lag-max > 100000
    severity: critical
    action: Consumer 성능 점검

Warning (주의 필요)

alerts:
  - name: UnderReplicatedPartitions
    condition: UnderReplicatedPartitions > 0 for 5m
    severity: warning
    action: 복제 지연 확인
 
  - name: HighRequestLatency
    condition: TotalTimeMs_99p > 1000
    severity: warning
    action: 요청 처리 성능 점검
 
  - name: LowIdlePercent
    condition: RequestHandlerAvgIdlePercent < 0.3
    severity: warning
    action: Broker 리소스 확인

Info (모니터링)

alerts:
  - name: HighProducerRetryRate
    condition: record-retry-rate > 0.1
    severity: info
    action: 네트워크/Broker 상태 확인
 
  - name: FrequentRebalance
    condition: rebalance-rate-per-hour > 5
    severity: info
    action: Consumer 안정성 검토

메트릭 수집 예제

JMX 쿼리

# jmxterm 사용
java -jar jmxterm.jar -l localhost:9999
 
# 특정 메트릭 조회
get -s -b kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec Count
 
# 모든 Broker 메트릭 조회
beans -d kafka.server

Java 코드

import javax.management.*;
import javax.management.remote.*;
 
public class KafkaMetricsCollector {
    public void collectMetrics() throws Exception {
        JMXServiceURL url = new JMXServiceURL(
            "service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi");
 
        try (JMXConnector connector = JMXConnectorFactory.connect(url)) {
            MBeanServerConnection mbs = connector.getMBeanServerConnection();
 
            // MessagesInPerSec
            ObjectName name = new ObjectName(
                "kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec");
            Double rate = (Double) mbs.getAttribute(name, "OneMinuteRate");
            System.out.println("Messages/sec: " + rate);
 
            // UnderReplicatedPartitions
            ObjectName urp = new ObjectName(
                "kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions");
            Integer count = (Integer) mbs.getAttribute(urp, "Value");
            System.out.println("Under-replicated: " + count);
        }
    }
}

Best Practices

1. 핵심 메트릭 우선

필수 모니터링:
1. OfflinePartitionsCount = 0
2. UnderReplicatedPartitions = 0
3. ActiveControllerCount = 1
4. Consumer Lag < 임계값
5. Request latency < SLA

2. 계층별 모니터링

인프라 계층: CPU, Memory, Disk I/O, Network
├── Broker 계층: 처리량, 파티션 상태, 요청 지연
│   ├── Producer 계층: 전송률, 에러율, 지연
│   └── Consumer 계층: 소비율, Lag, Rebalance
└── 애플리케이션 계층: 비즈니스 메트릭

3. 히스토리 보관

# 메트릭 보관 기간 권장
- 실시간: 15초 간격, 1시간 보관
- 단기: 1분 간격, 7일 보관
- 장기: 5분 간격, 90일 보관
- 용량 계획: 1시간 간격, 1년 보관

관련 문서