📄 Describe
상황
프론트와 백엔드 연동간 다양한 오류가 발생하였습니다.
발생한 오류가 프론트단의 문제인지 백엔드단의 문제를 확인하는 것은 서로의 로그를 비교해보아야 확실히 알 수 있었습니다.
하지만 당시 서버에 접근하여 컨테이너 로그를 확인하는 것이 가능한 사람은 배포를 맡은 저만 가능했기에
제가 컴퓨터 앞에 있지 않는 상황에서는 프론트분들이 로그 확인이 불가능했습니다.
따라서, 실시간으로 백엔드 서비스의 로그를 확인할 수 있는 방법이 필요했습니다.
작업 내용
위 문제의 해결방안으로 로그 실시간 모니터링을 위한 로깅 시스템을 구축하기로 하였고
해당 시스템 구축을 위해 Grafana
, Loki
, Promtail
를 사용하였습니다.
Grafana
는 수집한 metrics
시각화하기 위한 도구로 로그도 시각화 할 수 있습니다.Loki
는 Grafana
에서 만든 로깅에 특화된 것으로 ELK
방식보다 훨씬 간단하다고 합니다.Promtail
은 모니터링이 필요한 로컬 머신에서 Loki instance
에 로컬 로그를 푸시하는 agent
라고 합니다.
따라서, 플로우는 Promtail
-> Loki
-> Grafana
-> 프론트엔드/백엔드
가 됩니다.
직접 설치하는 것보다는 도커 네트워크를 이용하는 것이 조금 더 간편할 것이라는 생각이 들어 도커 컴포즈로 구성했습니다.
docker-compose-monitoring.yml
version: '3'
services:
# Grafana
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
depends_on:
- loki
volumes:
- grafana-data:/var/lib/grafana
environment:
GF_SECURITY_ADMIN_PASSWORD: "fittrip!!"
# Loki
loki:
image: grafana/loki:latest
container_name: loki
ports:
- "3100:3100"
volumes:
- loki-data:/loki
# Promtail
promtail:
image: grafana/promtail:latest
container_name: promtail
volumes:
- /home/hdbstn3055/script/logs:/var/log
- ./promtail-config.yaml:/etc/promtail/config.yml
command: -config.file=/etc/promtail/config.yml
depends_on:
- loki
volumes:
grafana-data:
loki-data:
promtatil은 /home/hdbstn3055/script/logs
경로와 볼륨 마운트를 설정하여
각 서비스의 로그가 해당 프롬테일 컨테이너 볼륨에 저장되도록 하였습니다.
이에 따라 각 서비스들에도 로그를 저장하기 위해 도커 볼륨 마운트 설정을 해주었습니다.
docker-compose.yml(커뮤니티 설정 예)
community-service:
image: hanyoonsoo/community-service:1.0
container_name: community-service
environment:
jasypt.encryptor.password: ${JASYPT_PASSWORD}
depends_on:
- zookeeper
- kafka
- redis-community
- mariadb-community
- discovery-service
- gateway-service
volumes: # 추가
- ./logs/community-service:/logs # 추가
물론, 각 서비스에 logback
설정 파일을 적절하게 만들어주어야 합니다.
(팀원분들께 로그 관련 내용 추가를 부탁드렸던 내용입니다.)
그리고 Promtail
이 Loki
로 로그를 잘 전달하기 위해 promtail-config.yaml
도 설정해주어야 합니다.
promtail-config.yaml(커뮤니티 설정 예)
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: community-logs
static_configs:
- targets:
- localhost
labels:
job: community-logs
__path__: /var/log/community-service/community.log
pipeline_stages:
- multiline:
firstline: '^\d{2}:\d{2}:\d{2}\.\d{3} \[.*\] INFO .* \[Web Request (START|END)\]'
max_wait_time: 1s
max_lines: 500
- job_name: communtiy-err-logs
static_configs:
- targets:
- localhost
labels:
job: community-err-logs
__path__: /var/log/community-service/community_err.log
pipeline_stages:
- multiline:
firstline: '^\d{2}:\d{2}:\d{2}\.\d{3} \[.*\] ERROR'
max_wait_time: 1s
max_lines: 500
이렇게 설정을 해준 뒤 docker-compose-monitoring.yml
를 실행시킨 뒤 적절하게 dashboard
를 설정해줍니다.
그라파나 접속 화면
위의 내용을 토대로 프론트엔드와 백엔드를 위한 로깅 시스템 구축을 완료했습니다.
🙋🏻 More
그라파나와 로키를 사용하긴 했지만,
좀 더 자세히 알아보기 위해 블로그 포스팅과 함께 더 알아보려 합니다.
'프로젝트 > FitTrip' 카테고리의 다른 글
[FitTrip] DELETE IN을 사용한 배치 처리로 얻을 수 있는 성능 향상 (0) | 2024.07.02 |
---|---|
[커뮤니티 서비스] 커뮤니티 서비스 기능정리 (0) | 2024.06.29 |
[트러블슈팅] 오픈바이두 클라이언트 연결 오류 해결 과정 (0) | 2024.06.25 |
[트러블슈팅] SSE 적용시 게이트웨이와 유저 서비스 연동간 발생 오류 해결 (0) | 2024.06.25 |
[트러블슈팅] 무중단 배포간 Docker Compose 오류 해결 (2) | 2024.06.25 |