토리맘의 한글라이즈 프로젝트 logo 토리맘의 한글라이즈 프로젝트

아파치 카프카 공식 레퍼런스를 한글로 번역한 문서입니다.

전체 목차는 여기에 있습니다.

목차


6.7 Monitoring

카프카는 Yammer Metrics를 사용해 서버의 메트릭을 리포트한다. 자바 클라이언트는 내장 메트릭 레지스트리 Kafka Metrics를 사용해 클라이언트 어플리케이션의 전이 의존성을 최소화한다. 둘 모두 JMX를 통해 메트릭을 노출하며, 연결할 리포터를 설정해서 모니터링 시스템 지표를 후킹해갈 수 있다.

카프카의 rate 메트릭은 모두 -total로 끝나는 누적 카운트 메트릭을 가진다. 예를 들어 records-consumed-rate에는 records-consumed-total이란 메트릭이 있다.

jconsole을 실행하고 실행 중인 카프카 클라이언트나 서버에 연결시키면 사용 가능한 메트릭을 가장 쉽게 확인해볼 수 있다. jconsole을 사용하면 JMX로 수집한 모든 메트릭을 둘러볼 수 있다.

Security Considerations for Remote Monitoring using JMX

기본적으로 아파치 카프카에선 원격 JMX를 비활성화한다. JMX를 통한 원격 모니터링은, CLI로 환경 변수 JMX_PORT를 설정한 뒤 프로세스를 시작하면 활성화되며, 프로그래밍 방식으로 원격 JMX를 활성화하려면, 표준 자바 시스템 프로퍼티를 사용하면 된다. 프로덕션 환경에서 원격 JMX를 활성화할 때는, 반드시 보안도 같이 활성화해서 권한이 없는 사용자가 브로커나 어플리케이션을 모니터링하거나 제어할 수 없도록 해야하며, 이를 실행하고 있는 플랫폼도 마찬가지다. 카프카에서는 기본적으로 JMX에 대한 인증은 비활성화돼 있으며, 프로덕션 환경을 배포할 땐, 환경 변수 KAFKA_JMX_OPTS를 설정하고 CLI 프로세스를 시작하거나, 적절한 자바 시스템 프로퍼티를 설정해서 보안 설정을 재정의해야 한다. JMX 보안에 대한 자세한 내용은 JMX 기술을 사용한 모니터링과 관리를 참고해라.

우리는 다음 메트릭을 시각화하고 알림을 걸어두고 있다:

DESCRIPTION MBEAN NAME NORMAL VALUE
메세지 유입 속도 kafka.server:type=BrokerTopicMetrics,
name=MessagesInPerSec
 
초당 클라이언트에서 유입되는 바이트 kafka.server:type=BrokerTopicMetrics,
name=BytesInPerSec
 
초당 다른 브로커에서 유입되는 바이트 kafka.server:type=BrokerTopicMetrics,
name=ReplicationBytesInPerSec
 
요청율 kafka.network:type=RequestMetrics,
name=RequestsPerSec,
request={Produce|
FetchConsumer|FetchFollower}
 
에러율 kafka.network:type=RequestMetrics,
name=ErrorsPerSec,
request=([-.\w]+),error=([-.\w]+)
요청 타입별, 에러 코드별로 수집한 에러 응답 수. 응답 하나에 에러가 여러 개 있다면 모두 카운트한다. error=NONE은 응답이 성공했음을 가리킨다.
요청 바이트 사이즈 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]+)
메세지 포맷 변환이 필요한 레코드를 요청한 수
요청 큐 사이즈 kafka.network:type=RequestChannel,
name=RequestQueueSize
요청 큐의 크기.
초당 클라이언트로 보내는 바이트 kafka.server:type=BrokerTopicMetrics,
name=BytesOutPerSec
 
초당 다른 브로커로 보내는 바이트 kafka.server:type=BrokerTopicMetrics,
name=ReplicationBytesOutPerSec
 
컴팩트 토픽에 키를 지정하지 않아 메세지 유효성 검사에 실패한 비율 kafka.server:type=BrokerTopicMetrics,
name=
NoKeyCompactedTopicRecordsPerSec
 
magic 넘버가 유효하지 않아 메세지 유효성 검증에 실패한 비율 kafka.server:type=BrokerTopicMetrics,
name=
InvalidMagicNumberRecordsPerSec
 
crc 체크섬이 정확하지 않아 메세지 유효성 검증에 실패한 비율 kafka.server:type=BrokerTopicMetrics,
name=
InvalidMessageCrcRecordsPerSec
 
배치 안에 있는 오프셋이나 시퀀스 번호가 연속되지 않아 메세지 유효성 검증에 실패한 비율 kafka.server:type=BrokerTopicMetrics,
name=
InvalidOffsetOrSequenceRecordsPerSec
 
로그 플러시 비율과 시간 kafka.log:type=LogFlushStats,
name=LogFlushRateAndTimeMs
 
레플리카가 부족한 파티션 수 (재할당 중이 아닌 레플리카 수 - ISR 수 > 0) kafka.server:type=ReplicaManager,
name=UnderReplicatedPartitions
0
최소 레플리카보다 적은 파티션 (|ISR| < min.insync.replicas) kafka.server:type=ReplicaManager,
name=UnderMinIsrPartitionCount
0
최소 레플리카만큼 있는 파티션 (|ISR| = min.insync.replicas) kafka.server:type=ReplicaManager,
name=AtMinIsrPartitionCount
0
오프라인 로그 디렉토리 수 kafka.log:type=LogManager,
name=OfflineLogDirectoryCount
0
브로커에 컨트롤러가 활성화돼 있는지 kafka.controller:type=KafkaController,
name=ActiveControllerCount
클러스터에서 브로커 하나만 1을 가진다.
리더 선출 비율 kafka.controller:type=ControllerStats,
name=LeaderElectionRateAndTimeMs
실패한 브로커가 있으면 0이 아니다.
Unclean 리더 선출 비율 kafka.controller:type=ControllerStats,
name=UncleanLeaderElectionsPerSec
0
삭제가 펜딩되고 있는 토픽 kafka.controller:type=KafkaController,
name=TopicsToDeleteCount
 
삭제가 펜딩되고 있는 레플리카 kafka.controller:type=KafkaController,
name=ReplicasToDeleteCount
 
일시적으로 삭제가 불가능해서 삭제가 펜딩되고 있는 토픽 kafka.controller:type=KafkaController,
name=TopicsIneligibleToDeleteCount
 
일시적으로 삭제가 불가능해서 삭제가 펜딩되고 있는 레플리카 kafka.controller:type=KafkaController,
name=ReplicasIneligibleToDeleteCount
 
파티션 수 kafka.server:type=ReplicaManager,
name=PartitionCount
보통은 브로커간에 균등하게 나눠져 있다.
리더 레플리카 수 kafka.server:type=ReplicaManager,
name=LeaderCount
보통은 브로커간에 균등하게 나눠져 있다.
ISR 감소율 kafka.server:type=ReplicaManager,
name=IsrShrinksPerSec
브로커가 다운되면 일부 파티션에 대한 ISR이 줄어든다. 다운됐던 브로커가 다시 살아나면, 레플리카가 완전히 따라잡았을 때 ISR이 증가한다. 다운된 경우 외에는 ISR 감소, 증가율 모두 0일 거다.
ISR 증가율 kafka.server:type=ReplicaManager,
name=IsrExpandsPerSec
위를 참고.
팔로워와 리더 레플리카 사이 최대 메세지 랙 kafka.server:type=ReplicaFetcherManager,
name=MaxLag,clientId=Replica
랙은 프로듀스 요청의 최대 배치 사이즈 비례한다.
팔로워 레플리카당 메세지 랙 kafka.server:type=FetcherLagMetrics,
name=ConsumerLag,clientId=([-.\w]+),
topic=([-.\w]+),partition=([0-9]+)
랙은 프로듀스 요청의 최대 배치 사이즈 비례한다.
프로듀서 purgatory에서 기다리고 있는 요청 kafka.server:type=
DelayedOperationPurgatory,
name=PurgatorySize,
delayedOperation=Produce
ack=-1을 사용하면 0이 아니다.
fetch purgatory에서 기다리고 있는 요청 kafka.server:type=
DelayedOperationPurgatory,
name=PurgatorySize,
delayedOperation=Fetch
컨슈머의 fetch.wait.max.ms 설정에 따라 달라진다.
요청을 처리하는 데 걸린 전체 시간 kafka.network:type=RequestMetrics,
name=TotalTimeMs,request=
{Produce|FetchConsumer|FetchFollower}
큐, 로컬, 원격, 응답 전송 시간으로 나뉜다.
요청이 요청 큐에서 대기하는 시간 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이면, 프로듀스 요청에선 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 이전 버전은 없다는 뜻이다.
커넥션이 만료됐는데, 클라이언트가 재인증을 하지 않고, 다른 요청을 보내 모든 프로세서에서 연결이 끊어진 전체 커넥션 수 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은 클라이언트가 스로틀링된 시간을 ms로 나타낸다. 이상적인 값은 0이다. byte-rate는 클라이언트의 데이터 프로듀스/컨슘 속도를 bytes/sec로 나타난다. (user, client-id) 할당량에선, user와 client-id를 모두 지정한다. 클라이언트에 client-id 단위로 할당량을 적용했다면, user는 지정하지 않는다. user 단위 할당량을 적용했다면 client-id를 지정하지 않는다.
(user, client-id)나, user 또는 client-id 당 요청 할당량 관련 지표 kafka.server:type=Request,
user=([-.\w]+),
client-id=([-.\w]+)
두 가지 속성이 있다. throttle-time은 클라이언트가 스로틀링된 시간을 ms로 나타낸다. 이상적인 값은 0이다. request-time은 브로커가 클라이언트 그룹의 요청을 처리하기 위해 네트워크와 I/O 스레드에서 소요한 시간의 백분율을 나타낸다. (user, client-id) 할당량에선, user와 client-id를 모두 지정한다. 클라이언트에 client-id 단위로 할당량을 적용했다면, user는 지정하지 않는다. user 단위 할당량을 적용했다면 client-id를 지정하지 않는다.
스로틀링에서 벗어난 요청 kafka.server:type=Request exempt-throttle-time은 스로틀링에서 벗어난 요청을 처리하기 위해 브로커 네트워크, I/O 스레드에서 소요한 시간의 백분율을 나타낸다.
주키퍼 클라이언트 요청 지연 시간 kafka.server:type=ZooKeeperClientMetrics,
name=ZooKeeperRequestLatencyMs
브로커가 주키퍼에 보낸 요청의 지연 시간 (밀리세컨드).
주키퍼 커넥션 상태 kafka.server:type=SessionExpireListener,
name=SessionState
주키퍼 세션의 연결 상태.
다음 중 하나일 수 있다:
Disconnected|SyncConnected
|AuthFailed|ConnectedReadOnly
|SaslAuthenticated|Expired.
그룹 메타데이터를 로드하는데 걸린 최대 시간 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=GroupMetadataManager,
name=NumOffsets
컨슈머 그룹의 커밋된 오프셋의 총 갯수
컨슈머 그룹 카운트 kafka.server:type=GroupMetadataManager,
name=NumGroups
컨슈머 그룹의 총 갯수
상태별 컨슈머 그룹 카운트 kafka.server:type=GroupMetadataManager,
name=NumGroups[PreparingRebalance,
CompletingRebalance,Empty,Stable,Dead]
상태별 컨슈머 그룹 수: PreparingRebalance, CompletingRebalance,
Empty, Stable, Dead
재할당 중인 파티션 수 kafka.server:type=ReplicaManager,
name=ReassigningPartitions
브로커에서 재할당 중인 리더 파티션 수
재할당 트래픽으로 나가고 있는 바이트 속도 kafka.server:type=BrokerTopicMetrics,
name=ReassignmentBytesOutPerSec
 
재할당 트래픽으로 유입중인 바이트 속도 kafka.server:type=BrokerTopicMetrics,
name=ReassignmentBytesInPerSec
 

Common monitoring metrics for producer/consumer/connect/streams

다음 메트릭은 프로듀서/컨슈머/커넥터/스트림즈 인스턴스에서 사용할 수 있다. 전용 메트릭은 아래 섹션들을 참고해라.

METRIC/ATTRIBUTE NAME DESCRIPTION MBEAN NAME
connection-close-rate 윈도우 내에서 닫힌 초당 커넥션 수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
connection-close-total 윈도우 내에서 닫힌 전체 커넥션. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
connection-creation-rate 윈도우 내에서 새로 구축한 초당 커넥션 수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
connection-creation-total 윈도우 내에서 새로 구축한 전체 커넥션. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
network-io-rate 모든 커넥션의 초당 평균 네트워크 작업(읽기/쓰기) 수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
network-io-total 모든 커넥션의 네트워크 작업(읽기/쓰기) 총 갯수 kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
outgoing-byte-rate 모든 서버로 보내는 초당 평균 바이트 수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
outgoing-byte-total 모든 서버로 보내는 총 바이트 수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
request-rate 초당 전송한 평균 요청 수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
request-total 전송한 요청의 총 갯수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
request-size-avg 윈도우 내에 있는 모든 요청의 평균 크기. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
request-size-max 윈도우 내에서 전송한 모든 요청의 최대 사이즈. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
incoming-byte-rate 모든 소켓에서 읽은 초당 바이트. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
incoming-byte-total 모든 소켓에서 읽은 총 바이트. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
response-rate 초당 수신한 응답. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
response-total 수신한 응답의 총 갯수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
select-rate I/O 계층이 새로 수행할 I/O를 확인한 초당 횟수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
select-total I/O 계층이 새로 수행할 I/O를 확인한 총 횟수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
io-wait-time-ns-avg I/O 스레드가 소켓이 읽기나 쓰기를 준비하길 기다리는데 소요한 평균 시간 (나노세컨드). kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
io-wait-ratio I/O 스레드가 대기하는데 소비한 시간 비율 kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
io-time-ns-avg select 호출 당 I/O에 걸린 평균 시간 (나노세컨드). kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
io-ratio I/O 스레드가 I/O를 수행하는데 소비한 시간 비율. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
connection-count 현재 활성 커넥션 수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
successful-authentication-rate SASL나 SSL로 인증에 성공한 초당 커넥션 수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
successful-authentication-total SASL나 SSL로 인증에 성공한 커넥션의 총 갯수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
failed-authentication-rate 초당 인증에 실패한 커넥션 수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
failed-authentication-total 인증에 실패한 커넥션의 총 갯수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
successful-reauthentication-rate SASL로 재인증에 성공한 초당 커넥션 수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
successful-reauthentication-total SASL로 재인증에 성공한 커넥션의 총 갯수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
reauthentication-latency-max 재인증에서 발생한 최대 지연 시간 (ms). kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
reauthentication-latency-avg 재인증에서 발생한 평균 지연 시간 (ms). kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
failed-reauthentication-rate 초당 재인증에 실패한 커넥션 수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
failed-reauthentication-total 재인증에 실패한 커넥션의 총 갯수. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)
successful-authentication-no-reauth-total 재인증을 지원하지 않는 2.2.0 이전 버전 SASL 클라이언트에서 인증에 성공한 총 커넥션 수. 계속 0이 아닐 수도 있다. kafka.[producer|consumer|connect]:type=[producer|consumer|connect]-metrics,client-id=([-.\w]+)

Common Per-broker metrics for producer/consumer/connect/streams

다음 메트릭은 프로듀서/컨슈머/커넥터/스트림즈 인스턴스에서 사용할 수 있다. 전용 메트릭은 아래 섹션들을 참고해라.

METRIC/ATTRIBUTE NAME DESCRIPTION MBEAN NAME
outgoing-byte-rate 노드 하나로 전송하는 초당 평균 바이트 수. kafka.[producer|consumer|connect]:type=[consumer|producer|connect]-node-metrics,client-id=([-.\w]+),node-id=([0-9]+)
outgoing-byte-total 노드 하나로 보내는 총 바이트 수. kafka.[producer|consumer|connect]:type=[consumer|producer|connect]-node-metrics,client-id=([-.\w]+),node-id=([0-9]+)
request-rate 초당 노드 하나로 전송한 평균 요청 수. kafka.[producer|consumer|connect]:type=[consumer|producer|connect]-node-metrics,client-id=([-.\w]+),node-id=([0-9]+)
request-total 노드 하나로 전송한 요청의 총 갯수. kafka.[producer|consumer|connect]:type=[consumer|producer|connect]-node-metrics,client-id=([-.\w]+),node-id=([0-9]+)
request-size-avg 윈도우 내에서 노드 하나로 전송한 모든 요청의 평균 크기. kafka.[producer|consumer|connect]:type=[consumer|producer|connect]-node-metrics,client-id=([-.\w]+),node-id=([0-9]+)
request-size-max 윈도우 내에서 노드 하나로 전송한 모든 요청의 최대 사이즈. kafka.[producer|consumer|connect]:type=[consumer|producer|connect]-node-metrics,client-id=([-.\w]+),node-id=([0-9]+)
incoming-byte-rate 노드 하나에서 받은 초당 평균 바이트. kafka.[producer|consumer|connect]:type=[consumer|producer|connect]-node-metrics,client-id=([-.\w]+),node-id=([0-9]+)
incoming-byte-total 노드 하나에서 받은 총 바이트. kafka.[producer|consumer|connect]:type=[consumer|producer|connect]-node-metrics,client-id=([-.\w]+),node-id=([0-9]+)
request-latency-avg 노드의 평균 요청 지연시간 (ms). kafka.[producer|consumer|connect]:type=[consumer|producer|connect]-node-metrics,client-id=([-.\w]+),node-id=([0-9]+)
request-latency-max 노드의 최대 요청 지연시간 (ms). kafka.[producer|consumer|connect]:type=[consumer|producer|connect]-node-metrics,client-id=([-.\w]+),node-id=([0-9]+)
response-rate 초당 노드 하나에서 받은 응답. kafka.[producer|consumer|connect]:type=[consumer|producer|connect]-node-metrics,client-id=([-.\w]+),node-id=([0-9]+)
response-total 노드 하나에서 받은 응답의 총 갯수. kafka.[producer|consumer|connect]:type=[consumer|producer|connect]-node-metrics,client-id=([-.\w]+),node-id=([0-9]+)

Producer monitoring

프로듀서 인스턴스엔 다음과 같은 메트릭이 있다.

METRIC/ATTRIBUTE NAME DESCRIPTION MBEAN NAME
waiting-threads 레코드가 버퍼 메모리 큐에 들어가길 기다리고 있는 블로킹된 사용자 스레드 수. kafka.producer:type=producer-metrics,client-id=([-.\w]+)
buffer-total-bytes 클라이언트가 사용할 수 있는 버퍼 메모리 최대치 (현재 사용 중인지 아니와는 상관 없이). kafka.producer:type=producer-metrics,client-id=([-.\w]+)
buffer-available-bytes 사용 중이 아닌 버퍼 메모리의 총량 (할당되지 않았거나, free 리스트에 있는). kafka.producer:type=producer-metrics,client-id=([-.\w]+)
bufferpool-wait-time 어펜더가 공간 할당을 기다리는 시간. kafka.producer:type=producer-metrics,client-id=([-.\w]+)

Producer Sender Metrics

kafka.producer:type=producer-metrics,client-id=”{client-id}”
ATTRIBUTE NAME DESCRIPTION
batch-size-avg 요청 당 파티션 당 전송한 평균 바이트 수.
batch-size-max 요청 당 파티션 당 전송한 최대 바이트 수.
batch-split-rate 초당 평균 배치 분할 수.
batch-split-total 총 배치 분할 횟수.
compression-rate-avg 압축 전후 대비 배치 크기의 평균 비율로 정의한, 레코드 배치의 평균 압축률.
metadata-age 현재 사용 중인 프로듀서 메타데이터의 수명 (초 단위).
produce-throttle-time-avg 브로커가 요청을 스로틀링한 평균 시간 (ms).
produce-throttle-time-max 브로커가 요청을 스로틀링한 최대 시간 (ms).
record-error-rate 레코드 전송 중 오류가 발생한 초당 평균 횟수.
record-error-total 레코드 전송 중 오류가 발생한 총 횟수.
record-queue-time-avg 레코드 배치가 전송 버퍼에서 보낸 평균 시간 (ms).
record-queue-time-max 레코드 배치가 전송 버퍼에서 보낸 최대 시간 (ms).
record-retry-rate 레코드 전송을 재시도한 초당 평균 횟수.
record-retry-total 레코드 전송을 재시도한 총 횟수.
record-send-rate 초당 전송한 평균 레코드 수.
record-send-total 전송한 레코드의 총 갯수.
record-size-avg 평균 레코드 사이즈.
record-size-max 레코드 최대 크기.
records-per-request-avg 요청 당 평균 레코드 수.
request-latency-avg 평균 요청 지연 시간 (ms).
request-latency-max 최대 요청 지연 시간 (ms).
requests-in-flight 응답을 기다리는, 현재 진행 중인 요청 수.
kafka.producer:type=producer-topic-metrics,client-id=”{client-id}”,topic=”{topic}”
ATTRIBUTE NAME DESCRIPTION
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

컨슈머 인스턴스엔 다음과 같은 메트릭이 있다.

METRIC/ATTRIBUTE NAME DESCRIPTION MBEAN NAME
time-between-poll-avg 평균 poll() 호출 간격. kafka.consumer:type=consumer-metrics,client-id=([-.\w]+)
time-between-poll-max poll() 호출 사이 최대 지연. kafka.consumer:type=consumer-metrics,client-id=([-.\w]+)
last-poll-seconds-ago 마지막으로 poll()을 호출하고 난 뒤 지난 시간 (초 단위). kafka.consumer:type=consumer-metrics,client-id=([-.\w]+)
poll-idle-ratio-avg 사용자 코드가 레코드를 처리하길 기다리는 상황과 상반되는, 컨슈머의 poll()이 유휴 상태인 평균 시간. kafka.consumer:type=consumer-metrics,client-id=([-.\w]+)

Consumer Group Metrics

METRIC/ATTRIBUTE NAME DESCRIPTION MBEAN NAME
commit-latency-avg 커밋 요청에 소요된 평균 시간. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
commit-latency-max 커밋 요청에 소요된 최대 시간. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
commit-rate 초당 커밋을 호출한 횟수. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
commit-total 커밋을 호출한 총 횟수. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
assigned-partitions 현재 이 컨슈머에 할당된 파티션 수. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
heartbeat-response-time-max 하트비트 요청에 대한 응답을 받는데 걸린 최대 시간 kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
heartbeat-rate 초당 평균 하트비트 수. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
heartbeat-total 총 하트비트 수. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
join-time-avg 그룹에 다시 참여하는 데 소요된 평균 시간. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
join-time-max 그룹에 다시 참여하는 데 소요된 최대 시간. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
join-rate 초 당 그룹 join 횟수. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
join-total 총 그룹 join 횟수. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
sync-time-avg 그룹 sync에 소요된 평균 시간. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
sync-time-max 그룹 sync에 소요한 최대 시간. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
sync-rate 초당 그룹 sync 횟수. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
sync-total 총 그룹 sync 횟수. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
rebalance-latency-avg 그룹 리밸런스에 소요된 평균 시간. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
rebalance-latency-max 그룹 리밸런스에 소요한 최대 시간. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
rebalance-latency-total 지금까지 그룹 리밸런스에 소요된 총 시간. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
rebalance-total 참여한 그룹 리밸런스의 총 갯수. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
rebalance-rate-per-hour 시간 당 참여한 그룹 리밸런스 수. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
failed-rebalance-total 실패한 그룹 리밸런스의 총 갯수. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
failed-rebalance-rate-per-hour 시간 당 실패한 그룹 리밸런스 이벤트 수. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
last-rebalance-seconds-ago 마지막 리밸런스 이벤트 이후 지난 시간 (초 단위). kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
last-heartbeat-seconds-ago 마지막 컨트롤러 하트비트 이후 지난 시간 (초 단위). kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
partitions-revoked-latency-avg on-partitions-revoked 리밸런스 리스너 콜백에 소요된 평균 시간. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
partitions-revoked-latency-max on-partitions-revoked 리밸런스 리스너 콜백에 소요한 최대 시간. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
partitions-assigned-latency-avg on-partitions-assigned 리밸런스 리스너 콜백에 소요된 평균 시간. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
partitions-assigned-latency-max on-partitions-assigned 리밸런스 리스너 콜백에 소요한 최대 시간. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
partitions-lost-latency-avg on-partitions-lost 리밸런스 리스너 콜백에 소요된 평균 시간. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)
partitions-lost-latency-max on-partitions-lost 리밸런스 리스너 콜백에 소요한 최대 시간. kafka.consumer:type=consumer-coordinator-metrics,client-id=([-.\w]+)

Consumer Fetch Metrics

kafka.consumer:type=consumer-fetch-manager-metrics,client-id=”{client-id}”
ATTRIBUTE NAME DESCRIPTION
bytes-consumed-rate 초당 컨슘한 평균 바이트 수.
bytes-consumed-total 컨슘한 총 바이트 수.
fetch-latency-avg 페치 요청에 소요된 평균 시간.
fetch-latency-max 페치 요청에 소요한 최대 시간.
fetch-rate 초당 페치 요청 수.
fetch-size-avg 요청 당 가져온 평균 바이트 수.
fetch-size-max 요청 당 가져온 최대 바이트 수.
fetch-throttle-time-avg 평균 스로틀 시간 (ms).
fetch-throttle-time-max 최대 스로틀 시간 (ms)
fetch-total 페치 요청의 총 갯수.
records-consumed-rate 초당 컨슘한 평균 레코드 수.
records-consumed-total 컨슘한 레코드의 총 갯수.
records-lag-max 이 윈도우 내 모든 파티션에 대한 최대 랙 (레코드 수).
records-lead-min 이 윈도우 내 모든 파티션에 대한 최소 리드 (레코드 수).
records-per-request-avg 각 요청 당 평균 레코드 수.
kafka.consumer:type=consumer-fetch-manager-metrics,client-id=”{client-id}”,topic=”{topic}”
ATTRIBUTE NAME DESCRIPTION
bytes-consumed-rate 초당 토픽을 컨슘한 평균 바이트 수.
bytes-consumed-total 토픽을 컨슘한 총 바이트 수.
fetch-size-avg 요청 당 토픽에서 가져온 평균 바이트 수.
fetch-size-max 요청 당 토픽에서 가져온 최대 바이트 수.
records-consumed-rate 초당 컨슘한 평균 토픽 레코드 수.
records-consumed-total 컨슘한 토픽 레코드의 총 갯수.
records-per-request-avg 각 요청 당 평균 토픽 레코드 수.
kafka.consumer:type=consumer-fetch-manager-metrics,partition=”{partition}”,topic=”{topic}”,client-id=”{client-id}”
ATTRIBUTE NAME DESCRIPTION
preferred-read-replica 현재 읽고 있는 파티션의 레플리카. 리더에서 읽고 있다면 -1.
records-lag 파티션의 가장 최근 lag.
records-lag-avg 파티션의 평균 lag.
records-lag-max 파티션의 최대 lag.
records-lead 파티션의 가장 최근 lead.
records-lead-avg 파티션의 평균 lead.
records-lead-min 파티션의 최소 lead.

Connect Monitoring

커넥트 워커 프로세스는 모든 프로듀서와 컨슈머 메트릭 뿐 아니라 커넥트 전용 메트릭도 가진다. 워커 프로세스 자체에 여러 가지 메트릭이 있으며, 각 커넥터와 태스크도 별도 메트릭을 가진다.

kafka.connect:type=connect-worker-metrics
ATTRIBUTE NAME DESCRIPTION
connector-count 이 워커에서 실행하는 커넥터 수.
connector-startup-attempts-total 이 워커가 커넥터 기동을 시도한 총 횟수.
connector-startup-failure-percentage 이 워커의 커넥터가 시작에 실패한 평균 백분율.
connector-startup-failure-total 커넥터 시작에 실패한 총 횟수.
connector-startup-success-percentage 이 워커의 커넥터가 시작에 성공한 평균 백분율.
connector-startup-success-total 커넥터 시작에 성공한 총 횟수.
task-count 이 워커에서 실행하는 태스크 수.
task-startup-attempts-total 이 워커가 태스크 기동을 시도한 총횟수.
task-startup-failure-percentage 이 워커의 태스크가 시작에 실패한 평균 백분율.
task-startup-failure-total 태스크 시작에 실패한 총 횟수.
task-startup-success-percentage 이 워커의 태스크가 시작에 성공한 평균 백분율.
task-startup-success-total 태스크 시작에 성공한 총 횟수.
kafka.connect:type=connect-worker-metrics,connector=”{connector}”
ATTRIBUTE NAME DESCRIPTION
connector-destroyed-task-count 이 워커에 있는 커넥터의 삭제된 태스크 수.
connector-failed-task-count 이 워커에 있는 커넥터의 실패한 테스크 수.
connector-paused-task-count 이 워커에 있는 커넥터의 일시 정지된 태스크 수.
connector-running-task-count 이 워커에 있는 커넥터의 실행 중인 태스크 수.
connector-total-task-count 이 워커에 있는 커넥터의 태스크 수.
connector-unassigned-task-count 이 워커에 있는 커넥터의 할당되지 않은 태스크 수.
kafka.connect:type=connect-worker-rebalance-metrics
ATTRIBUTE NAME DESCRIPTION
completed-rebalances-total 이 워커가 리밸런싱을 완료한 총 횟수.
connect-protocol 이 클러스터에서 사용하는 커넥트 프로토콜.
epoch 이 워커의 epoch 또는 generation number.
leader-name 그룹 리더 이름.
rebalance-avg-time-ms 이 워커가 리밸런싱에 소요한 평균 시간 (밀리세컨드).
rebalance-max-time-ms 이 워커가 리밸런싱에 소요한 최대 시간 (밀리세컨드).
rebalancing 현재 이 워커가 리밸런싱 중인지 여부.
time-since-last-rebalance-ms 이 워커가 마지막으로 리밸런싱을 완료한 후 지난 시간 (밀리세컨드).
kafka.connect:type=connector-metrics,connector=”{connector}”
ATTRIBUTE NAME DESCRIPTION
connector-class 커넥터 클래스 이름.
connector-type 커넥터 타입. ‘source’, ‘sink’ 중 하나.
connector-version 커넥터에서 보고한 커넥터 클래스 버전.
status 커넥터의 상태. ‘unassigned’, ‘running’, ‘paused’, ‘failed’, ‘destroyed’ 중 하나.
kafka.connect:type=connector-task-metrics,connector=”{connector}”,task=”{task}”
ATTRIBUTE NAME DESCRIPTION
batch-size-avg 이 커넥터에서 처리한 배치의 평균 크기.
batch-size-max 이 커넥터에서 실행한 배치의 최대 크기.
offset-commit-avg-time-ms 이 태스크에서 오프셋을 커밋하는데 걸린 평균 시간 (밀리세컨드).
offset-commit-failure-percentage 이 태스크에서 오프셋 커밋에 실패한 평균 백분율.
offset-commit-max-time-ms 이 태스크에서 오프셋을 커밋하는데 걸린 최대 시간 (밀리세컨드).
offset-commit-success-percentage 이 태스크에서 오프셋 커밋에 성공한 평균 백분율.
pause-ratio 이 태스크가 일시 중지 상태로 보낸 시간 비율.
running-ratio 이 태스크가 실행 중 상태로 보낸 시간 비율.
status 커넥터 태스크의 상태. ‘unassigned’, ‘running’, ‘paused’, ‘failed’, ‘destroyed’ 중 하나.
kafka.connect:type=sink-task-metrics,connector=”{connector}”,task=”{task}”
ATTRIBUTE NAME DESCRIPTION
offset-commit-completion-rate 오프셋 커밋을 성공적으로 완료한 초당 평균 횟수.
offset-commit-completion-total 오프셋 커밋을 성공적으로 완료한 총 횟수.
offset-commit-seq-no 현재 오프셋 커밋의 시퀀스 번호.
offset-commit-skip-rate 오프셋 커밋 응답을 너무 늦게 받아 건너뛰거나 무시한 초당 평균 횟수.
offset-commit-skip-total 오프셋 커밋 응답을 너무 늦게 받아 건너뛰거나 무시한 총 횟수.
partition-count 이 태스크에 할당된 토픽 파티션 수. 이 태스크는 현재 워커에 지정된 싱크 커넥터에 속한다.
put-batch-avg-time-ms 이 태스크에서 레코드 배치를 싱크에 넣는데 걸린 평균 시간.
put-batch-max-time-ms 이 태스크에서 레코드 배치를 싱크에 넣는데 걸린 최대 시간.
sink-record-active-count 카프카에서 읽어왔지만, 싱크 태스크에서 아직 완전히 커밋/플러시/승인하지 않은 레코드 수.
sink-record-active-count-avg 카프카에서 읽어왔지만, 싱크 태스크에서 아직 완전히 커밋/플러시/승인하지 않은 평균 레코드 수.
sink-record-active-count-max 카프카에서 읽어왔지만, 싱크 태스크에서 아직 완전히 커밋/플러시/승인하지 않은 최대 레코드 수.
sink-record-lag-max 모든 토픽 파티션 중에서, 싱크 태스크가 컨슈머 위치보다 뒤쳐진 레코드 수가 가장 큰 최대 lag.
sink-record-read-rate 이 태스크가 카프카에서 읽어온 초당 평균 레코드 수. 이 레코드는 transformation을 적용하기 전이다. 이 태스크는 현재 워커에 지정된 싱크 커넥터에 속한다.
sink-record-read-total 마지막으로 태스크를 재시작한 이후부터 이 태스크가 카프카에서 읽은 총 레코드 수. 이 태스크는 현재 워커에 지정된 싱크 커넥터에 속한다.
sink-record-send-rate transformation을 거쳐 이 태스크로 send/put한 초당 평균 레코드 수. 이 태스크는 현재 워커에 지정된 싱크 커넥터에 속한다. 이 레코드는 transformation을 적용한 뒤며, transformation에서 제외시킨 레코드는 불포함한다.
sink-record-send-total 마지막으로 태스크를 재시작한 이후부터, transformation을 거쳐 이 태스크로 send/put한 총 레코드 수. 이 태스크는 현재 워커에 지정된 싱크 커넥터에 속한다.
kafka.connect:type=source-task-metrics,connector=”{connector}”,task=”{task}”
ATTRIBUTE NAME DESCRIPTION
poll-batch-avg-time-ms 이 태스크에서 소스 레코드 배치를 poll하는데 걸린 평균 시간 (밀리세컨드).
poll-batch-max-time-ms 이 태스크에서 소스 레코드 배치를 poll하는데 걸린 최대 시간 (밀리세컨드).
source-record-active-count 이 태스크에서 만들었지만 아직 카프카에 완전히 기록되진 않은 레코드 수.
source-record-active-count-avg 이 태스크에서 만들었지만 아직 카프카에 완전히 기록되진 않은 평균 레코드 수.
source-record-active-count-max 이 태스크에서 만들었지만 아직 카프카에 완전히 기록되진 않은 최대 레코드 수.
source-record-poll-rate 이 태스크가 produce/poll한 (transformation 전) 초당 평균 레코드 수. 이 태스크는 현재 워커에 지정된 소스 커넥터에 속한다.
source-record-poll-total 이 태스크가 produce/poll한 (transformation 전) 총 레코드 수. 이 태스크는 현재 워커에 지정된 소스 커넥터에 속한다.
source-record-write-rate 이 태스크에서 transformation을 거쳐 카프카에 기록한 초당 평균 레코드 수. 이 태스크는 현재 워커에 지정된 소스 커넥터에 속한다. 이 레코드는 transformation을 적용한 뒤며, transformation에서 제외시킨 레코드는 불포함한다.
source-record-write-total 마지막으로 태스크를 재시작한 이후부터, 이 태스크에서 transformation을 거쳐 카프카에 기록한 레코드 수. 이 태스크는 현재 워커에 지정된 소스 커넥터에 속한다.
kafka.connect:type=task-error-metrics,connector=”{connector}”,task=”{task}”
ATTRIBUTE NAME DESCRIPTION
deadletterqueue-produce-failures DLQ에 쓰기를 실패한 횟수.
deadletterqueue-produce-requests DQL에 쓰기를 시도한 횟수.
last-error-timestamp 이 태스크에서 마지막으로 에러가 발생한 epoch 타임스탬프.
total-errors-logged 로깅한 에러 수.
total-record-errors 이 태스크에서 에러가 발생한 레코드 수.
total-record-failures 이 태스크에서 처리에 실패한 레코드 수.
total-records-skipped 에러 때문에 스킵한 레코드 수.
total-retries 작업을 재시도한 횟수.

Others

GC 시간과 관련 지표, 그리고 CPU 사용률, I/O 서비스 시간 등과 같은 다양한 서버 지표를 모니터링하길 권장한다. 클라이언트 측에서는 시간당 message/byte 비율과(전체 지표와 토픽별 지표), 요청 속도/크기/시간을, 컨슈머 측에선 모든 파티션에서 메세지의 최대 랙과, 최소 페치 요청 속도를 모니터링하길 권한다. 컨슈머가 계속해서 메세지 생성 속도를 따라가려면 최대 랙이 임계치보다 작아야하며, 최소 페치 속도는 0보다 커야 한다.


Next :
Security
카프카에 보안을 적용하는 방법. SSL/SASL을 통한 커넥션 인증, SSL을 통한 데이터 암호화, ACL을 통한 작업 권한 부여

전체 목차는 여기에 있습니다.

<< >>

TOP