로그 모니터링 시스템의 필요성
Logback을 이용해 날짜별, 로그 레벨별 로그 파일들을 관리하고 있었지만,
로그를 확인하려면 개발, 운영 서버에 직접 들어가서 log 파일을 열어서 확인해야 했습니다.
날짜별로, 레벨 별로도 분리되어 있고, 개발 운영 환경별로도 로그가 분리되어 있어
통합적으로 모니터링하는 것은 상당히 어렵습니다.
또한 최근 일주일 동안 특정 로그가 몇 건 발생했는지와 같은 로그 집계나
특정 시간 내에 어떤 로그가 몇 건 이상 발생 시 알림 전송 기능도 있으면 크게 도움될 것 같습니다.
Grafana, Loki, Promtail의 역할
promtail is the agent, responsible for gathering logs and sending them to Loki.
loki is the main server, responsible for storing logs and processing queries.
Grafana for querying and displaying the logs.
공식 문서 설명
Promtail은 로그 파일이 존재하는 서버에 설치되어 로그 파일을 관리하는 서버로 로그를 전송합니다.
Loki는 Promtail로부터 로그를 수신합니다.
Grafana는 로그 쿼리, 알림 시스템, 시각화를 제공합니다.
개발자는 Grafana를 사용하여 로그 쿼리나 알림 시스템을 구축할 수 있습니다.
앞서 Grafana, Prometheus, Node Exporter 등을 사용해봤는데요,
Node Exporter, MySQL Exporter 등 다양한 Agent는 사용해봤지만,
하나의 DataSource 유형인 Prometheus만 사용해왔었습니다.
또한 Prometheus와 Exporter의 관계는
Prometheus가 주기적으로 Exporter에 요청을 보내어 metric을 수집하는 관계입니다.
이와 반대로 또다른 DataSource인 Loki는 Agent인 Promtail에게 요청을 보내는 대신,
Promtail로부터 전송되는 로그를 수신합니다.
그리고 Grafana로부터 오는 로그 쿼리 요청에 대해 처리한 결과를 응답합니다.
전체 흐름
- Loki 설치 및 실행
- 로그가 존재하는 서버에 Promtail 설치
- Promtail 설정에 job 별로 로그 파일이 존재하는 영역을 지정
- Promtail 실행
- Grafana에서 Loki를 DataSource로 추가
- Grafana에서 로그 쿼리 실행
Loki 설치 및 실행
mkdir loki && cd loki
# loki-linux-arm64.zip
wget https://github.com/grafana/loki/releases/download/v2.6.1/loki-linux-arm64.zip
sudo apt install unzip
unzip loki-linux-arm64.zip
# download loki config
# Loki 버전과 Config파일 버전이 다를 경우 실행 중 오류가 발생할 수 있으니 참고
# https://github.com/grafana/loki/issues/6915
wget https://raw.githubusercontent.com/grafana/loki/v2.6.1/cmd/loki/loki-local-config.yaml
# 실행
nohup ./loki-linux-arm64 -config.file=loki-local-config.yaml 2>&1 &
curl localhost:3100/metrics
# 쉘 파일 생성
vi loki-startup.sh
kill -9 $(lsof -t -i:3100) || true
nohup /home/ubuntu/loki/loki-linux-arm64 -config.file=/home/ubuntu/loki/loki-local-config.yaml 2>&1 &
Loki 깃허브 릴리즈에서 본인에게 맞는 버전을 사용하시면 됩니다.
저는 arm64용 최신 릴리즈인 2.6.1 버전을 사용했습니다.
다운받고, 압축 해제한 뒤, 설정 파일을 추가로 다운 받은 뒤에, 실행하면서 설정 파일 위치를 지정해줘야 합니다.
기본 포트는 3100번으로 실행되며, 변경하려면 설정 파일에 http_listen_port 값을 변경하면 됩니다.
localhost:3100/metrics 를 호출해보면 정상 실행 여부를 확인할 수 있습니다.
이제 로그를 저장하고 로그 쿼리를 처리할 서버, Loki는 설치와 실행이 완료되었습니다.
Promtail 설치
mkdir promtail && cd promtail
# promtail-linux-arm64.zip
wget https://github.com/grafana/loki/releases/download/v2.6.1/promtail-linux-arm64.zip
sudo apt install unzip
unzip promtail-linux-arm64.zip
# config download
wget https://raw.githubusercontent.com/grafana/loki/v2.6.1/clients/cmd/promtail/promtail-local-config.yaml
이번에도 Loki 깃허브 릴리즈에서 본인에게 맞는 버전을 사용하시면 됩니다.
역시 arm64용 2.6.1 버전 Promtail을 사용했습니다.
다운, 압축 해제, 설정 파일 다운로드를 수행합니다.
Promtail 설정 및 실행
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://localhost:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*log
(Promtail 설정에 대한 공식 문서는 여기를 참고해주세요)
다운 받은 Promtail 설정 파일의 초기 모습은 위와 같습니다.
9080 포트에서 실행되며, grpc는 0번 포트로 설정되어있는데, 랜덤 포트를 의미합니다.
clients는 Loki 서버의 위치를 의미합니다.
Loki와 Promtail의 설치된 위치가 다르다면, localhost:3100 자리에 Loki 설치 ip와 실행 port를 입력하시면 됩니다.
scrape_configs는 Prometheus의 job 설정과 유사한 모습입니다.
targets는 Promtail이 설치된 로컬 경로를 의미하며,
job에는 식별할 작업 이름, path에는 로그파일의 위치를 입력합니다.
positions는 로그파일들의 offset이 저장되는 파일 경로입니다.
Promtail은 로그 파일을 Loki에 전송하며 Position 정보를 offset으로서 저장해둡니다.
만약 Promtail이 재실행 될 경우, 처음부터 모든 로그파일을 다시 보낼 필요는 없겠죠?
이때 positions.yaml 파일에 저장된 offset 정보를 이용해 해당 offset 이후의 로그만 전송하게 됩니다.
이하는 저에게 맞게 구성을 변경한 내용입니다.
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /home/ubuntu/promtail/positions.yaml
clients:
- url: http://{Loki가 설치된 서버 Private IP}:{Loki Port}/loki/api/v1/push
scrape_configs:
- job_name: dev_was
static_configs:
- targets:
- localhost
labels:
job: dev_was_log
__path__: /home/ubuntu/logs/**/*.log
포트 설정은 그대로 두었고,
positions 파일은 Promtail이 설치된 폴더에 같이 관리되도록 변경했습니다.
초기 구성시 position 정보를 초기화해야하는 경우가 생기더라고요.
이때 positions 파일 자체를 삭제해버리면 간단하게 해결됩니다.
clients 는 Loki가 설치된 서버의 사설 아이피로 변경하였고,
이 Promtail은 개발 서버에 설치된 것이므로 dev_was_log라고 job 이름을 설정하였습니다.
저는 WAS의 로그파일들을 /home/ubuntu/logs/{Application Name}/{date}/{log_level}/{log_level}.log 로 관리합니다.
따라서 logs 폴더 이하의 모든 경로까지 recursive 하게 탐색하여 확장자가 log 인 파일들을 탐지하도록 설정하였습니다.
여기까지 설정을 완료했다면 이제 Promtail을 실행해줍니다.
nohup /home/ubuntu/promtail/promtail-linux-arm64 \
-config.file=/home/ubuntu/promtail/promtail-local-config.yaml \
> /home/ubuntu/promtail/promtail.log 2>&1 &
정상 실행을 확인하고 싶으시다면 출력된 promtail 로그 파일을 보시면 됩니다.
인식한 로그 파일들의 목록들을 확인할 수 있습니다.
Grafana에서 Loki DataSource 추가 후 로그 쿼리
Grafana에서 Loki를 DataSource로 추가한 뒤에 Explore 메뉴로 진입하여 Loki를 선택합니다.
그 뒤에 job 별로, filename 별로 로그를 쿼리할 수 있습니다.
위 이미지는 개발 서버 로그 중에서 RSS 라는 문구가 포함된 로그를 쿼리한 모습입니다.
실제 로그 텍스트도 확인되고, 시간대별로 막대 그래프로 시각화도 자동으로 처리된 모습입니다.
Operations를 누르면 단순 로그 검색이 아니라 집계도 수행할 수 있습니다.
가령 최근 5분 이내에 RSS 라는 텍스트가 포함된 로그가 몇 건 발생했는지 와 같은 쿼리도 간단하게 수행할 수 있습니다.
알림 생성
Grafana는 자체적인 알림 시스템도 제공합니다.
가령 특정 서버의 메트릭 중 CPU 이용률이 특정 % 이상으로 몇분 이상 지속될 시 알림 전송 이런 설정이 가능합니다.
저는 Slack 알림을 구축해보았습니다.
Slack의 Incomming Webhook 앱을 이용하여 알림 받을 채널의 주소를 확보한 뒤,
Contact points 에 진입하여 Webhook URL만 입력해두면 알림을 전송할 곳에 대한 설정은 완료입니다.
이제 알림 조건을 설정하면 됩니다.
개발 서버의 로그 전체에서 인증 이라는 문자가 포함된 로그가 1분 이내에 3개 이상 일 경우 라는 조건을 설정한 모습입니다.
위의 A파트의 쿼리는 카운팅만 하는 쿼리이고 B는 컨디션을 설정하는 부분입니다.
A에서 설정한 쿼리의 결과가 3보다 클 경우 라는 설정이 되겠습니다.
아래에는 알림 행동에 대한 지침을 설정할 수 있습니다.
위 설정은 1분마다 체크하되, 5분동안 지켜본다는 의미입니다.
즉 1분 마다 최근 1분 동안 발생한 개발서버 로그에서 인증이라는 문자가 3개를 초과하는지 체크하고,
초과할 경우 5분동안 지켜본다는 의미입니다.
5분 동안 지켜 본다는 의미는
첫째로 알림 조건에 해당하더라도 5분 이내에는 알림이 발송되지 않는다는 의미입니다.
둘째로 5분 경과 시점에 알림 발생 조건이 유지되고 있는지, 발생했다가 해소되었는지를 발송한다는 의미입니다.
알림 발생 사유가 존재했다가 5분 이후에 해소되었다면 알림에 RESOLVED로 전송됩니다.
알림 사유가 여전히 남아있다면 Firing으로 전송됩니다.
알림 BASE_URL 설정
알림 전송 시 알림을 잠시 꺼두는 링크 또는 알림을 확인하러 진입하는 링크가 함께 제공되는데요,
기본 설정이 localhost:9000으로 되어 있어서 이를 수정하지 않는다면 링크를 통한 접속은 불가합니다.
이를 수정하려면 {Grafana_Path}/conf/defaults.ini 파일에 있는 domain 설정을 변경하면 됩니다.
'Server & Infra' 카테고리의 다른 글
천만 사용자를 위한 AWS 클라우드 아키텍처 진화하기 (0) | 2022.10.24 |
---|---|
확장 가능한 알림 시스템 설계 구상 (2) | 2022.10.07 |
'Reveal2021 - 쿠팡의 대규모 트래픽을 다루는 백앤드 전략'을 보고 (2) | 2022.10.07 |
Apache JMeter를 이용한 부하 테스트 및 리포트 생성 (3) | 2022.10.06 |
AWS 의도하지 않은 요금 환불받기 (2) | 2022.09.29 |