JMX-Exporter를 통한 prometheus 연동

 

JMX-Exporter


JMX-Exporter는 Java 에이전트로 동작하며, HTTP서버와 로컬 JVM의 메트릭을 수집한다. 별도의 서버로 존재하며 원격 JVM 타겟의 메트릭을 수집할 수 도 있지만, 프로세스 관련 메트릭(CPU/Memory 등)을 수집하기 어려운 등의 문제가 있어 자바 에이전트로 구동하는 것이 권장된다.

 

JMX-Exporter 설치 및 기동


Kafka Server Stop

JMX-Exporter를 사용하기 위해서는 Kafka 서버를 정지시켜야 한다.

bin/kafka-server-stop.sh

JMX-Exporter 다운로드

wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.12.0/jmx_prometheus_javaagent-0.12.0.jar

Kafka에 JMX-Exporter를 적용하기 위해 환경변수 설정

Kafka 시작 시에 JMX-Exporter를 자바 에이전트로 함께 기동하기 위해 KAFKAOPTS에 JMX-Exporter의 컨피그 파일과 .jar위치, Prometheus가 수집할 포트 번호를 환경변수로 만든다.

export KAFKA_OPTS="-javaagent:/kafka/kafka_2.12-2.4.0/jmx/jmx_prometheus_javaagent-0.12.0.jar=7071:/kafka/kafka_2.12-2.4.0/jmx/kafka_config.yml"

JMX-Exporter Config 파일 작성

lowercaseOutputName: true

rules:
# Special cases and very specific rules
- pattern : kafka.server<>Value
  name: kafka_server_$1_$2
  type: GAUGE
  labels:
    clientId: "$3"
    topic: "$4"
    partition: "$5"
- pattern : kafka.server<>Value
  name: kafka_server_$1_$2
  type: GAUGE
  labels:
    clientId: "$3"
    broker: "$4:$5"
- pattern : kafka.coordinator.(\w+)<>Value
  name: kafka_coordinator_$1_$2_$3
  type: GAUGE

# Generic per-second counters with 0-2 key/value pairs
- pattern: kafka.(\w+)<>Count
  name: kafka_$1_$2_$3_total
  type: COUNTER
  labels:
    "$4": "$5"
    "$6": "$7"
- pattern: kafka.(\w+)<>Count
  name: kafka_$1_$2_$3_total
  type: COUNTER
  labels:
    "$4": "$5"
- pattern: kafka.(\w+)<>Count
  name: kafka_$1_$2_$3_total
  type: COUNTER

- pattern: kafka.server<>([a-z-]+)
  name: kafka_server_quota_$3
  type: GAUGE
  labels:
    resource: "$1"
    clientId: "$2"

- pattern: kafka.server<>([a-z-]+)
  name: kafka_server_quota_$4
  type: GAUGE
  labels:
    resource: "$1"
    user: "$2"
    clientId: "$3"

# Generic gauges with 0-2 key/value pairs
- pattern: kafka.(\w+)<>Value
  name: kafka_$1_$2_$3
  type: GAUGE
  labels:
    "$4": "$5"
    "$6": "$7"
- pattern: kafka.(\w+)<>Value
  name: kafka_$1_$2_$3
  type: GAUGE
  labels:
    "$4": "$5"
- pattern: kafka.(\w+)<>Value
  name: kafka_$1_$2_$3
  type: GAUGE

# Emulate Prometheus 'Summary' metrics for the exported 'Histogram's.
#
# Note that these are missing the '_sum' metric!
- pattern: kafka.(\w+)<>Count
  name: kafka_$1_$2_$3_count
  type: COUNTER
  labels:
    "$4": "$5"
    "$6": "$7"
- pattern: kafka.(\w+)<>(\d+)thPercentile
  name: kafka_$1_$2_$3
  type: GAUGE
  labels:
    "$4": "$5"
    "$6": "$7"
    quantile: "0.$8"
- pattern: kafka.(\w+)<>Count
  name: kafka_$1_$2_$3_count
  type: COUNTER
  labels:
    "$4": "$5"
- pattern: kafka.(\w+)<>(\d+)thPercentile
  name: kafka_$1_$2_$3
  type: GAUGE
  labels:
    "$4": "$5"
    quantile: "0.$6"
- pattern: kafka.(\w+)<>Count
  name: kafka_$1_$2_$3_count
  type: COUNTER
- pattern: kafka.(\w+)<>(\d+)thPercentile
  name: kafka_$1_$2_$3
  type: GAUGE
  labels:
    quantile: "0.$4"

Kafka 서버 재기동

nohup bin/kafka-server-start.sh config/server.properties &

서버 메트릭 확인

curl http://localhost:7071/metrics

...
# TYPE jmx_scrape_error gauge
jmx_scrape_error 0.0
# HELP jvm_buffer_pool_used_bytes Used bytes of a given JVM buffer pool.
# TYPE jvm_buffer_pool_used_bytes gauge
jvm_buffer_pool_used_bytes{pool="direct",} 5641087.0
jvm_buffer_pool_used_bytes{pool="mapped",} 4.1943032E8
# HELP jvm_buffer_pool_capacity_bytes Bytes capacity of a given JVM buffer pool.
# TYPE jvm_buffer_pool_capacity_bytes gauge
jvm_buffer_pool_capacity_bytes{pool="direct",} 5641087.0
jvm_buffer_pool_capacity_bytes{pool="mapped",} 4.1943032E8
# HELP jvm_buffer_pool_used_buffers Used buffers of a given JVM buffer pool.
# TYPE jvm_buffer_pool_used_buffers gauge
jvm_buffer_pool_used_buffers{pool="direct",} 19.0
jvm_buffer_pool_used_buffers{pool="mapped",} 40.0
...

 

Prometheus 연동


Prometheus 컨피그 파일 추가

scrape_configs:
# The job name is added as a label `job=` to any timeseries scraped from this config.
- job_name: kafka
static_configs:
- targets: ['192.168.150.75:7071'] # kafka
labels:
instance : kafka

Prometheus 재기동

/root/prometheus/prometheus --config.file=/root/prometheus/prometheus.yml