| 방식 | 도구 | 수집 내용 |
|---|---|---|
| JMX 경로 | prometheus/jmx_exporter javaagent |
JVM 안의 브로커 · 프로듀서 · 컨슈머 MBean 전체 |
| kafka_exporter | danielqsj/kafka_exporter 별도 프로세스 |
토픽 · 파티션 · Consumer Lag · 브로커 상태 |
Consumer Lag 은 kafka_exporter 가 편하고, 세부 JVM · 요청 지연은 JMX Exporter 가 필요하다. 둘을 함께 쓴다.
mkdir -p /opt/jmx_exporter
wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/1.3.0/jmx_prometheus_javaagent-1.3.0.jar -O /opt/jmx_exporter/jmx_prometheus_javaagent.jar
wget https://raw.githubusercontent.com/prometheus/jmx_exporter/main/examples/kafka-2_0_0.yml -O /opt/jmx_exporter/kafka-metrics.yml
KAFKA_JMX_OPTS 는 JConsole 용 원격 JMX 포트를 여는 변수이고, javaagent 는 KAFKA_OPTS 로 넣는다. 둘은 별개다.
# systemd unit 의 [Service]
Environment=JMX_PORT=9999
Environment="KAFKA_OPTS=-javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent.jar=7071:/opt/jmx_exporter/kafka-metrics.yml"
KRaft 모드는 예제 kafka-kraft.yml 을 쓴다. Kafka 3.9 는 ZooKeeper 를 지원하는 마지막 버전이고 4.0 부터 KRaft 전용이므로 마이그레이션을 계획한다.
lowercaseOutputName: true
lowercaseOutputLabelNames: true
rules:
- pattern: 'kafka.server<type=(.+), name=(.+), clientId=(.+), topic=(.+), partition=(.*)><>Value'
name: kafka_server_$1_$2
type: GAUGE
labels:
clientId: "$3"
topic: "$4"
partition: "$5"
- pattern: 'kafka.server<type=(.+), name=(.+)><>(Count|Value|OneMinuteRate)'
name: kafka_server_$1_$2_$3
type: GAUGE
MBean 이름은 <도메인><type=..., name=..., key=val><>속성 형태라 pattern 의 캡처 그룹으로 name 과 labels 를 만든다. 구체적인 패턴을 위에, 포괄 패턴을 아래에 둔다. whitelistObjectNames · blacklistObjectNames 로 수집 범위를 줄일 수 있다.
hadoop-env.sh 에 역할별로 다른 포트를 준다.
export HDFS_NAMENODE_OPTS="$HDFS_NAMENODE_OPTS -javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent.jar=7072:/opt/jmx_exporter/namenode.yaml"
export HDFS_DATANODE_OPTS="$HDFS_DATANODE_OPTS -javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent.jar=7073:/opt/jmx_exporter/datanode.yaml"
# namenode.yaml (최소)
startDelaySeconds: 0
lowercaseOutputName: true
lowercaseOutputLabelNames: true
rules:
- pattern: 'Hadoop<service=NameNode, name=(FSNamesystem|NameNodeActivity|JvmMetrics)><>(.+)'
name: hadoop_namenode_$1_$2
type: GAUGE
rules: [{pattern: ".*"}] 로 시작해 필요한 것만 남기는 방식이 실용적이다. Cloudera 관리 클러스터에서는 CM 의 역할별 Java Options 안전 밸브에 같은 -javaagent 인자를 넣는다.
NiFi 는 환경변수가 아니라 conf/bootstrap.conf 의 java.arg.N= 으로 JVM 인자를 준다. 기존 번호 뒤에 이어서 쓴다.
java.arg.30=-javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent.jar=7074:/opt/jmx_exporter/nifi.yaml
NiFi 전용 공식 예제 YAML 은 없어 org.apache.nifi.* 도메인을 직접 패턴으로 잡거나, REST API /nifi-api/system-diagnostics 와 PrometheusReportingTask 를 쓰는 편이 간단하다.