카프카는 기본적으로 cli를 통해 현재 토픽이나 컨슈머 그룹의 상태를 알 수 있습니다. 다만 이를 계속해서 모니터링하기 위해 cli를 통해서 이 상태를 지속적으로 알아오는 데는 한계가 있을 수 있습니다. 그래서 카프카의 브로커, 토픽 또는 컨슈머 그룹에 대해 모니터링하기 위해 kafka_exporter 를 사용해서 grafana 로 이 데이터를 표출할 수가 있습니다. 오늘은 이를 테스트한 과정에 대해 살펴보겠습니다.
테스트 환경
가장 먼저 테스트 환경은 다음과 같습니다. 대부분은 VM 환경에 설치하였으며, 그라파나만 Docker에 설치하였습니다. 원래는 모두 도커에 설치해서 하려고 했는데 카프카같은 경우에는 제 로컬 환경에서 파이썬으로 프로듀서 / 컨슈머를 작성하고 카프카에 보내려고 했으나 뭔가 네트워크 설정이 잘 안되어서 관련된 것을 VM에 설치하였습니다.
Ubuntu 22.04 버전이 깔린 VM (Hyper-V로 생성)
- Kafka 설치
- Zookeeper 설치
- kafka_exporter 설치
- prometheus 설치
Docker
- Grafana 설치 (grafana:latest)
로컬
- 카프카 모의 프로듀서
- 카프카 모의 컨슈머
테스트 환경 셋업
테스트 환경 셋업 중에, 다른 글에서 이미 설명한 것은 링크로 대체하고 이 글에서는 kafka_exporter 와 prometheus 설치 방법을 설명하겠습니다.
카프카와 그라파나
먼저 카프카를 올리기 위한 방법은 아래 글에서 설명하므로, 이를 참조하세요.
그 다음으로 그라파나 설치 같은 경우에는, Docker 환경에 설치해야 하므로, 아래 글을 참조하세요.
kafka_exporter 설치
사실 카프카를 모니터링하는 데는, jmx_exporter 를 사용해서 하라는 글이 더 많았습니다만 이는 카프카 내부의 토픽이나 컨슈머 그룹보다는 카프카라는 서비스 자체가 잘 돌고 있는지를 모니터링하는 데 좀 더 초점이 맞춰져 있습니다. 자바 기반의 앱이나 서비스가 잘 돌고 있는지를 일반적으로 모니터링하기 좋은 exporter 라고 생각하면 될 거 같아요. exporter 가 뭔지는 일단 이따가 알아보기로 하고 우선 설치부터 해보시죠.
먼저 아래의 github 프로젝트로 이동해서, clone할 주소를 받습니다.
그다음 카프카 서버에 터미널로 접속해서 (이 글의 환경인 경우 VM에 터미널로 접속하는 게 되겠죠?) 위 프로젝트를 클론해 줍니다. 본인이 원하는 폴더를 하나 적당히 생성해 주세요. 저같은 경우에는 ~/git
폴더를 하나 생성해서 거기에 clone 하였습니다.
git clone https://github.com/danielqsj/kafka_exporter.git
깃허브 프로젝트에도 나와 있지만, 이 소스 코드를 직접 빌드해서 사용하면 됩니다. golang 으로 짜여져 있고, 아래와 같이 작성하시면 됩니다. make
명령어를 사용할 거예요. make
명령어는 Makefile
이 있는 폴더에서 치면 알아서 인식합니다. make
가 없으면 sudo apt install make
해서 설치 후 사용하세요.
make
저의 경우에는 아래의 폴더에서 위 명령어를 수행하였습니다. 그러면 kafka_exporter
라는 실행할 수 있는 파일이 하나 생길 거예요.
이후에, 이를 실제로 실행할 폴더로 kafka_exporter 파일을 옮겨 줍니다. 저의 경우에는 /usr/local/kafka_exporter 폴더를 생성하고, 그 안에 kafka_exporter 파일을 이동해 두었습니다. 또한 /usr/local 폴더에 아래에서 설명할 prometheus 도 복사해 두었습니다.
prometheus 설치
아래 다운로드 링크로 이동합니다.
저는 리눅스에 설치할 예정이므로, 다운로드 페이지에서 원하는 버전 중 리눅스 용을 우클릭해서 다운로드 링크를 복사합니다.
그리고 다음 일련의 명령어를 통해 다운로드를 받고 압축을 해제합니다.
# 원하는 디렉토리로 이동한 후
cd ~
# 적당한 이름의 디렉토리를 하나 생성하고 그 위치로 이동
mkdir prometheus
cd prometheus
# 복사한 링크를 다운로드 후, 압축 해제
wget https://github.com/prometheus/prometheus/releases/download/v2.50.0/prometheus-2.50.0.linux-amd64.tar.gz
tar xzvf prometheus-2.50.0.linux-amd64.tar.gz
# 적당한 폴더로 이동
sudo mv prometheus-2.50.0.linux-amd64 /usr/local/prometheus
이제 여기까지 하면 필요한 모듈을 다운받고 설치하는 작업은 끝이구요, 이제는 설치한 모듈들을 설정하고 실행해 보겠습니다.
각 모듈 실행
먼저, kafka_exporter 를 통한 카프카 모니터링의 구조는 다음과 같습니다.
kafka_exporter 에서 카프카 내부 정보를 지속적으로 뽑아내고, prometheus 가 이를 적절한 형태로 변형해서 시계열 DB 형태로 변환합니다. 그런 다음에 그라파나가 프로메테우스를 읽어와서 PromQL을 통해 여러가지 적절한 그래프를 보여주는 식입니다. 최종적인 결과를 먼저 보여드리자면 다음 그림과 같습니다.
이 그래프를 만들기 위한 과정을 이제부터 하나하나 따라가 볼게요. 모듈을 실행하는 순서는, 카프카 → kafka_exporter → prometheus → grafana 순서입니다. 받아가는 순서대로 한다고 보시면 됩니다.
카프카 실행하기
카프카 실행하기는 마찬가지로 위의 링크의 글을 참조하시면 되겠습니다. 일단 카프카는 이걸로 실행되었다고 보고 넘어갈께요.
kafka_exporter 실행하기
카프카가 실행된 상태라면, kafka_exporter 실행만 해주면 카프카 자체에 별도의 추가적인 설정은 필요없습니다. 다음 명령어로 실행합니다. 경로는 각자 설치된 경로로 변경하여 실행해 주세요.
sudo /usr/local/kafka_exporter/kafka_exporter --kafka.server=localhost:9092
저의 경우 카프카와 kafka_exporter 가 같은 서버에서 돌고 있으므로, --kafka.server
옵션에 localhost
가 들어갑니다. 그리고 카프카 포트는 기본 포트인 9092를 사용하고 있었기 때문에 이렇게 설정했습니다. 본인의 카프카 설정이 다르다면 그에 맞게 실행해 주시면 됩니다.
실행하고 나면 위와 같이 카프카에서 받아온 내용을 특정 포트를 열고 다른 애가 받아가길 기다리고 있습니다. 받아간다는 다른 애가 바로 prometheus인 거고, 그러면 이제 프로메테우스 실행을 할 때 저 9308 포트에서부터 받아가면 되겠죠? 이제 이 내용으로 프로메테우스 설정하고 실행을 해 보겠습니다.
prometheus 실행하기
프로메테우스는 실행하기 전에 먼저 설정을 해줘야 합니다. prometheus 실행 파일과 동일한 위치에 있는 prometheus.yml 파일을 열어서 kafka_exporter 를 받아갈 수 있도록 설정해 줍시다. 아래와 같이 설정하면 동작합니다.
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "kafka-exporter"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9308"]
다른 건 기본 설정에서 건드린 게 없구요, scrape_configs 아래 부분만 딱 두개 설정을 해줬습니다. job_name
은 원하시는 대로 작성하면 되고, static_configs
하위의 targets
만 kafka_exporter 가 리스닝하고 있는 포트를 연결해주면 됩니다. 저는 프로메테우스도 카프카 / kafka_exporter 와 동일한 서버에 올릴 것이기 때문에 localhost:9308
이라는 설정이 됩니다. 다른 서버에 올리는 등 환경이 다르다면, 그에 맞게 설정해 주세요.
이후에 프로메테우스를 실행하면 됩니다. 프로메테우스가 설치되어 있는 그 폴더로 가서 실행해야 되더라고요. 먼가 인자로 집어넣을 수 있나 싶었는데... 서비스로까지 만들긴 귀찮고 해서 그냥 실행합니다.
cd /usr/local/prometheus
sudo ./prometheus
먼저 프로메테우스가 설치된 폴더로 이동하고, 실행하는 명령어입니다. 그러면 프로메테우스가 실행되면서 이제 로그가 남기 시작합니다.
연결이 잘 됐는지 어쩐지 확인하기 위해서 웹 UI로 접속해 보겠습니다. {prometheus 가 설치된 서버 IP}:9090
으로 인터넷 브라우저로 접속해 보면 아래와 같이 설정한 대로 연결된 것을 보실 수 있습니다. 이 화면을 보시기 위해서는 Status > Targets 메뉴로 접속하시면 됩니다.
grafana 실행하기
그라파나는 설정해줄 것도 하나도 없습니다. 저는 Docker 에서 깔았으므로, 포트 매핑만 해줬습니다. (기본포트 3000) 포트 매핑은 Docker 내부와 로컬 환경의 포트를 매핑해 줘서, 로컬 환경에서 예를 들어 localhost:3000 이라고 하면 도커 내부의 컨테이너 중 이와 매핑된 포트가 있다면 그리로 연결해 줍니다.
그라파나의 기본 포트가 3000 이기 때문에, 로컬 포트 3000과 그라파나 포트 3000을 매핑해 주었고, 웹 UI로 실행합니다. 실행한 후 연결할 데이터를 고르는데, 이 때 프로메테우스를 골라주면 됩니다. 메뉴를 클릭하고 Connections > Data sources 를 선택합니다.
Add new data source 를 누르고, 여기에서 prometheus 를 검색합니다. 그리고 프로메테우스가 설치된 서버의 IP와 포트를 입력해 주면 알아서 연결됩니다.
여기까지 하면 설정은 끝났습니다. 이후에는 그라파나에서 대시보드를 추가하고, 여러가지 쿼리를 날려 가면서 원하는 데이터를 얻으면 됩니다. PromQL로 쿼리를 날리는데, 저도 익숙치 않기도 하고 아직 좀 함수들의 뜻을 명확히 모르겠는 부분이 있어서 이 글에는 포함시키지 않겠습니다. 다만 위에서 보여드린 대시보드에서 그래프 중 하나를 예로 들면 다음과 같습니다.
그림 하단의 쿼리가 보이시나요? sum(rate(....)) by (topic, consumergroup) 이게 쿼리 형태입니다. 보다 보니까 무슨 뜻인지는 알겠는데, 시계열 DB의 구조를 잘 모르는지라 조금 더 파악이 필요할 거 같습니다. 위 쿼리는 토픽과 컨슈머 그룹 별로 초당 처리량을 보는 쿼리이구요, 각 토픽의 파티션 단위까지는 보여주지 않도록 sum() 함수를 사용한 예시입니다. 이런 식으로 해 가면서 하나씩 작성한 결과가 위에 보여드린 전체 대시보드 형태입니다.
오늘 글은 여기서 마치도록 하고, 다음 글에는 kafka_exporter 자체에 대해서 조금 더 공부해서 작성해 보겠습니다. 읽어주셔서 감사합니다.
댓글