BackEnd

서버 모니터링 (feat. prometheus, grafana)

sihanni 2024. 12. 8. 17:04

Prometheus

오픈 소스 모니터링 및 경고 시스템

시계열 데이터(Time Series Data)를 중심으로 설계되었다.

시계열 데이터 수집, 저장, 쿼리, 시각화 및 경고를 통해 모니터링의 표준으로 자리 잡았다.

 

주요 특징

  1. 시계열 데이터 저장
    데이터를 시간 순서로 저장하며 각 데이터 포인트는 metric name, value, timestamp, label으로 구성된다.
  2. 라벨 기반 데이터 모델
    모든 데이터는 고도로 유연한 Label 을 통해 식별된다. 이는 동일한 메트릭이라도 다양한 필터링 및 집계 작업이 가능케한다.
  3. Pull 방식 데이터 수집
    데이터를 능동적으로 가져오는 pull 모델을 사용하여 모니터링 대상을 관리한다. 
  4. PromQL (Prometheus Query Language)
    데이터 쿼리와 분석을 위해 설계된 강력한 도메인 특화 언어(DSL)이다.
  5. 독립적인 스토리지 엔진
    독자적인 시계열 데이터 베이스(TSDB)를 사용하여 데이터를 저장한다.
    외부 데이터베이스 없이도 자체적인 데이터 저장 및 처리 기능을 수행할 수 있다.
  6. 경량성과 확장성
    별도의 에이전트 설치 없이 간단한 설정으로 데이터를 수집하며, Federation을 통해 대규모 클러스터 환경에서도 확장성을 유지한다.

목적과 활용 가능 사례

  • 시스템 및 애플리케이션 모니터링
    • CPU, 메모리, 디스크사용량과 같은 서버 메트릭
    • 애플리케이션 요청 속도, 에러율, 응답 시간과 같은 애플리케이션 메트릭
    • 네트워크 대역폭, 연결 상태 등 네트워크 메트릭
  • 마이크로 서비스와 클라우드 네이티브 환경
    • kubernetes, Dokcer 컨테이너 모니터링
    • 서비스 간 통신 상태 및 성능 모니터링
  • 경고 (Alerting)
    • 특정 임계값에 도달했을 때 알림을 생성
    • 예: CPU 사용률이 80%를 초과하면 slack 등으로 알림 전송

특징

 

모듈형 아키텍쳐를 가지고 있으며 각 구성 요소가 독립적으로 동작한다. 

  • Prometheus 서버
    • 데이터 수집, 저장, 쿼리, 경고를 수행
  • Exporters
    • 프로메테우스와 모니터링 대상 간의 브릿지 역할
    • 예: Node Exporter는 서버 메트릭을 노출
  • pushgateway
    • short-lived 작업의 메트릭을 수집한다.
    • CI/CD 파이프라인에서 일시적인 작업 결과를 Pushgateway에 전달할 수 있다.
  • Alertmanager
    • 프로메테우스에서 생성된 경고를 수집, 집계, 전송.
    • 근데 이건 그라파나로 할 것 같다.
  • 장기 데이터 보관
    • 데이터를 장기적으로 저장하진 않으므로, 외부 스토리지를 연동해야 한다.

동작 방식

데이터 수집 -> 데이터 저장 -> 데이터 분석과 시각화 -> 알림
중요한 원리는 Pull 기반 데이터 수집이란 점과 정기적인 간격으로 데이터를 수집하는 방식이란 것이다.

  • 데이터 수집 (Scraping)
    대상 애플리케이션(Exporters라고 불리는 메트릭 제공 대상)에서 HTTP로 노출된 /metrics 엔드 포인트를 주기적으로 호출하여 데이터를 가져온다.
  • 데이터 저장 (Storage)
    수집된 데이터는 메트릭이름, 라벨, 타임 스탬프, 값의 구조로 저장된다.
  • 데이터 분석과 시각화
    자체 쿼리 언어인 PromQL을 사용하여 데이터를 검색하고 집계한다.
    Grafana를 사용해서 시각적인 표현을 할 계획이다.

Grafana

오픈 소스 데이터 시각화 및 분석 플랫폼.

다양한 데이터 소스 (Prometheys, InfluxDB, ElasticSearch 등)와 통합하여 데이터를 수집하고, 이를 시각적으로 표현한다.

실시간 모니터링, 대시보드 관리, 경고시스템 처리에 용이하다.

 

 

도입

원래라면 모니터링은 서버를 따로두어 서비스와 별개로 두는 것이 맞다고 생각하지만 지금은 테스트용으로 내 로컬 장비를 온프레미스(On-premise)형태로 두고 데이터를 수집할 생각이다.

 

서버,장비 모니터링 데이터 -> prometheus -> grafana

  • 수집 데이터 
    • CPU, 메모리, 디스크사용량과 같은 서버 메트릭
    • 애플리케이션 요청 속도, 에러율, 응답 시간과 같은 애플리케이션 메트릭
    • 네트워크 대역폭, 연결 상태 등 네트워크 메트릭

서비스 로깅 데이터 -> winston -> elk 

  • api 로깅

ec2에 prometheus, node exporter, cadvisor, grafana를 하나의 네트워크로 도커 컴포즈를 통해 띄운다.

version: '3'

services:
  # Node Exporter 
  node_exporter:
    image: prom/node-exporter:latest
    container_name: node_exporter
    restart: always
    ports:
      - "9100:9100"
    networks:
      - monitoring

  # cAdvisor 
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    container_name: cadvisor
    restart: always
    ports:
      - "8080:8080"
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker:/var/lib/docker:ro
    networks:
      - monitoring

  # Prometheus 
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    networks:
      - monitoring

  # Grafana 
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: always
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin  
    networks:
      - monitoring
    depends_on:
      - prometheus

networks:
  monitoring:
    driver: bridge

 

  • Grafana 대시보드에서 왼쪽 메뉴에서 Configuration -> Data Sources
  • Prometheus를 선택하고, URL을 http://prometheus:9090으로 설정
  • Save & Test 버튼을 클릭하여 연결을 테스트
  • Grafana 대시보드에서 + 아이콘을 클릭한 후 Import를 선택
  • Prometheus 관련 대시보드의 ID를 입력합니다. 예를 들어, Node Exporter 관련 대시보드는 1860이다.
  • 메트릭스를 확인할 수 있다.
  • cadvisor 역시 패널을 추가하고 매트릭을 쿼리해서 시각화 할 수있다.
  • UI 엔드포인트 정보 
    • cadvisor: http://{ec2 public IP}:{cadvisor port}/docker/
    • prometheus: http://{ec2 public IP}:{prometheus port}/query
    • grafana: http://{ec2 public IP}:{grafana port}

 

아쉬운 점

현재 프리티어로 작업 중이라 모니터링 서버를 따로 두지 못한 것.

'BackEnd' 카테고리의 다른 글

Amazon Elastic Container Service 공략  (0) 2024.12.11
nestJS 실시간 채팅 앱 - [9] logging (winston)  (0) 2024.12.09
웹소켓 연결 관리 (NestJS)  (3) 2024.11.28
nestJS MongoDB 연결 및 사용하기  (0) 2024.11.25
Proxy (프록시)  (0) 2024.11.06