Metricbeat로 Logstash 모니터링하기
Kafka -> Logstash -> ES 의 데이터 파이프라인에서 Kafka lag이 심하게 생기는 현상이 발생했다.
어느 곳이 문젠지 알아보려면 Kafka, Logstash, ES 각각의 모니터링 지표가 필요하다.
ES는 Kibana에서 모니터링을 활성화할 수 있는데, Logstash는 데이터독 agent로 연결하려다가 잘 안되어서 ES로 모니터링을 보내기로 했다.
참고 : https://www.elastic.co/guide/en/logstash/current/monitoring-with-metricbeat.html
Logstash와 ES 다 쿠버네티스로 띄우는데,
Logstash에 Sidecar로 Metricbeat를 띄운다.
Metricbeat에서 logstash-xpack 모듈을 활성화시켜주어야 하는데, 이걸 Kubernetes Deployment의 command로 하면 command 완료 시 컨테이너가 종료되어버리므로.. 도커 이미지를 새로 만들어주어 도커 이미지 자체에서 명령을 실행하게 한다.
FROM docker.elastic.co/beats/metricbeat-oss:8.4.2
USER root
RUN chown -R metricbeat:metricbeat /usr/share/metricbeat
# switch user as 'metricbeat'
USER metricbeat
RUN metricbeat modules enable logstash-xpack
그리고 이 이미지로 컨테이너를 만든다.
Metricbeat 자체의 설정은
metricbeat.yml: |-
metricbeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
processors:
- add_cloud_metadata: ~
- add_docker_metadata: ~
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["host:port"]
protocol: "https"
username: "id"
password: "password"
기존 metricbeat.yml을 그대로 써줘야 오류가 안 난다..
이렇게 설정하면 metricbeat가 같은 pod 내의 로그스태시와 localhost:9600으로 통신하며 로그스태시의 메트릭 데이터를 수집해 엘라스틱서치로 보낸다.
ES에서 .monitoring-mb 로 시작하는 인덱스의 Index template이 어떻게 되어있냐에 따라 해당 메트릭 데이터가 데이터 스트림으로 쌓일지, 그냥 인덱스로 쌓일지가 결정된다.
8개의 로그스태시를 모니터링하는데 인덱스에 하루에 쌓이는 데이터가 300mb가 채 안 되어서, 용량상으로도 만족스럽다.
엘라스틱서치를 그냥 self-monitoring 하면 노드 1개당 1기가 정도의 데이터가 하루에 쌓인다...^^