1. 문제 정의

업브렐라 서버팀은 ELK를 사용하여 로그 모니터링을 하려고 했습니다. 하지만 무거운 ELK를 감당하기에는 서버 비용이 부담이 들었고, 비교적 가볍게 실행할 수 있는 Grafana를 로그 모니터링 툴로 선택하게 되었습니다.

2. Grafana

2 - 1 Grafana란?

Grafana는 오픈 소스로 제공되는 대시보드 및 시각화 플랫폼입니다.

이번 포스팅을 통해 Loki와 Promtail로 수집한 데이터를 Grafana로 시각화하는 방법에 대해서 알아보겠습니다.

2 - 2 Grafana 설치

wget으로 Grafana를 다운받고, 압축을 해제해줍니다.

wget https://dl.grafana.com/enterprise/release/grafana-enterprise-10.1.2.linux-amd64.tar.gz
tar -zxvf grafana-enterprise-10.1.2.linux-amd64.tar.gz

압축 해제된 grafana/bin/ 들어가보면 grafana-server가 있는 것을 볼 수 있습니다. image

./grafana-server

하지만 위와 같이 실행하게 되면 terminal이 종료될 시 grafana도 종료됩니다.

따라서 Systemd 서비스 유닛 파일을 작성하고 이를 활용하여 Grafana를 관리할 필요가 있습니다.

  1. systemd 서비스 파일 생성
sudo nano /etc/systemd/system/grafana-custom.service
  1. 아래 내용을 파일에 입력
[Unit]
Description=Grafana
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/grafana-10.1.2
ExecStart=/home/ubuntu/grafana-10.1.2/bin/grafana-server
Restart=on-failure

[Install]
WantedBy=multi-user.target
  1. 서비스 파일 권한 설정 후 데몬 리로드
sudo chmod 644 /etc/systemd/system/grafana-custom.service
sudo systemctl daemon-reload
  1. Grafana 시작
sudo systemctl start grafana-custom
  1. 시스템 부팅 시 자동 시작 설정
sudo systemctl enable grafana-custom
  1. 그라파나 실행 확인
sudo systemctl status grafana-custom

3000 포트로 접속하면 그라파나가 활성화된 것을 볼 수 있습니다. image

3. Loki

3 - 1 Loki란

Loki는 Grafana에서 제공하는 오픈소스 기반의 로그 집계 서비스입니다.

Promtail과 함께 사용해서 로그를 수집하고 Grafana로 로그를 보여줄 수 있습니다.

3 - 2 Loki 설치

wget https://github.com/grafana/loki/releases/download/v2.9.1/loki-linux-amd64.zip
wget https://github.com/grafana/loki/releases/download/v2.9.1/promtail-linux-amd64.zip

Loki를 사용하기 위해서는 로그를 Loki로 보내주는 Promtail도 같이 설치해야 합니다.

설정 파일을 다시 받아줍니다.

wget https://raw.githubusercontent.com/grafana/loki/master/cmd/loki/loki-local-config.yaml
wget https://raw.githubusercontent.com/grafana/loki/main/clients/cmd/promtail/promtail-local-config.yaml
  • 이제 Promtail 설정을 추가로 해주어야 합니다.
server:
  http_listen_port: 9080
  grpc_listen_port: 0

# promtail이 꺼졌을 경우를 대비해서, 로그를 마지막으로 어디까지 읽었는지 저장해둡니다. 
positions:
  filename: /tmp/positions.yaml

# 로키가 실행중인 서버의 ip 
clients:
  - url: http://localhost:3100/loki/api/v1/push

scrape_configs:
- job_name: system
  static_configs:
	# promtail이 설치된 곳 
  - targets:
      - localhost
    labels:
      job: was-log
			# 로그의 경로 
      __path__: /home/ubuntu/be-log/*.log

설정을 마친 후 Loki 와 Promtail을 실행합니다.

kill -9 $(lsof -t -i:3100) || true
nohup /home/ubuntu/loki/loki-linux-amd64 -config.file=/home/ubuntu/loki/loki-local-config.yaml 2>&1 &
nohup /home/ubuntu/promtail/promtail-linux-amd64 \
-config.file=/home/ubuntu/promtail/promtail-local-config.yaml \
> /home/ubuntu/promtail/promtail.log 2>&1 &

4. Dashboard 설정

4 - 1 Loki 설정

  1. Grafana를 설치한 ip :3000 으로 그라파나에 접속해줍니다.

  2. Connection 에서 Loki를 선택해줍니다. image

image

URL 에 서버의 IP와 3100 포트를 적고 save & test 를 클릭하면 됩니다.

4 - 2 Dashboard 설정

  1. Dashboard에 들어간 후 New Dashboard - Add visualization - Loki 를 선택해줍니다.

  2. Label Filter 에서 promtail config 에서 설정한 label을 선택해줍니다.

image

  1. save를 하게 되면 log를 Dashboard에서 확인할 수 있습니다.

5. 마무리

이번 포스팅을 통해 Grafana와 Loki를 이용해서 로그를 확인하는 방법에 대해 알아보았습니다.

다음 포스팅에서는 slack 알림봇과 연동해서 500에러가 발생했을 때 알림이 가도록 서비스를 구축해보도록 하겠습니다.