3‐Tier 모니터링 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

1. 도입배경

초기 서비스 개발 단계에서 단일 인스턴스를 기반으로 MVP를 구성했으며, 이 당시에는 리소스 사용량이나 에러를 수동으로 확인하는 수준이었습니다.

top 명령어, GCP 콘솔 상의 간단한 모니터링 UI를 통해 시스템 상태를 확인했지만, 지속적인 감시나 이상 징후에 대한 자동 알림 체계는 없었습니다.

그러나 서비스 규모가 커지고, 다음과 같은 변화가 생기면서 체계적인 모니터링 시스템의 도입이 필수가 되었습니다.

주요 변화 사항

  • 1. GCP 기반의 3-Tier 아키텍처로 확장
    • Front / API / DB 서버가 분리된 환경으로 구성되어, 단일 인스턴스에서의 단순 모니터링만으로는 전체 서비스 상태를 파악하기 어려워짐.
    • 오토스케일링, 부하 분산, 멀티 노드 환경에서 리소스별, 계층별 상태를 통합적으로 추적할 필요성 증가.
  • 2. 트래픽 증가 및 동시 사용자 수 증가
    • 성능 병목, CPU/Memory 한계, 네트워크 지연 등 운영 리스크가 증가했고, 실시간으로 상태를 파악하고 대응할 수단 필요.
  • 3. 외부 노출에 따른 보안 위협 발생
    • 단일 인스턴스 사용 당시, 외부 IP가 노출되어 Shodan 검색 엔진에 등록되었고, 이로 인해 다수의 악의적인 접근 시도가 발생.
    • 특히 엔진엑스(Nginx) 경로를 통해 공격 시도가 들어왔지만, 탐지 및 경고 체계가 없어 뒤늦게 수동으로 로그를 확인해야 했음.

2. 모니터링 정의

모니터링은 시스템, 애플리케이션, 네트워크, 비즈니스 지표등 실시간으로 관찰하여 이상 징후를 조기에 감지하고 문제의 원인을 빠르게 감지할 수 있습니다.

  • 장애예방
  • 성능 분석(p99 응답 시간 증가 분석)
  • 데이터 기반 운영

3. 모니터링 대상

  1. GCE VM 인스턴스 (API 서버, AI 서버 등)
  • CPU / Memory / Disk I/O / Network 등의 리소스 사용량을 모니터링합니다.
  • 오토스케일링이 적용된 환경에서는 개별 인스턴스의 과부하 상태를 조기에 감지할 수 있도록 설정하였습니다.
  1. Cloud SQL (MySQL)
  • 연결 수, CPU 사용률, 쿼리 처리 속도, 에러율 등을 모니터링합니다.
  • 연결 실패나 리소스 한계 초과와 같은 이슈를 사전에 감지하기 위한 목적으로 활용하고 있습니다.
  1. Cloud Load Balancer (HTTP/S LB)
  • 요청 수, 응답 지연 시간, 4xx/5xx 에러율 등을 모니터링합니다.
  • 부하 분산이 제대로 이루어지는지, 특정 백엔드에 트래픽이 몰리는 현상은 없는지 파악합니다.
  1. Spring Boot 기반 API 서버
  • 요청 수 (RPS), 평균 응답 시간, 에러율을 수집합니다.
  • ActuatorPrometheus를 통해 handler 단위로 지표를 세분화하여 수집하고 있습니다.
  1. Kafka
  • 토픽별 메시지 처리량, Consumer Lag, 배치 처리 지점의 메트릭을 수집하고 있습니다.
  • 메시지 지연이나 누락 여부를 실시간으로 감지할 수 있도록 설정 중입니다.
  1. AI 서버 (FastAPI 기반)
  • Inference 요청 수, 응답 시간, 실패율 등을 health check 로그와 연계하여 모니터링하고 있습니다.

4. 아키텍처 흐름

  • GCP 리전: asia-northeast3
  • VPC 구성:
    • Shared VPC: 10.2.0.0/16
    • DEV VPC: 10.1.0.0/16
    • PROD VPC: 10.0.0.0/16
  • 모든 VPC는 서로 피어링(Peering) 되어 있으며, 모니터링 서버는 Shared VPC에 존재합니다.
리소스 설명
Prometheus (10.2.0.1) 다양한 지표 수집 메인 서버로, Spring Boot Actuator, Kafka Exporter, FastAPI Instrumentation으로부터 지표를 수집
Grafana (10.2.0.1) Prometheus에서 수집된 메트릭을 시각화하여 대시보드 형태로 제공합니다
  • Spring Boot (10.X.20.1):
    • Managed Instance Group으로 구성
    • /actuator/prometheus 엔드포인트를 통해 Prometheus에 지표 제공
  • Kafka (10.X.20.16):
    • Kafka Exporter가 설치되어 있어 토픽 수, 오프셋, 컨슈머 상태 등을 Prometheus로 전달
  • FastAPI (10.X.21.1, 10.X.21.2):
    • FastAPI Instrumentation을 통해 API 호출 수, 응답 시간 등의 메트릭을 수집
    • GPU 인스턴스에는 nvidia-smi exporter가 추가되어 GPU 사용률 지표 제공
  • Cloud SQL (10.X.30.0/24):
    • 서비스 공통의 데이터베이스
    • Cloud Monitoring을 통해 GCP의 기본 메트릭 수집

메트릭 수집 → 저장 → 시각화 → 알림

[애플리케이션, 인프라, GPU 등 지표 생성]
        ↓
[Exporter or Instrumentation]
        ↓
[Prometheus: 수집 및 저장]
        ↓
[Grafana: 시각화]
        ↓
[Alert Rule 평가 + 알림 전송 (Discord)]

메트릭 수집 (Collect)

항목 설명
수집 대상 Spring Boot (Actuator), Kafka (Exporter), FastAPI (Instrumentation), GPU (nvidia-smi exporter)
방식 Prometheus가 각 타겟에 HTTP 요청을 보내 /metrics 엔드포인트로부터 Pull 방식 수집
설정 방식 Prometheus prometheus.ymlscrape_configs 설정에 따라 주기적으로 수집

1. AI 서버 (FastAPI + 노드 + GPU)

환경 역할 메트릭 대상 포트 추가 라벨
dev FastAPI (CPU) FastAPI 메트릭 8000 env=dev, role=ai, type=cpu
dev FastAPI (GPU) FastAPI 메트릭 8002 env=dev, role=ai, type=gpu
dev Node Exporter 시스템 메트릭 9100 env=dev, role=ai
prod FastAPI (CPU) FastAPI 메트릭 8000 env=prod, role=ai, type=cpu
prod FastAPI (GPU) FastAPI 메트릭 8001 env=prod, role=ai, type=gpu
prod Node Exporter 시스템 메트릭 9100 env=prod, role=ai, type=gpu
prod NVIDIA GPU Exporter GPU 메트릭 9835 instance=prod-vm-ai-gpu-nvidia, role=ai, type=gpu

2. 백엔드 서버 (Spring Boot + Node Exporter)

백엔드는 GCE 인스턴스를 기반으로 gce_sd_configs (GCE 서비스 디스커버리) 사용

환경 역할 메트릭 대상 포트 조건 라벨
dev Spring Boot /actuator/prometheus 8080 인스턴스명: dev-ongi-backend-* instance, zone
dev Node Exporter 9100 9100 GCE 태그: dev-backend instance, zone
prod Spring Boot /actuator/prometheus 8080 인스턴스명: prod-ongi-backend-* instance, zone, env=prod
prod Node Exporter 9100 9100 GCE 태그: prod-backend instance, zone

3. Kafka Exporter

환경 역할 포트 라벨
dev Kafka Exporter 9308 env=dev, role=kafka, exporter=kafka-exporter
prod Kafka Exporter 9308 env=prod, role=kafka, exporter=kafka-exporter
  • 글로벌 수집 주기: 20초 (global.scrape_interval)
  • 각 job별 커스텀 수집 주기: 대부분 40초로 설정
  • relabel_configs: 수집된 메트릭에 환경, 역할, 인스턴스명 등의 라벨을 부여하여 시각화 및 필터링에 유용하게 활용

5. 사용도구 스택

카테고리 도구 역할 위치 / 설치 환경 비고
수집 Prometheus 메트릭 수집 및 저장 Shared VPC (10.2.0.1) scrape_configs 기반 Pull 방식
시각화 Grafana 메트릭 대시보드 시각화 Shared VPC (10.2.0.1) Prometheus 연동, Discord 알림 설정
알림 Grafana Alert / Discord Webhook 알림 전송 Grafana → Discord CPU 사용률 등 알림 전송
Exporter Node Exporter 서버(노드) CPU, 메모리 등 지표 수집 각 VM (CPU, GPU 서버 포함) 9100 포트 사용
NVIDIA SMI Exporter GPU 사용률 지표 수집 외부 GPU 서버 9835 포트 사용
Kafka Exporter Kafka 지표 수집 (Lag, 토픽 수 등) Kafka 인스턴스 (10.1.20.220, 10.0.10.2) 9308 포트
Spring Actuator Spring Boot 애플리케이션 메트릭 백엔드 앱 인스턴스 /actuator/prometheus
FastAPI Instrumentator FastAPI 메트릭 수집 AI 서버 (CPU/GPU) /metrics, 요청수/지연시간 등

6. 대시보드 구성

  1. FastAPI 모니터링

Application 옵션

  • dev-ai-fastapi
  • dev-ai-fastapi-gpu
  • prod-ai-fastapi
  • dev-ai-fastapi-gpu

CPU

GPU

패널 제목 확인할 수 있는 지표
Total Requests 전체 API 요청 수의 누적 합계
Request Count /api/albums/categories 등 엔드포인트 별 요청 수
Percent of 2xx Requests 성공 요청 확률
PR 99 Requests Duration 전체 요청 중 상위 1%에 해당하는 응답 시간 (최악의 상황에 가까운 응답 지연)
  1. 시스템 모니터링
  • dev-ai
  • dev-backend
  • prod-ai
  • prod-ai-gpu
  • prod-backend
  1. Kafka 모니터링
패널 제목 확인할 수 있는 지표 설명
Message in per second 초당 수신 메시지 수 각 토픽(topic) 별로 얼마나 자주 메시지가 들어오고 있는지를 초 단위로 확인
Message in per minute 분당 수신 메시지 수 초당보다 더 느슨한 단위로 메시지 유입량을 확인 가능
Lag by Consumer Group 컨슈머 그룹별 Lag (지연량) 각 컨슈머 그룹이 최신 오프셋을 얼마나 따라잡지 못하고 있는지를 나타냄 (Lag = 처리 안 된 메시지 수)
Message consume per minute 컨슈머 그룹별 분당 소비량 각 컨슈머 그룹이 얼마나 빠르게 메시지를 처리하고 있는지 파악
Partitions per Topic 각 토픽의 파티션 수 스루풋 및 병렬 소비 성능에 영향을 주는 구성 요소로, 토픽마다 파티션 수가 어떻게 설정되어 있는지 시각화
  1. GPU 서버 모니터링
항목 설명 해석
GPU 이름 사용 중인 GPU 모델 GCP AI 플랫폼에서 자주 사용되는 모델
P-State 성능 상태 (P0~P12) 최상위 성능 모드로 동작 중 (Full Power)
GPU Utilization % GPU 연산 코어 사용률 현재 연산 작업 없음 (idle 상태)
Memory Allocation % 예약된 GPU 메모리 비율 일부 프로세스가 메모리만 잡고 있음
Memory Utilization % 실제 메모리 사용률 실제 연산에서는 사용되지 않고 있음
Power Draw % 전력 사용률 (TDP 대비) GPU는 일부분만 활성화됨 (대기 or 경량 처리 중)
Temperature 현재 온도 정상, 낮은 온도 (idle 상태 추정)
Driver/VBIOS Version 드라이버 및 바이오스 정보 최신 드라이버 사용 가능성
Memory Allocation (GB) 할당된 메모리 그래프 메모리는 로드됨 (inference 환경 추정)
Power Draw (W) 전력 소비량 그래프 T4의 TDP가 70W임을 감안하면 절반 이하
GPU Utilization (그래프) 시간대별 GPU 사용률 연산 처리가 없는 상태 지속
Memory Utilization (그래프) 시간대별 메모리 사용률 연산용으로 메모리 사용되지 않음
Clock Speeds
(Graphics / Video / SM / Memory) 클럭 속도 (MHz or GHz) 메모리는 로드되었으나 실제 연산 없음 (idle 시 유지 클럭 올라간 상태)
  1. SpringBoot APM 모니터링
영역 주요 정보 설명
Basic Statistics Uptime, Heap/Non-Heap, Open File 시스템 기본 정보 및 메모리 상태
CPU / Load CPU 사용률, Load Average 인스턴스 CPU 상태 및 부하
Thread & GC GC 횟수, Stop-the-world 시간, 쓰레드 수 GC 동작 및 성능 병목 여부 확인
Memory (Heap/Non-Heap/JVM) JVM Heap 세부 영역별 사용량 Eden/Old/Survivor/Metaspace 등
HikariCP DB 커넥션 풀 상태 커넥션 수, 획득/사용 시간, Timeout 등
HTTP 요청 요청 수, 응답 시간 엔드포인트별 호출 추이 확인
Logback INFO/ERROR 로그 카운트 오류 로그 발생 추이
  1. 로그 모니터링
  1. MySQL 모니터링 대시보드