모니터링
모니터링 (Monitoring)
이 페이지는 Kafka 브로커와 클라이언트(프로듀서·컨슈머·Connect·Streams)에서 실제로 쓸모 있는 지표(metric)들을 JMX로 확인하고, 그레이핑·알럿을 거는 방법을 정리해요. 지표 이름과 MBean 이름을 그대로 보존해 두었으니, 모니터링 대시보드를 만들 때 이 페이지를 바로 참고하면 돼요.
출처: 문서
본문
Kafka는 서버의 지표 보고에 Yammer Metrics를 사용합니다. Java 클라이언트는 클라이언트 애플리케이션에 끌어들여지는 전이 의존성을 최소화하는 내장 지표 레지스트리인 Kafka Metrics를 사용합니다. 둘 다 JMX로 지표를 노출하며, 플러그 가능한 통계 리포터를 사용해 여러분의 모니터링 시스템에 연결하도록 통계를 보고하도록 구성할 수 있습니다.
모든 Kafka rate 지표에는 접미사 -total이 붙은 대응하는 누적 개수 지표가 있습니다. 예를 들어 records-consumed-rate에는 records-consumed-total이라는 지표가 대응합니다.
가용한 지표를 보는 가장 쉬운 방법은 jconsole을 띄워 실행 중인 kafka 클라이언트나 서버를 가리키는 것입니다. 이렇게 하면 JMX로 모든 지표를 탐색할 수 있습니다.
JMX를 이용한 원격 모니터링의 보안 고려 사항 (Security Considerations for Remote Monitoring using JMX)
Apache Kafka는 기본적으로 원격 JMX를 비활성화합니다. CLI로 시작된 프로세스의 경우 환경 변수 JMX_PORT를 설정하거나, 표준 Java 시스템 속성으로 원격 JMX를 프로그래매틱하게 활성화해 JMX로 원격 모니터링을 활성화할 수 있습니다. 프로덕션 시나리오에서 원격 JMX를 활성화할 때는 인가되지 않은 사용자가 브로커·애플리케이션 그리고 이들이 실행되는 플랫폼을 모니터링하거나 제어하지 못하도록 보안을 활성화해야 합니다. Kafka에서 JMX의 인증은 기본적으로 비활성화되어 있으며, 프로덕션 배포를 위해 보안 구성을 오버라이드하려면 CLI로 시작된 프로세스에 대해 환경 변수 KAFKA_JMX_OPTS를 설정하거나 적절한 Java 시스템 속성을 설정해야 합니다. JMX 보안에 대한 자세한 내용은 JMX 기술을 이용한 모니터링·관리(Monitoring and Management Using JMX Technology)를 참고하세요.
우리는 다음 지표에 대해 그레이핑과 알럿팅을 수행합니다.
| 설명 | Mbean 이름 | 정상 값 |
|---|---|---|
| 메시지 유입률 | kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec,topic=([-.\w]+) | 토픽별 유입 메시지율. 'topic=(…)'을 생략하면 전체 토픽의 비율. |
| 클라이언트로부터의 바이트 유입률 | kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec,topic=([-.\w]+) | 토픽별 바이트 유입(클라이언트로부터) 비율. 'topic=(…)' 생략 시 전체 비율. |
| 다른 브로커로부터의 바이트 유입률 | kafka.server:type=BrokerTopicMetrics,name=ReplicationBytesInPerSec | 모든 토픽에 걸친 바이트 유입(다른 브로커로부터) 비율. |
| 브로커로부터의 컨트롤러 요청률 | kafka.controller:type=ControllerChannelManager,name=RequestRateAndQueueTimeMs,brokerId=([0-9]+) | ControllerChannelManager가 주어진 브로커의 큐에서 요청을 꺼내는 비율(초당 요청). 그리고 요청이 큐에서 꺼내지기 전까지 큐에 머무는 시간. |
| 컨트롤러 이벤트 큐 크기 | kafka.controller:type=ControllerEventManager,name=EventQueueSize | ControllerEventManager의 큐 크기. |
| 컨트롤러 이벤트 큐 시간 | kafka.controller:type=ControllerEventManager,name=EventQueueTimeMs | (Idle 이벤트를 제외한) 어떤 이벤트가 처리되기 전에 ControllerEventManager의 큐에서 기다리는 시간. |
| 요청률 | kafka.network:type=RequestMetrics,name=RequestsPerSec,request={Produce|FetchConsumer|FetchFollower},version=([0-9]+) | |
| 오류율 | kafka.network:type=RequestMetrics,name=ErrorsPerSec,request=([-.\w]+),error=([-.\w]+) | 요청 타입별, 오류 코드별로 셈된 응답의 오류 수. 응답에 여러 오류가 있으면 모두 셈. error=NONE은 성공 응답. |
| Produce 요청률 | kafka.server:type=BrokerTopicMetrics,name=TotalProduceRequestsPerSec,topic=([-.\w]+) | 토픽별 Produce 요청률. 'topic=(…)' 생략 시 전체 비율. |
| Fetch 요청률 | kafka.server:type=BrokerTopicMetrics,name=TotalFetchRequestsPerSec,topic=([-.\w]+) | 토픽별 Fetch 요청(클라이언트 또는 팔로워로부터) 비율. 'topic=(…)' 생략 시 전체 비율. |
| 실패한 Produce 요청률 | kafka.server:type=BrokerTopicMetrics,name=FailedProduceRequestsPerSec,topic=([-.\w]+) | 토픽별 실패한 Produce 요청률. 'topic=(…)' 생략 시 전체 비율. |
| 실패한 Fetch 요청률 | kafka.server:type=BrokerTopicMetrics,name=FailedFetchRequestsPerSec,topic=([-.\w]+) | 토픽별 실패한 Fetch 요청(클라이언트 또는 팔로워로부터) 비율. 'topic=(…)' 생략 시 전체 비율. |
| 요청 크기(바이트) | kafka.network:type=RequestMetrics,name=RequestBytes,request=([-.\w]+) | 각 요청 타입의 요청 크기. |
| 임시 메모리 크기(바이트) | kafka.network:type=RequestMetrics,name=TemporaryMemoryBytes,request={Produce|Fetch} | 메시지 형식 변환과 압축 해제에 사용되는 임시 메모리. |
| 메시지 변환 시간 | kafka.network:type=RequestMetrics,name=MessageConversionsTimeMs,request={Produce|Fetch} | 메시지 형식 변환에 소요된 밀리초. |
| 메시지 변환율 | kafka.server:type=BrokerTopicMetrics,name={Produce|Fetch}MessageConversionsPerSec,topic=([-.\w]+) | Produce 또는 Fetch 요청에 대한 토픽별 메시지 형식 변환율. 'topic=(…)' 생략 시 전체 비율. |
| 요청 큐 크기 | kafka.network:type=RequestChannel,name=RequestQueueSize | 요청 큐의 크기. |
| 클라이언트로의 바이트 유출률 | kafka.server:type=BrokerTopicMetrics,name=BytesOutPerSec,topic=([-.\w]+) | 토픽별 바이트 유출(클라이언트로) 비율. 'topic=(…)' 생략 시 전체 비율. |
| 다른 브로커로의 바이트 유출률 | kafka.server:type=BrokerTopicMetrics,name=ReplicationBytesOutPerSec | 모든 토픽에 걸친 바이트 유출(다른 브로커로) 비율. |
| 거부된 바이트율 | kafka.server:type=BrokerTopicMetrics,name=BytesRejectedPerSec,topic=([-.\w]+) | 레코드 배치 크기가 max.message.bytes 구성보다 커서 토픽별로 거부된 바이트율. 'topic=(…)' 생략 시 전체 비율. |
| 컴팩션 토픽에서 키가 없어 발생한 메시지 검증 실패율 | kafka.server:type=BrokerTopicMetrics,name=NoKeyCompactedTopicRecordsPerSec | 0 |
| 잘못된 magic number로 인한 메시지 검증 실패율 | kafka.server:type=BrokerTopicMetrics,name=InvalidMagicNumberRecordsPerSec | 0 |
| 잘못된 crc 체크섬으로 인한 메시지 검증 실패율 | kafka.server:type=BrokerTopicMetrics,name=InvalidMessageCrcRecordsPerSec | 0 |
| 배치의 비연속 오프셋·시퀀스 번호로 인한 메시지 검증 실패율 | kafka.server:type=BrokerTopicMetrics,name=InvalidOffsetOrSequenceRecordsPerSec | 0 |
| 로그 플러시율과 시간 | kafka.log:type=LogFlushStats,name=LogFlushRateAndTimeMs | |
| 오프라인 로그 디렉터리 수 | kafka.log:type=LogManager,name=OfflineLogDirectoryCount | 0 |
| 리더 선출율 | kafka.controller:type=ControllerStats,name=LeaderElectionRateAndTimeMs | 브로커 장애가 있을 때 0이 아님 |
| 언클린 리더 선출율 | kafka.controller:type=ControllerStats,name=UncleanLeaderElectionsPerSec | 0 |
| 적격 리더 복제본으로부터의 선출율 | kafka.controller:type=ControllerStats,name=ElectionFromEligibleLeaderReplicasPerSec | 0 |
| 브로커가 활성 컨트롤러인지 | kafka.controller:type=KafkaController,name=ActiveControllerCount | 클러스터에서 정확히 한 브로커만 1이어야 함 |
| 대기 중인 토픽 삭제 | kafka.controller:type=KafkaController,name=TopicsToDeleteCount | |
| 대기 중인 복제본 삭제 | kafka.controller:type=KafkaController,name=ReplicasToDeleteCount | |
| 부적격 대기 토픽 삭제 | kafka.controller:type=KafkaController,name=TopicsIneligibleToDeleteCount | |
| 부적격 대기 복제본 삭제 | kafka.controller:type=KafkaController,name=ReplicasIneligibleToDeleteCount | |
| 언더 복제 파티션 수 (|ISR| < |all replicas|) | kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions | 0 |
| 언더 minIsr 파티션 수 (|ISR| < min.insync.replicas) | kafka.server:type=ReplicaManager,name=UnderMinIsrPartitionCount | 0 |
| at minIsr 파티션 수 (|ISR| = min.insync.replicas) | kafka.server:type=ReplicaManager,name=AtMinIsrPartitionCount | 0 |
| 프로듀서 ID 개수 | kafka.server:type=ReplicaManager,name=ProducerIdCount | 브로커의 각 복제본에서 트랜잭션·멱등 프로듀서가 만든 모든 프로듀서 ID 수 |
| 파티션 수 | kafka.server:type=ReplicaManager,name=PartitionCount | 대부분 브로커 간에 고르게 분포 |
| 오프라인 복제본 수 | kafka.server:type=ReplicaManager,name=OfflineReplicaCount | 0 |
| 리더 복제본 수 | kafka.server:type=ReplicaManager,name=LeaderCount | 대부분 브로커 간에 고르게 분포 |
| ISR 축소율 | kafka.server:type=ReplicaManager,name=IsrShrinksPerSec | 브로커가 내려가면 일부 파티션의 ISR이 축소됨. 그 브로커가 다시 올라오면 복제본이 완전히 따라잡을 때 ISR이 확장됨. 그 외에는 ISR 축소율과 확장율 모두 기대값 0. |
| ISR 확장율 | kafka.server:type=ReplicaManager,name=IsrExpandsPerSec | 위 참고 |
| 실패한 ISR 업데이트율 | kafka.server:type=ReplicaManager,name=FailedIsrUpdatesPerSec | 0 |
| 팔로워와 리더 복제본 간 최대 메시지 랙 | kafka.server:type=ReplicaFetcherManager,name=MaxLag,clientId=Replica | 랙은 produce 요청의 최대 배치 크기에 비례해야 함 |
| 팔로워 복제본별 메시지 랙 | kafka.server:type=FetcherLagMetrics,name=ConsumerLag,clientId=([-.\w]+),topic=([-.\w]+),partition=([0-9]+) | 랙은 produce 요청의 최대 배치 크기에 비례해야 함 |
| 프로듀서 퍼거토리에서 대기 중인 요청 | kafka.server:type=DelayedOperationPurgatory,name=PurgatorySize,delayedOperation=Produce | ack=-1일 때 0이 아님 |
| fetch 퍼거토리에서 대기 중인 요청 | kafka.server:type=DelayedOperationPurgatory,name=PurgatorySize,delayedOperation=Fetch | 크기는 컨슈머의 fetch.wait.max.ms에 따라 다름 |
| 요청 총 시간 | kafka.network:type=RequestMetrics,name=TotalTimeMs,request={Produce|FetchConsumer|FetchFollower} | queue, local, remote, response send 시간으로 나뉨 |
| 요청이 요청 큐에서 대기하는 시간 | kafka.network:type=RequestMetrics,name=RequestQueueTimeMs,request={Produce|FetchConsumer|FetchFollower} | |
| 리더에서 요청이 처리되는 시간 | kafka.network:type=RequestMetrics,name=LocalTimeMs,request={Produce|FetchConsumer|FetchFollower} | |
| 요청이 팔로워를 기다리는 시간 | kafka.network:type=RequestMetrics,name=RemoteTimeMs,request={Produce|FetchConsumer|FetchFollower} | ack=-1의 produce 요청에서 0이 아님 |
| 요청이 응답 큐에서 대기하는 시간 | kafka.network:type=RequestMetrics,name=ResponseQueueTimeMs,request={Produce|FetchConsumer|FetchFollower} | |
| 응답을 보내는 시간 | kafka.network:type=RequestMetrics,name=ResponseSendTimeMs,request={Produce|FetchConsumer|FetchFollower} | |
| 컨슈머가 프로듀서보다 뒤처진 메시지 수. 브로커가 아닌 컨슈머가 게시. | kafka.consumer:type=consumer-fetch-manager-metrics,client-id={client-id} Attribute: records-lag-max | |
| 네트워크 프로세서가 유휴한 평균 시간 비율 | kafka.network:type=SocketServer,name=NetworkProcessorAvgIdlePercent | 0~1 사이, 이상적으로 > 0.3 |
| 클라이언트가 재인증하지 않고 만료 시간을 넘겨 다른 용도로 연결을 사용해 프로세서에서 끊긴 연결 수 | kafka.server:type=socket-server-metrics,listener=[SASL_PLAINTEXT|SASL_SSL],networkProcessor=<#>,name=expired-connections-killed-count | 재인증이 활성화될 때 이상적으로 0. 이는 더 이상 이전(2.2.0 이전) 클라이언트가 이 (listener, processor) 조합에 연결하지 않는다는 뜻 |
| 모든 프로세서에 걸쳐, 재인증하지 않고 만료 후 연결을 사용해 끊긴 총 연결 수 | kafka.network:type=SocketServer,name=ExpiredConnectionsKilledCount | 재인증이 활성화될 때 이상적으로 0. 더 이상 이전(2.2.0 이전) 클라이언트가 이 브로커에 연결하지 않음을 뜻함 |
| 요청 핸들러 스레드가 유휴한 평균 시간 비율 | kafka.server:type=KafkaRequestHandlerPool,name=RequestHandlerAvgIdlePercent | 0~1 사이, 이상적으로 > 0.3 |
| (user, client-id), user 또는 client-id별 대역폭 쿼터 지표 | kafka.server:type={Produce|Fetch},user=([-.\w]+),client-id=([-.\w]+) | 두 속성. throttle-time은 클라이언트가 스로틀된 밀리초, 이상적으로 0. byte-rate는 클라이언트의 데이터 produce/consume율(바이트/초). (user, client-id) 쿼터에서는 user와 client-id 모두 지정. 클라이언트에 per-client-id 쿼터가 적용되면 user는 지정되지 않음. per-user 쿼터가 적용되면 client-id는 지정되지 않음. |
| (user, client-id), user 또는 client-id별 요청 쿼터 지표 | kafka.server:type=Request,user=([-.\w]+),client-id=([-.\w]+) | 두 속성. throttle-time은 클라이언트가 스로틀된 밀리초, 이상적으로 0. request-time은 클라이언트 그룹의 요청을 처리하기 위해 브로커 네트워크·I/O 스레드에서 보낸 시간 비율. (user, client-id) 쿼터에서는 둘 다 지정. |
| 스로틀에서 면제된 요청 | kafka.server:type=Request | exempt-throttle-time은 스로틀에서 면제된 요청을 처리하기 위해 브로커 네트워크·I/O 스레드에서 보낸 시간 비율. |
| 그룹 메타데이터 로드 최대 시간 | kafka.server:type=group-coordinator-metrics,name=partition-load-time-max | 지난 30초 동안 로드된 컨슈머 오프셋 파티션에서 오프셋과 그룹 메타데이터를 로드하는 데 걸린 최대 시간(밀리초, 로딩 태스크 스케줄링 대기 시간 포함) |
| 그룹 메타데이터 로드 평균 시간 | kafka.server:type=group-coordinator-metrics,name=partition-load-time-avg | 지난 30초 동안 오프셋과 그룹 메타데이터를 로드하는 데 걸린 평균 시간 |
| 트랜잭션 메타데이터 로드 최대 시간 | kafka.server:type=transaction-coordinator-metrics,name=partition-load-time-max | 지난 30초 동안 트랜잭션 메타데이터를 로드하는 데 걸린 최대 시간 |
| 트랜잭션 메타데이터 로드 평균 시간 | kafka.server:type=transaction-coordinator-metrics,name=partition-load-time-avg | 지난 30초 동안 트랜잭션 메타데이터를 로드하는 데 걸린 평균 시간 |
| 트랜잭션 검증 오류율 | kafka.server:type=AddPartitionsToTxnManager,name=VerificationFailureRate | AddPartitionsToTxn API 응답 또는 AddPartitionsToTxnManager의 오류로 실패한 검증 비율. 정상 상태에서 0이지만, 트랜잭션 상태 파티션의 롤·재배치 중에는 일시적 오류가 예상됨 |
| 트랜잭션 요청 검증 시간 | kafka.server:type=AddPartitionsToTxnManager,name=VerificationTimeMs | 가능한 이전 요청이 in-flight인 동안의 큐잉 시간 더하기 트랜잭션 코디네이터로의 왕복 검증(또는 비검증) 시간 |
| 재배치 중인 파티션 수 | kafka.server:type=ReplicaManager,name=ReassigningPartitions | 브로커에서 리더 파티션을 재배치 중인 수 |
| 재배치 트래픽의 유출 바이트율 | kafka.server:type=BrokerTopicMetrics,name=ReassignmentBytesOutPerSec | 0; 파티션 재배치가 진행 중일 때 0이 아님 |
| 재배치 트래픽의 유입 바이트율 | kafka.server:type=BrokerTopicMetrics,name=ReassignmentBytesInPerSec | 0; 파티션 재배치가 진행 중일 때 0이 아님 |
| 디스크의 파티션 크기(바이트) | kafka.log:type=Log,name=Size,topic=([-.\w]+),partition=([0-9]+) | 디스크의 파티션 크기(바이트) |
| 파티션 크기의 보존 바이트 한도 대비 백분율 | kafka.log:type=Log,name=RetentionSizeInPercent,topic=([-.\w]+),partition=([0-9]+) | 구성된 retention.bytes 한도의 백분율로 표시된 파티션 크기. 티어드 스토리지가 활성화된 토픽(이때 지표는 RemoteLogManager가 보고)이거나 보존 바이트가 무제한이면 0을 반환. 보존 정리가 지연되면 100%를 초과할 수 있음 |
| 파티션의 로그 세그먼트 수 | kafka.log:type=Log,name=NumLogSegments,topic=([-.\w]+),partition=([0-9]+) | 파티션의 로그 세그먼트 수. |
| 파티션의 첫 오프셋 | kafka.log:type=Log,name=LogStartOffset,topic=([-.\w]+),partition=([0-9]+) | 파티션의 첫 오프셋. |
| 파티션의 마지막 오프셋 | kafka.log:type=Log,name=LogEndOffset,topic=([-.\w]+),partition=([0-9]+) | 파티션의 마지막 오프셋. |
| 남은 복구 로그 | kafka.log:type=LogManager,name=remainingLogsToRecover | 복구되어야 할 각 log.dir당 남은 로그 수. 이 지표는 주어진 로그 디렉터리에 대한 복구 진행 상황 개요를 제공. |
| 현재 복구 스레드에 대한 남은 세그먼트 | kafka.log:type=LogManager,name=remainingSegmentsToRecover | 현재 활성 복구 스레드에 할당된 남은 세그먼트 수. |
| 로그 디렉터리 오프라인 상태 | kafka.log:type=LogManager,name=LogDirectoryOffline | 로그 디렉터리가 오프라인(1)인지 온라인(0)인지 표시. |
그룹 코디네이터 모니터링 (Group Coordinator Monitoring)
그룹 코디네이터를 모니터링하기 위한 지표 집합은 다음과 같습니다.
| 설명 | Mbean 이름 |
|---|---|
| 상태별 파티션 수 | kafka.server:type=group-coordinator-metrics,name=num-partitions,state={loading|active|failed} — 브로커가 호스팅하는 __consumer_offsets 파티션 수를 상태별로 나눔 |
| 파티션 최대 로딩 시간 | kafka.server:type=group-coordinator-metrics,name=partition-load-time-max — __consumer_offsets 파티션에서 상태를 읽는 데 필요한 최대 로딩 시간 |
| 파티션 평균 로딩 시간 | kafka.server:type=group-coordinator-metrics,name=partition-load-time-avg — 평균 로딩 시간 |
| 스레드 평균 유휴 비율 | kafka.server:type=group-coordinator-metrics,name=thread-idle-ratio-avg — 코디네이터 스레드의 평균 유휴 비율 |
| 이벤트 큐 크기 | kafka.server:type=group-coordinator-metrics,name=event-queue-size — 큐에서 처리 대기 중인 이벤트 수 |
| 이벤트 큐 시간(ms) | kafka.server:type=group-coordinator-metrics,name=event-queue-time-ms-[max|p50|p95|p99|p999] — 이벤트가 큐에서 처리 대기한 시간 |
| 이벤트 처리 시간(ms) | kafka.server:type=group-coordinator-metrics,name=event-processing-time-ms-[max|p50|p95|p99|p999] — 이벤트를 처리하는 데 걸린 시간 |
| 이벤트 퍼거토리 시간(ms) | kafka.server:type=group-coordinator-metrics,name=event-purgatory-time-ms-[max|p50|p95|p99|p999] — 이벤트가 완료되기 전에 퍼거토리에서 대기한 시간 |
| 배치 대기 시간(ms) | kafka.server:type=group-coordinator-metrics,name=batch-linger-time-ms-[max|p50|p95|p99|p999] — 로컬 파티션에 플러시되기 전 배치의 유효 linger 시간 |
| 배치 플러시 시간(ms) | kafka.server:type=group-coordinator-metrics,name=batch-flush-time-ms-[max|p50|p95|p99|p999] — 배치를 로컬 파티션에 플러시하는 데 걸린 시간 |
| 배치 플러시율 | kafka.server:type=group-coordinator-metrics,name=batch-flush-rate — 초당 플러시된 배치 수 |
| 배치 버퍼 캐시 크기 | kafka.server:type=group-coordinator-metrics,name=batch-buffer-cache-size-bytes — 코디네이터 캐시에 보관 중인 append 버퍼의 총 바이트 크기 |
| 배치 버퍼 캐시 폐기 수 | kafka.server:type=group-coordinator-metrics,name=batch-buffer-cache-discard-count — 해제 시 폐기된 과대 크기 append 버퍼의 총 수 |
| 그룹 유형별 그룹 수 | kafka.server:type=group-coordinator-metrics,name=group-count,protocol={consumer|classic|streams} — 그룹 유형별(Classic, Consumer, Streams) 총 그룹 수 |
| 상태별 컨슈머 그룹 수 | kafka.server:type=group-coordinator-metrics,name=consumer-group-count,state=[empty|assigning|reconciling|stable|dead] — 각 상태(Empty, Assigning, Reconciling, Stable, Dead)의 컨슈머 그룹 수 |
| 컨슈머 그룹 리밸런스율 | kafka.server:type=group-coordinator-metrics,name=consumer-group-rebalance-rate — 컨슈머 그룹의 리밸런스율 |
| 컨슈머 그룹 리밸런스 수 | kafka.server:type=group-coordinator-metrics,name=consumer-group-rebalance-count — 총 컨슈머 그룹 리밸런스 수 |
| 상태별 스트림 그룹 수 | kafka.server:type=group-coordinator-metrics,name=streams-group-count,state=[empty|not_ready|assigning|reconciling|stable|dead] |
| 스트림 그룹 리밸런스율/수 | kafka.server:type=group-coordinator-metrics,name=streams-group-rebalance-rate / -count |
| 클래식 그룹 수 | kafka.server:type=GroupMetadataManager,name=NumGroups — 총 Classic 그룹 수 |
| 상태별 클래식 그룹 수 | kafka.server:type=GroupMetadataManager,name=NumGroups[PreparingRebalance,CompletingRebalance,Empty,Stable,Dead] |
| 클래식 그룹 완료 리밸런스율/수 | kafka.server:type=group-coordinator-metrics,name=group-completed-rebalance-rate / -count |
| 그룹 오프셋 수 | kafka.server:type=GroupMetadataManager,name=NumOffsets — Classic·Consumer 그룹의 총 커밋 오프셋 수 |
| 오프셋 커밋율/수 | kafka.server:type=group-coordinator-metrics,name=offset-commit-rate / -count |
| 오프셋 만료율/수 | kafka.server:type=group-coordinator-metrics,name=offset-expiration-rate / -count |
| 오프셋 삭제율/수 | kafka.server:type=group-coordinator-metrics,name=offset-deletion-rate / -count |
티어드 스토리지 모니터링 (Tiered Storage Monitoring)
티어드 스토리지 기능 모니터링을 위한 지표 집합은 다음과 같습니다.
| 메트릭/속성 이름 | 설명 |
|---|---|
| Remote Fetch Bytes Per Sec | 토픽별 원격 저장소에서 읽은 바이트율. 'topic=(…)' 생략 시 전체 비율 (kafka.server:type=BrokerTopicMetrics,name=RemoteFetchBytesPerSec,topic=([-.\w]+)) |
| Remote Fetch Requests Per Sec | 토픽별 원격 저장소 읽기 요청율 (name=RemoteFetchRequestsPerSec) |
| Remote Fetch Errors Per Sec | 토픽별 원격 저장소 읽기 오류율 (name=RemoteFetchErrorsPerSec) |
| Remote Copy Bytes Per Sec | 토픽별 원격 저장소로 복사된 바이트율 (name=RemoteCopyBytesPerSec) |
| Remote Copy Requests Per Sec | 토픽별 원격 저장소 쓰기 요청율 (name=RemoteCopyRequestsPerSec) |
| Remote Copy Errors Per Sec | 토픽별 원격 저장소 쓰기 오류율 (name=RemoteCopyErrorsPerSec) |
| Remote Copy Lag Bytes | 티어링 대상이지만 아직 원격 저장소에 없는 바이트 (name=RemoteCopyLagBytes) |
| Remote Copy Lag Segments | 티어링 대상이지만 아직 원격 저장소에 없는 세그먼트 (name=RemoteCopyLagSegments) |
| Remote Delete Requests Per Sec | 토픽별 원격 저장소 삭제 요청율 (name=RemoteDeleteRequestsPerSec) |
| Remote Delete Errors Per Sec | 토픽별 원격 저장소 삭제 오류율 (name=RemoteDeleteErrorsPerSec) |
| Remote Delete Lag Bytes | 삭제 대상이지만 아직 삭제되지 않은 티어드 바이트 (name=RemoteDeleteLagBytes) |
| Remote Delete Lag Segments | 삭제 대상이지만 아직 삭제되지 않은 티어드 세그먼트 (name=RemoteDeleteLagSegments) |
| Build Remote Log Aux State Requests/Errors Per Sec | 원격 저장소에서 보조 상태를 재구축하는 요청/오류율 (name=BuildRemoteLogAuxStateRequestsPerSec / BuildRemoteLogAuxStateErrorsPerSec) |
| Remote Log Size Computation Time | 원격 로그 크기 계산에 필요한 시간 (name=RemoteLogSizeComputationTime) |
| Remote Log Size Bytes | 원격 로그의 총 바이트 크기 (name=RemoteLogSizeBytes) |
| Remote Log Metadata Count | 원격 저장소의 총 메타데이터 엔트리 수 (name=RemoteLogMetadataCount) |
| Delayed Remote Fetch Expires Per Sec | 초당 만료된 원격 fetch 수 (kafka.server:type=DelayedRemoteFetchMetrics,name=ExpiresPerSec,topic=([-.\w]+)) |
| RemoteLogReader Task Queue Size | 원격 저장소 읽기 태스크를 담는 큐 크기 (org.apache.kafka.storage.internals.log:type=RemoteStorageThreadPool,name=RemoteLogReaderTaskQueueSize) |
| RemoteLogReader Avg Idle Percent | 원격 읽기 처리 스레드 풀의 평균 유휴 백분율 (name=RemoteLogReaderAvgIdlePercent) |
| RemoteLogManager Tasks Avg Idle Percent | 원격 저장소로 복사하는 스레드 풀의 평균 유휴 백분율 (kafka.log.remote:type=RemoteLogManager,name=RemoteLogManagerTasksAvgIdlePercent) |
| RemoteLogManager Avg/Max Broker Fetch Throttle Time | 브로커가 원격 fetch를 스로틀한 평균/최대 밀리초 (kafka.server:type=RemoteLogManager, name=remote-fetch-throttle-time-avg/-max) |
| RemoteLogManager Avg/Max Broker Copy Throttle Time | 브로커가 원격 복사를 스로틀한 평균/최대 밀리초 (name=remote-copy-throttle-time-avg/-max) |
| RemoteLogReader Fetch Rate And Time | 브로커가 원격 저장소에서 데이터를 읽는 시간 (kafka.log.remote:type=RemoteLogManager,name=RemoteLogReaderFetchRateAndTimeMs) |
| Retention Size In Percent | 구성된 retention.bytes 한도 대비 총 파티션 크기(로컬+원격) 백분율. 티어드 스토리지 토픽용 (kafka.log.remote:type=RemoteLogManager,name=RetentionSizeInPercent,topic,partition) |
| Local Retention Size In Percent | 구성된 local.retention.bytes 한도 대비 로컬 로그 크기 백분율 (name=LocalRetentionSizeInPercent) |
| Delayed Remote List Offsets Expires Per Sec | 초당 만료된 원격 list offsets 수 (kafka.server:type=DelayedRemoteListOffsetsMetrics,name=ExpiresPerSec,topic,partition) |
KRaft 모니터링 지표 (KRaft Monitoring Metrics)
KRaft 쿼럼과 메타데이터 로그를 모니터링할 수 있는 지표 집합입니다. 일부 노출 지표는 process.roles로 정의된 노드의 역할에 따라 다릅니다.
KRaft 쿼럼 모니터링 지표 (KRaft Quorum Monitoring Metrics)
이 지표들은 KRaft 클러스터의 컨트롤러와 브로커 모두에서 보고됩니다. (MBean: kafka.server:type=raft-metrics)
Current State— 이 멤버의 현재 상태. 가능한 값: leader, candidate, voted, follower, unattached, observer.Current Leader— 현재 쿼럼 리더의 id. -1은 알 수 없음을 의미.Current Voted— 현재 투표된 리더의 id. -1은 누구에게도 투표하지 않았음을 의미.Current Epoch— 현재 쿼럼 에포크.High Watermark— 이 멤버에서 유지되는 하이 워터마크. 알 수 없으면 -1.Log End Offset— 현재 raft 로그 끝 오프셋.Number of Unknown Voter Connections— 연결 정보가 캐시되지 않은 알려지지 않은 투표자 수. 항상 0.Average Commit Latency/Maximum Commit Latency— raft 로그 엔트리 커밋의 평균/최대 밀리초.Average Election Latency/Maximum Election Latency— 새 리더 선출에 소요된 평균/최대 밀리초.Fetch Records Rate— raft 쿼럼 리더에서 가져온 평균 레코드 수.Append Records Rate— raft 쿼럼 리더가 초당 추가한 평균 레코드 수.Average Poll Idle Ratio— Raft IO 스레드가 작업(요청 처리, 리더에서 복제 등) 대신 유휴한 시간 비율.Current Metadata Version— 현재 유효한 메타데이터 버전의 기능 수준 출력 (kafka.server:type=MetadataLoader,name=CurrentMetadataVersion).Metadata Snapshot Load Count— 프로세스 시작 후 KRaft 스냅샷을 로드한 총 횟수 (name=HandleLoadSnapshotCount).Latest Metadata Snapshot Size— 노드가 생성한 최신 스냅샷의 총 바이트 크기 (kafka.server:type=SnapshotEmitter,name=LatestSnapshotGeneratedBytes).Latest Metadata Snapshot Age— 노드가 최신 스냅샷을 생성한 이후 경과한 밀리초 (name=LatestSnapshotGeneratedAgeMs).
KRaft 컨트롤러 모니터링 지표 (KRaft Controller Monitoring Metrics)
Active Controller Count— 이 노드의 활성 컨트롤러 수. '0' 또는 '1' (kafka.controller:type=KafkaController,name=ActiveControllerCount)Event Queue Time Ms/Event Queue Processing Time Ms— 요청이 컨트롤러 이벤트 큐에서 대기/처리된 시간 히스토그램 (name=EventQueueTimeMs / EventQueueProcessingTimeMs)Fenced Broker Count/Active Broker Count— 이 컨트롤러가 관찰한 펜싱된/활성 브로커 수 (name=FencedBrokerCount / ActiveBrokerCount)Global Topic Count/Global Partition Count— 이 컨트롤러가 관찰한 전역 토픽/파티션 수 (name=GlobalTopicCount / GlobalPartitionCount)Offline Partition Count— 이 컨트롤러가 관찰한 오프라인(비내부) 토픽 파티션 수 (name=OfflinePartitionsCount)Preferred Replica Imbalance Count— 리더가 선호 리더가 아닌 토픽 파티션 수 (name=PreferredReplicaImbalanceCount)Metadata Error Count— 이 컨트롤러 노드가 메타데이터 로그 처리 중 오류를 만난 횟수 (name=MetadataErrorCount)Last Applied Record Offset— 컨트롤러가 적용한 클러스터 메타데이터 파티션의 마지막 레코드 오프셋 (name=LastAppliedRecordOffset)Last Committed Record Offset— 이 컨트롤러에 커밋된 마지막 레코드 오프셋 (name=LastCommittedRecordOffset)Last Applied Record Timestamp/Last Applied Record Lag Ms— 컨트롤러가 적용한 마지막 레코드의 타임스탬프 / 그 이후 경과 (name=LastAppliedRecordTimestamp / LastAppliedRecordLagMs). 활성 컨트롤러의 랙은 항상 0.Timed-out Broker Heartbeat Count— 프로세스 시작 후 이 컨트롤러에서 타임아웃된 브로커 하트비트 수 (name=TimedOutBrokerHeartbeatCount). 활성 컨트롤러만 하트비트를 처리.Number Of Operations Started In Event Queue— 시작된 컨트롤러 이벤트 큐 작업의 총 수. 지연(deferred) 작업 포함 (name=EventQueueOperationsStartedCount)Number of Operations Timed Out In Event Queue— 수행되기 전에 타임아웃된 컨트롤러 이벤트 큐 작업 수 (name=EventQueueOperationsTimedOutCount)Number Of New Controller Elections— 이 노드가 새 컨트롤러 선출을 본 횟수 (name=NewActiveControllersCount). "리더 없음" 상태로의 전환은 셈하지 않음.
KRaft 브로커 모니터링 지표 (KRaft Broker Monitoring Metrics) — kafka.server:type=broker-metadata-metrics
Last Applied Record Offset/Last Applied Record Timestamp/Last Applied Record Lag Ms— 브로커가 적용한 클러스터 메타데이터 파티션의 마지막 레코드 오프셋/타임스탬프/그 이후 경과.Metadata Load Error Count— BrokerMetadataListener가 메타데이터 로그를 로드하고 새 MetadataDelta를 생성하는 동안 만난 오류 수.Metadata Apply Error Count— BrokerMetadataPublisher가 최신 MetadataDelta 기반의 새 MetadataImage를 적용하는 동안 만난 오류 수.
프로듀서/컨슈머/Connect/Streams 공통 모니터링 지표 (Common monitoring metrics)
다음 지표들은 producer/consumer/connector/streams 인스턴스에서 사용 가능합니다. (MBean: kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+))
connection-close-rate/-total— 창 내 초당/총 닫힌 연결.connection-creation-rate/-total— 창 내 초당/총 새로 맺은 연결.network-io-rate/-total— 모든 연결에서 초당/총 네트워크 연산(읽기 또는 쓰기) 수.outgoing-byte-rate/-total— 모든 서버로 초당/총 보낸 유출 바이트.request-rate/-total— 초당/총 보낸 요청 수.request-size-avg/-max— 창 내 모든 요청의 평균/최대 크기.incoming-byte-rate/-total— 모든 소켓에서 초당/총 읽은 바이트.response-rate/-total— 초당/총 받은 응답.select-rate/-total— I/O 레이어가 수행할 새 I/O를 확인한 횟수 (초당/총).io-wait-time-ns-avg/-total— I/O 스레드가 읽기·쓰기 준비된 소켓을 기다린 평균/총 나노초.io-wait-ratio— I/O 스레드가 대기한 시간 비율.io-time-ns-avg/-total— select 호출당 평균/총 I/O 시간(나노초).io-ratio— I/O 스레드가 I/O에 쓴 시간 비율.connection-count— 현재 활성 연결 수.successful-authentication-rate/-total— SASL 또는 SSL로 성공 인증된 초당/총 연결.failed-authentication-rate/-total— 인증에 실패한 초당/총 연결.successful-reauthentication-rate/-total— SASL로 성공 재인증된 초당/총 연결.reauthentication-latency-max/-avg— 재인증으로 인한 최대/평균 지연시간(ms).failed-reauthentication-rate/-total— 재인증에 실패한 초당/총 연결.successful-authentication-no-reauth-total— 재인증을 지원하지 않는 이전(2.2.0 이전) SASL 클라이언트가 성공 인증된 총 연결.
공통 브로커별 지표 (Common Per-broker metrics) — kafka.[producer|consumer|connect]:type=[consumer|producer|connect]-node-metrics,client-id,node-id
outgoing-byte-rate/-total— 노드에 대한 초당/총 유출 바이트.request-rate/-total— 노드에 대한 초당/총 요청.request-size-avg/-max— 노드에 대한 창 내 요청 평균/최대 크기.incoming-byte-rate/-total— 노드에 대한 초당/총 수신 바이트.request-latency-avg/-max— 노드에 대한 평균/최대 요청 지연시간(ms).response-rate/-total— 노드에 대한 초당/총 응답.
프로듀서 모니터링 (Producer monitoring)
프로듀서 인스턴스에서 사용 가능한 지표입니다. (MBean: kafka.producer:type=producer-metrics,client-id)
waiting-threads— 버퍼 메모리를 기다리며 막힌 사용자 스레드 수.buffer-total-bytes— 클라이언트가 사용할 수 있는 최대 버퍼 메모리(현재 사용 여부와 무관).buffer-available-bytes— 사용되지 않는 총 버퍼 메모리(할당되지 않았거나 free list에 있음).buffer-exhausted-rate/-total— 버퍼 고갈로 버려진 초당/총 record send 수.bufferpool-wait-time/-ratio/-time-ns-total— appender가 공간 할당을 기다린 시간 비율/총 나노초.flush-time-ns-total— Producer.flush에서 보낸 총 나노초.txn-init-time-ns-total— 트랜잭션 초기화에 보낸 총 나노초(EOS용).txn-begin-time-ns-total— beginTransaction에 보낸 총 나노초(EOS용).txn-send-offsets-time-ns-total— 트랜잭션에 오프셋을 보내는 데 보낸 총 나노초(EOS용).txn-commit-time-ns-total/txn-abort-time-ns-total— 트랜잭션 커밋/중단에 보낸 총 나노초(EOS용).metadata-wait-time-ns-total— Kafka 브로커의 메타데이터를 기다린 총 나노초.
프로듀서 Sender 지표 (Producer Sender Metrics) — kafka.producer:type=producer-metrics,client-id="{client-id}"
batch-size-avg/-max— 파티션당 요청당 보낸 평균/최대 바이트 수.batch-split-rate/-total— 초당/총 배치 분할 수.compression-rate-avg— 레코드 배치의 평균 압축률(압축 배치 크기 / 비압축 크기).metadata-age— 사용 중인 현재 프로듀서 메타데이터의 경과(초).produce-throttle-time-avg/-max— 브로커가 요청을 스로틀한 평균/최대 밀리초.record-error-rate/-total— 오류를 일으킨 초당/총 record send 수.record-queue-time-avg/-max— 레코드 배치가 send 버퍼에 머문 평균/최대 밀리초.record-retry-rate/-total— 재시도된 초당/총 record send 수.record-send-rate/-total— 초당/총 보낸 레코드 수.record-size-avg/-max— 평균/최대 레코드 크기.records-per-request-avg— 요청당 평균 레코드 수.request-latency-avg/-max— 평균/최대 요청 지연시간(ms).requests-in-flight— 응답 대기 중인 현재 in-flight 요청 수.
토픽별 지표 (kafka.producer:type=producer-topic-metrics,client-id,topic): byte-rate/byte-total, compression-rate, record-error-rate/record-error-total, record-retry-rate/record-retry-total, record-send-rate/record-send-total — 각각 해당 토픽에 대한 것.
컨슈머 모니터링 (Consumer monitoring)
컨슈머 인스턴스에서 사용 가능한 지표입니다. (MBean: kafka.consumer:type=consumer-metrics,client-id)
time-between-poll-avg/-max— poll() 호출 사이의 평균/최대 지연.last-poll-seconds-ago— 마지막 poll() 호출 후 경과한 초.poll-idle-ratio-avg— 컨슈머의 poll()이 사용자 코드가 레코드를 처리하기를 기다리는 대신 유휴한 평균 시간 비율.committed-time-ns-total— committed에서 보낸 총 나노초.commit-sync-time-ns-total— 오프셋 커밋에 보낸 총 나노초(AOS용).
컨슈머 그룹 지표 (Consumer Group Metrics) — kafka.consumer:type=consumer-coordinator-metrics,client-id
commit-latency-avg/-max,commit-rate/-total— 커밋 요청의 평균/최대 시간, 초당/총 커밋 호출.assigned-partitions— 이 컨슈머에 현재 할당된 파티션 수.heartbeat-response-time-max— 하트비트 응답 수신 최대 시간.heartbeat-rate/-total— 초당/총 하트비트.join-time-avg/-max,join-rate/-total— 그룹 재합류의 평균/최대 시간, 초당/총 조인.sync-time-avg/-max,sync-rate/-total— 그룹 동기화의 평균/최대 시간, 초당/총 동기화.rebalance-latency-avg/-max/-total— 그룹 리밸런스의 평균/최대/총 시간.rebalance-total,rebalance-rate-per-hour— 참여한 총/시간당 리밸런스 수.failed-rebalance-total,failed-rebalance-rate-per-hour— 실패한 총/시간당 리밸런스.last-rebalance-seconds-ago— 마지막 리밸런스 후 경과 초.last-heartbeat-seconds-ago— 마지막 컨트롤러 하트비트 후 경과 초.partitions-revoked-latency-avg/-max— on-partitions-revoked 리밸런스 리스너 콜백의 평균/최대 시간.partitions-assigned-latency-avg/-max— on-partitions-assigned 리밸런스 리스너 콜백의 평균/최대 시간.partitions-lost-latency-avg/-max— on-partitions-lost 리밸런스 리스너 콜백의 평균/최대 시간.
컨슈머 Fetch 지표 (Consumer Fetch Metrics) — kafka.consumer:type=consumer-fetch-manager-metrics
클라이언트 수준: bytes-consumed-rate/-total, fetch-latency-avg/-max, fetch-rate, fetch-size-avg/-max, fetch-throttle-time-avg/-max, fetch-total, records-consumed-rate/-total, records-lag-max(현재 오프셋 기준, 커밋된 오프셋 아님), records-lead-min, records-per-request-avg.
토픽별/파티션별 지표: bytes-consumed-rate/-total, fetch-size-avg/-max, records-consumed-rate/-total, records-per-request-avg (client-id,topic), 그리고 preferred-read-replica, records-lag, records-lag-avg/-max, records-lead, records-lead-avg/-min (partition,topic,client-id). 참고: 마침표(.)가 있는 토픽 이름에 대해서는 밑줄로 대체된 추가 지표도 나오지만, 마침표를 대체한 지표는 폐기 예정이니 실제 토픽 이름을 쓰는 지표를 사용하세요.
Connect 모니터링 (Connect Monitoring)
Connect 워커 프로세스에는 모든 프로듀서·컨슈머 지표와 Connect 특화 지표가 포함됩니다. 워커 프로세스 자체에 여러 지표가 있고, 각 커넥터와 태스크에도 추가 지표가 있습니다. (MBean: kafka.connect:type=connect-worker-metrics)
connector-count— 이 워커에서 실행되는 커넥터 수.connector-startup-attempts-total,connector-startup-failure-percentage/-total,connector-startup-success-percentage/-total— 커넥터 시작 시도/실패/성공.task-count,task-startup-attempts-total,task-startup-failure-percentage/-total,task-startup-success-percentage/-total— 태스크 수/시작.- 커넥터별 태스크 상태 (
connector="{connector}"):connector-destroyed-task-count,connector-failed-task-count,connector-paused-task-count,connector-restarting-task-count,connector-running-task-count,connector-total-task-count,connector-unassigned-task-count. - 리밸런스 (kafka.connect:type=connect-worker-rebalance-metrics):
completed-rebalances-total,connect-protocol,epoch,leader-name,rebalance-avg-time-ms,rebalance-max-time-ms,rebalancing,time-since-last-rebalance-ms. - 커넥터 (kafka.connect:type=connector-metrics,connector):
connector-class,connector-type('source' 또는 'sink'),connector-version,status('unassigned', 'running', 'paused', 'stopped', 'failed', 'restarting'). - 프레디케이트 (connector-predicate-metrics):
predicate-class,predicate-version. - 태스크 (kafka.connect:type=connector-task-metrics,connector,task):
batch-size-avg/-max,connector-class/-type/-version,header-converter-class/-version,key-converter-class/-version,offset-commit-avg-time-ms,offset-commit-failure-percentage,offset-commit-max-time-ms,offset-commit-success-percentage,pause-ratio,running-ratio,status,task-class,task-version,value-converter-class/-version. - 트랜스포메이션 (connector-transform-metrics):
transform-class,transform-version. - 싱크 태스크 (kafka.connect:type=sink-task-metrics,connector,task):
offset-commit-completion-rate/-total,offset-commit-seq-no,offset-commit-skip-rate/-total,partition-count,put-batch-avg-time-ms,put-batch-max-time-ms,sink-record-active-count/-avg/-max,sink-record-lag-max,sink-record-read-rate/-total,sink-record-send-rate/-total. - 소스 태스크 (kafka.connect:type=source-task-metrics,connector,task):
poll-batch-avg-time-ms,poll-batch-max-time-ms,source-record-active-count/-avg/-max,source-record-poll-rate/-total,source-record-write-rate/-total,transaction-size-avg/-max/-min. - 오류 (kafka.connect:type=task-error-metrics,connector,task):
deadletterqueue-produce-failures,deadletterqueue-produce-requests,last-error-timestamp,total-errors-logged,total-record-errors,total-record-failures,total-records-skipped,total-retries.
Streams 모니터링 (Streams Monitoring)
Kafka Streams 인스턴스는 모든 프로듀서·컨슈머 지표와 Streams 특화 지표를 포함합니다. 지표에는 info, debug, trace 세 가지 기록 수준이 있습니다.
지표는 4계층 계층 구조를 가집니다. 최상위에는 시작된 각 Kafka Streams 클라이언트에 대한 클라이언트 수준 지표가 있습니다. 각 클라이언트에는 고유한 지표를 가진 스트림 스레드가 있고, 각 스트림 스레드에는 고유한 지표를 가진 태스크가, 각 태스크에는 고유한 지표를 가진 프로세서 노드가 있습니다. 각 태스크에는 자체 지표를 가진 상태 저장소와 레코드 캐시도 있습니다.
수집할 지표를 지정하려면 다음 구성 옵션을 사용하세요.
metrics.recording.level="info"
클라이언트 지표 (Client Metrics) — kafka.streams:type=stream-metrics,client-id (기록 수준: info)
version, commit-id, application-id, topology-description, state(문자열), client-state(숫자, enum의 ordinal()), alive-stream-threads, failed-stream-threads, recording-level(0=INFO, 1=DEBUG, 2=TRACE).
스레드 지표 (Thread Metrics) — kafka.streams:type=stream-thread-metrics,thread-id (기록 수준: info)
state, thread-state, commit-latency-avg/-max, poll-latency-avg/-max, process-latency-avg/-max, punctuate-latency-avg/-max, commit-ratio, commit-rate/-total, poll-ratio, poll-rate/-total, poll-records-avg/-max, process-ratio, process-rate/-total, process-records-avg/-max, punctuate-ratio, punctuate-rate/-total, task-created-rate/-total, task-closed-rate/-total, blocked-time-ns-total, thread-start-time, tasks-revoked-latency-avg/-max, tasks-assigned-latency-avg/-max, tasks-lost-latency-avg/-max.
태스크 지표 (Task Metrics) — kafka.streams:type=stream-task-metrics,thread-id,task-id (기록 수준: debug, 단 dropped-records-*와 active-process-ratio는 info)
process-latency-avg/-max, process-rate/-total, punctuate-latency-avg/-max, punctuate-total, punctuate-rate, record-lateness-avg/-max, enforced-processing-rate/-total, dropped-records-rate/-total, active-process-ratio, active-buffer-count, input-buffer-bytes-total, cache-size-bytes-total, record-rate/-total(복원), update-rate/-total.
프로세서 노드 지표 (Processor Node Metrics)
process-* 지표는 소스 프로세서 노드에서만, suppression-emit-*는 suppression 연산 노드에서만, emit-final-*는 윈도우 집계 노드에서만, record-e2e-latency-*는 소스 프로세서 노드와 터미널 노드에서만 사용 가능합니다. (기록 수준: debug, 단 record-e2e-latency-*는 info) — kafka.streams:type=stream-processor-node-metrics / stream-topic-metrics
bytes-consumed-total, bytes-produced-total, process-rate/-total, suppression-emit-rate/-total, emit-final-latency-max/-avg, emit-final-records-rate/-total, record-e2e-latency-avg/-max/-min, records-consumed-total, records-produced-total, Idempotent-update-skip-rate/-total.
상태 저장소 지표 (State Store Metrics)
store-scope 값은 사용자 커스텀 상태 저장소에 대해 StoreSupplier#metricsScope()로 지정됩니다. 내장 상태 저장소는 현재 in-memory-state, in-memory-lru-state, in-memory-window-state, in-memory-suppression(suppression 버퍼용), rocksdb-state, rocksdb-window-state, rocksdb-session-state가 있습니다. (기록 수준: debug, 단 record-e2e-latency-*, num-open-iterators, num-keys는 info) — kafka.streams:type=stream-state-metrics,thread-id,task-id,[store-scope]-id
put-latency-avg/-max, put-if-absent-latency-avg/-max, get-latency-avg/-max, delete-latency-avg/-max, put-all-latency-avg/-max, all-latency-avg/-max, range-latency-avg/-max, prefix-scan-latency-avg/-max, flush-latency-avg/-max(폐기 예정, commit-latency-* 사용), commit-latency-avg/-max, restore-latency-avg/-max, put-rate, put-if-absent-rate, get-rate, delete-rate, put-all-rate, all-rate, range-rate, prefix-scan-rate, flush-rate(폐기 예정), commit-rate, restore-rate, suppression-buffer-size-avg/-max, suppression-buffer-count-avg/-max, record-e2e-latency-avg/-max/-min, num-open-iterators, num-keys(인메모리 상태 저장소만), iterator-duration-avg/-max, oldest-iterator-open-since-ms.
RocksDB 지표 (RocksDB Metrics)
RocksDB 지표는 통계 기반 지표와 속성 기반 지표로 나뉩니다. (내장 store-scope: rocksdb-state, rocksdb-window-state, rocksdb-session-state)
통계 기반 지표(기록 수준 debug, 매분 수집): bytes-written-rate/-total, bytes-read-rate/-total, memtable-bytes-flushed-rate/-total, memtable-hit-ratio, memtable-flush-time-avg/-min/-max, block-cache-data-hit-ratio, block-cache-index-hit-ratio, block-cache-filter-hit-ratio, write-stall-duration-avg/-total, bytes-read-compaction-rate, bytes-written-compaction-rate, compaction-time-avg/-min/-max, number-open-files(RocksDB 9.7.3에서 NO_FILE_CLOSES 제거로 항상 -1), number-file-errors-total.
속성 기반 지표(기록 수준 info): num-immutable-mem-table, cur-size-active-mem-table, cur-size-all-mem-tables, size-all-mem-tables, num-entries-active-mem-table, num-entries-imm-mem-tables, num-deletes-active-mem-table, num-deletes-imm-mem-tables, mem-table-flush-pending, num-running-flushes, compaction-pending, num-running-compactions, estimate-pending-compaction-bytes, total-sst-files-size, live-sst-files-size, num-live-versions, block-cache-capacity, block-cache-usage, block-cache-pinned-usage, estimate-num-keys, estimate-table-readers-mem, background-errors.
레코드 캐시 지표 (Record Cache Metrics) — kafka.streams:type=stream-record-cache-metrics (기록 수준 debug)
hit-ratio-avg/-min/-max — 캐시 읽기 적중 수 / 총 캐시 읽기 요청 수.
공유 그룹 모니터링 (Share Group Monitoring)
공유 그룹 모니터링을 위한 지표 집합입니다.
TotalShareFetchRequestsPerSec(name=TotalShareFetchRequestsPerSec) — 초당 fetch 요청률.FailedShareFetchRequestsPerSec— 실패한 fetch 요청률.TotalShareAcknowledgementRequestsPerSec— 초당 확인 요청률.FailedShareAcknowledgementRequestsPerSec— 실패한 확인 요청률.RecordAcknowledgementsPerSec(akType={Accept|Release|Reject|Renew}) — 확인 유형별 초당 확인된 레코드 수.PartitionLoadTimeMs— 공유 파티션 로드에 걸린 시간.RequestTopicPartitionsFetchRatio(group) — 획득된 토픽-파티션 / 공유 fetch 요청의 총 토픽-파티션 비율.TopicPartitionsAcquireTimeMs(group) — fetch용 토픽 파티션 획득에 걸린 경과(밀리초).AcquisitionLockTimeoutPerSec(group,topic,partition) — 타임아웃 내에 확인되지 않은 레코드의 획득 잠금 비율.InFlightMessageCount,InFlightBatchCount,InFlightBatchMessageCount— 공유 파티션의 in-flight 메시지/배치 수.FetchLockTimeMs,FetchLockRatio— 공유 파티션이 잠금 아래로 잡혀 있는 시간/비율.ShareSessionEvictionsPerSec,SharePartitionsCount,ShareSessionsCount(ShareSessionCache).NumDelayedOperations (ShareFetch),PurgatorySize (ShareFetch)(DelayedOperationPurgatory, delayedOperation=ShareFetch),ExpiresPerSec(DelayedShareFetchMetrics).
코디네이터 지표 (Coordinator Metrics) — kafka.server:type=share-coordinator-metrics
group-count(protocol=share), share-group-rebalance-rate/-count, partition-load-time-max/-avg, thread-idle-ratio-min/-avg, write-rate/-total, write-latency-avg/-max, num-partitions(state={loading|active|failed}), last-pruned-offset, batch-buffer-cache-size-bytes, batch-buffer-cache-discard-count.
클라이언트 지표 (Client Metrics) — 공유 컨슈머 인스턴스
last-poll-seconds-ago, time-between-poll-avg/-max, poll-idle-ratio-avg (consumer-share-metrics), heartbeat-response-time-max, heartbeat-rate/-total, last-heartbeat-seconds-ago, rebalance-total, rebalance-rate-per-hour (consumer-share-coordinator-metrics), fetch-size-avg/-max, records-per-request-avg/-max, bytes-consumed-rate/-total, records-consumed-rate/-total, acknowledgements-send-rate/-total, acknowledgements-error-rate/-total, fetch-latency-avg/-max, fetch-rate, fetch-total, fetch-throttle-time-avg/-max (consumer-share-fetch-manager-metrics).
기타 (Others)
GC 시간과 기타 통계, CPU 사용률, I/O 서비스 시간 등 다양한 서버 통계를 모니터링하는 것을 권장합니다. 클라이언트 측에서는 메시지/바이트율(전역 및 토픽별), 요청율/크기/시간을, 컨슈머 측에서는 모든 파티션 중 최대 랙(메시지 수)과 최소 fetch 요청률을 모니터링할 것을 권장합니다. 컨슈머가 따라잡으려면 최대 랙이 임계값보다 작아야 하고 최소 fetch율이 0보다 커야 합니다.
더 알아보기 (Learn more)
- 지표 이름은 대응하는
-total누적 지표와 함께 보는 게 좋아요. - 원격 JMX는 프로덕션에서 반드시 보안을 켜야 해요.
- KRaft 쿼럼 상태는 raft-metrics와 컨트롤러 지표로 확인할 수 있어요.