모니터링 환경 구축 - AIBootcamp14/mlops-project-mlops-5 GitHub Wiki
모니터링, 로깅 환경을 구축하기 위해 진행한 작업을 기록한 페이지 입니다.
- 시계열 데이터 수집에 특화된 구조
- Pull 기반 수집 방식으로 구성이 단순
- Alertmanager와 연동하여 알림 전송 가능
- 경량 오픈소스라 설치와 구성이 간단하고, 리소스 사용량이 적음
- Prometheus, 등과 연동하여 쉽게 데이터 소스로 등록하고 시각화 가능
- 라인, 바 등 다양한 차트 형태를 제공하며, 대시보드에서 자유로운 커스터마이징이 가능
- 컨테이너 기반으로 배포가 가능하고 설정이 간편함
- 웹브라우저로 쉽게 접근 가능
- 메트릭 수집을 위한 웹서비스 FastAPI로 구축
- Prometheus, Grafana 공식 도커 이미지 사용
- 각 컨테이너 통신을 위해 network 생성
docker network create monitoring-network
FastAPI, Prometheus, Grafana 각 모듈별 도커 생성

1. 메트릭 수집을 위한 FastAPI monitoring-app 도커 생성
- 포트 8000
2. Prometheus 도커 생성
-
prometheus.yml
global: scrape_interval: 15s scrape_configs: - job_name: 'monitoring-app' static_configs: - targets: ['monitoring-app:8000']
-
공식 이미지를 다운받아 실행 (기본 포트 : 9090)
# 공식 Prometheus 이미지 다운로드 docker pull prom/prometheus:latest docker run -d \ -p 9090:9090 \ -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \ --name prometheus \ --network monitoring-network \ prom/prometheus:latest
3. Grafana 도커 생성
- 공식 이미지를 다운받아 실행
docker pull grafana/grafana:latest docker run -d \ --name grafana \ --network monitoring-network \ -v grafana-data:{데이터 저장할 경로} \ -p 3000:3000 \ grafana/grafana:latest
1. FastAPI monitoring-app
- {서버ip}:8000/metrics에서 엔드포인트 기록된 metrics 수집 로그 확인

2. Prometheus
- {서버ip}:9090/targets에서 수집용 엔드포인트 확인
- query 를 통해 수집한 데이터 확인 가능

3. Grafana
- {서버ip}:3000 접속하면 최초 1회 admin/admin으로 로그인 가능
- Connections > Prometheus를 추가
- Dashboard에서 수집된 메트릭을 원하는 쿼리로 시각화 가능

리눅스 서버의 CPU, 메모리, 디스크, 네트워크 등 시스템 메트릭을 수집하여,
Prometheus가 이를 주기적으로 스크랩할 수 있도록 /metrics 엔드포인트로 노출하는 Exporter (기본 포트 : 9100)
1. 모니터링 하고자 하는 서버에 node-exporter 컨테이너 실행
-
docker-compose.yml
services: node-exporter: image: prom/node-exporter:latest container_name: node-exporter-server-a restart: always ports: - "9100:9100" volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - '--path.procfs=/host/proc' - '--path.sysfs=/host/sys' - '--path.rootfs=/rootfs' - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($|/)'
2. prometheus.yml
파일에 해당 서버 설정 추가 후 도커 컨테이너 재시작
- job_name: 'Server-A' static_configs: - targets: ['{서버ip}:9100']
3. Node Exporter Full에서 Copy ID to clipboard 로 id 복사 후,
Grafana > Dashboard > New > Import 화면에 id 를 입력한 후 Load 하면 Dashboard에서 모니터링 가능
Prometheus가 수집한 지표 중 특정 조건을 만족할 때 경고 등의 알림을 보내는 역할 (기본 포트 : 9093)
1. alertmanager.yml
파일을 생성하여 원하는 조건 알림 설정
2. prometheus.yml
파일에 알림 처리 관련 내용 추가
rule_files:
- 'alert-rules.yml'
alerting:
alertmanagers:
- static_configs:
- targets:
- "alertmanager:9093"
3. docker-compose.yml
파일에 Alert manager 도커 설정 추가
alertmanager:
image: prom/alertmanager:v0.27.0
container_name: alertmanager
volumes:
- ./alertmanager:/etc/alertmanager
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
ports:
- "9093:9093"
4. 알림 발생 시 Slack 메시지 전송을 위해 Slack App 생성 및 Webhook url 생성
- https://api.slack.com/apps에서 앱 생성
- 앱 설정 페이지 > Incoming Webhooks 페이지 내 스위치를 활성화 하고, Add New Webhook 버튼을 통해 webhook url 을 생성
-
alertmanager.yml
파일 api_url 설정 및 발송될 메시지 내용 설정
- 레이블(Labels) 로깅 도구, 검색 기능 지원
- 소규모 팀이나 초기 단계 프로젝트에서 빠르고 효율적인 로깅 환경 구축 가능
- 레이블을 인덱싱 하기 때문에 인덱스 크기가 작고, 저장공간 절약 가능
- Loki가 로그 수집할 수 있게 도와주는 에이전트
- 텍스트 기반 로그를 통해 수집 가능한 지표(Metrics)를 생성
- 모니터링을 위한 서버에 Loki 실행
- 로그가 남는 클라이언트에 Promtail을 실행하여 Loki에 로그 전송하도록 설정
- Grafana에서 로그 조회
로그 수집 및 저장, 검색 (기본 포트 : 3100)
1. 모니터링 서버에 Loki 설정을 위한 loki-config.yml
파일 생성 및 Loki 컨테이너 실행
-
docker-compose.yml
loki: image: grafana/loki:2.9.1 container_name: loki ports: - "3100:3100" volumes: - ./loki/loki-config.yml:/etc/loki/local-config.yml - ${HOME_DIR}/${LOKI_DATA_DIR}:/loki command: -config.file=/etc/loki/local-config.yml -target=all restart: unless-stopped
각 서버에 있는 로그를 Loki로 전송하는 에이전트
1. promtail-config.yml
파일을 생성하여 로그를 전달할 Loki서버 설정 및 로그를 수집할 경로 등을 설정
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yml # Promtail이 읽은 로그 위치 저장 파일
clients:
- url: http://${MONITORING_SERVER_IP}:3100/loki/api/v1/push # Loki Push API 주소
scrape_configs:
- job_name: app_logs
static_configs:
- targets:
- localhost
labels:
job: app_logs
host: server_1
__path__: /app/logs/**/*.log
relabel_configs:
- source_labels: [__path__]
regex: '/app/logs/(.*)'
target_label: file_path
- source_labels: [__path__]
regex: '.*/([^/]+)\.log'
target_label: filename
2. Prometheus, Alert manager를 사용하여 지표 수집 및 알림 처리를 위해 pipeline_stages:
설정 추가
pipeline_stages:
- regex:
expression: '(?i).*\[(?P<level>ERROR|WARN)\].*' # 'level' 변수명에 [ERROR] 또는 [WARN] 값을 캡쳐
- labels:
level:
- metrics:
log_errors:
source: level
type: Counter
description: "Total count of ERROR level logs"
config:
value: "ERROR"
action: inc
3. docker-compose.yml
파일에 promtail 설정 추가
promtail:
image: grafana/promtail:2.9.1
container_name: promtail
ports:
- "9080:9080"
volumes:
- ${PROJECT_ROOT}/logs:/app/logs:ro # 실제 로그 파일 위치 (읽기 전용)
- ./promtail/promtail-config.yml:/etc/promtail/config.yml:ro # 설정 파일
command: -config.file=/etc/promtail/config.yml
restart: unless-stopped
