모니터링 환경 구축 - AIBootcamp14/mlops-project-mlops-5 GitHub Wiki

모니터링, 로깅 환경을 구축하기 위해 진행한 작업을 기록한 페이지 입니다.

📊 모니터링

Prometheus + Grafana로 모니터링 환경 구축

Prometheus

  • 시계열 데이터 수집에 특화된 구조
  • Pull 기반 수집 방식으로 구성이 단순
  • Alertmanager와 연동하여 알림 전송 가능
  • 경량 오픈소스라 설치와 구성이 간단하고, 리소스 사용량이 적음

Grafana

  • Prometheus, 등과 연동하여 쉽게 데이터 소스로 등록하고 시각화 가능
  • 라인, 바 등 다양한 차트 형태를 제공하며, 대시보드에서 자유로운 커스터마이징이 가능
  • 컨테이너 기반으로 배포가 가능하고 설정이 간편함
  • 웹브라우저로 쉽게 접근 가능

작업내용

📖 요약

  • 메트릭 수집을 위한 웹서비스 FastAPI로 구축
  • Prometheus, Grafana 공식 도커 이미지 사용
  • 각 컨테이너 통신을 위해 network 생성

✅ 도커 네트워크 생성

docker network create monitoring-network

✅ 모듈별 도커 생성

FastAPI, Prometheus, Grafana 각 모듈별 도커 생성

스크린샷 2025-07-31 오전 11 20 24

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 수집 로그 확인
스크린샷 2025-07-31 오전 11 30 39

2. Prometheus

  • {서버ip}:9090/targets에서 수집용 엔드포인트 확인
  • query 를 통해 수집한 데이터 확인 가능
스크린샷 2025-07-31 오전 11 31 08

3. Grafana

  • {서버ip}:3000 접속하면 최초 1회 admin/admin으로 로그인 가능
  • Connections > Prometheus를 추가
  • Dashboard에서 수집된 메트릭을 원하는 쿼리로 시각화 가능
스크린샷 2025-07-31 오전 11 32 35

✅ node-exporter

리눅스 서버의 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에서 모니터링 가능 스크린샷 2025-07-31 오후 8 25 31

✅ Alert manager

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 을 생성 스크린샷 2025-08-06 오전 11 35 17
  • alertmanager.yml파일 api_url 설정 및 발송될 메시지 내용 설정
    스크린샷 2025-08-06 오후 6 01 11

📋 로깅

Loki + Promtail로 로깅 환경 구축

Loki

  • 레이블(Labels) 로깅 도구, 검색 기능 지원
  • 소규모 팀이나 초기 단계 프로젝트에서 빠르고 효율적인 로깅 환경 구축 가능
  • 레이블을 인덱싱 하기 때문에 인덱스 크기가 작고, 저장공간 절약 가능

Promtail

  • Loki가 로그 수집할 수 있게 도와주는 에이전트
  • 텍스트 기반 로그를 통해 수집 가능한 지표(Metrics)를 생성

작업내용

📖 요약

  • 모니터링을 위한 서버에 Loki 실행
  • 로그가 남는 클라이언트에 Promtail을 실행하여 Loki에 로그 전송하도록 설정
  • Grafana에서 로그 조회

✅ Loki

로그 수집 및 저장, 검색 (기본 포트 : 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
    

✅ Promtail

각 서버에 있는 로그를 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

✅ Grafana > Loki 로그 조회

스크린샷 2025-08-07 오후 12 23 16
⚠️ **GitHub.com Fallback** ⚠️