본문 바로가기

[???] Prometheus + Grafana로 실시간 모니터링하기

by 잼있는잼니 2024. 9. 9.

 

오랜만에 블로그 포스팅 및 업무 관련 사용한 툴들 기록하기


시작

 

최근에 시작한 프로젝트에서 맡은 역할이 백엔드(기능개발 + 운영 + 관리)다..

 

백엔드 기능을 구현하면서 세션같은 재밌는(?)것도 공부했고, 적용도 했는데 이런건 다음에 올려야겠다.

 

먼저, 가장 최근에 구현한 프로메테우스 + 그라파나 도구로 실시간 리소스 데이터 수집 + 시각화를 진행했다.

 

간단하게, Prometheus는 애플리케이션이나 시스템의 다양한 메트릭을 수집하는 오픈소스이며, Grafana는 Prometheus와 연동해서 수집한 메트릭을 이용해 실시간 대시보드를 구축하는 도구이다.

 

여기서, 메트릭은 서비스, 성능, 상태등 지표를 낼 수 있는 값들을 측정할 수 있다.

메트릭 이름, 메트릭 측정된 타임스탬프(시간), 측정된 메트릭 값의 정보로 구성된다.


 

프로메테우스 아키텍처


아키텍처를 보면 Prometheus server는 타겟으로부터 Pull 형식으로 데이터를 주기적으로 가져오고, HDD/SSD에 임시로저장하고, PromQL을 통해 Grafana 같은 시각화툴과 연동되며, 특정 메트릭에 대해서 알람을 보낼수 있게 되어있다.

 


 

Docker 와 Docker-compose를 이용해서 Prometheus와 Grafana를 배포했다. ( Docker, Docker-compose는 설치되어 있다고 가정)

 

Docker-compose를 이용해 배포를 진행하기에 필요한건, prometheus.yml 과 docker-compose.yml 파일이다.

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node_exporter'
    static_configs:
      - targets: ['node_exporter:9100']

  - job_name: 'cadvisor
    static_configs:
      - targets: ['cadvisor:8080']

 

  • 위는 prometheus.yml 파일
  • 전체적으로 메트릭 수집 간격은 15초
  • 데이터 수집 대상과 대상의 위치(?)가 정의되어 있다.
  • 호스트 시스템 메트릭 -> node_exporter
  • docker 내부 메트릭 -> cadvisor
  • 모두 기본 포트로 설정해두었다.

version: '3'

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml  # prometheus 설정 파일 매핑
    ports:
      - "9090:9090"  # Prometheus의 기본 포트
    restart: always
    deploy:
      resources:
        limits:
          cpus: "0.2"
          memory: 256M 
    cpuset: "3"  # CPU 4번 사용

  node_exporter:
    image: prom/node-exporter:latest
    container_name: node_exporter
    ports:
      - "9100:9100"  # Node Exporter의 기본 포트
    restart: always
    deploy:
      resources:
        limits:
          cpus: "0.1"  
          memory: 64M  
    cpuset: "3"
  
  cadvisor:
    image: gcr.io/cadvisor/cadvisor
    container_name: cadvisor
    ports:
      - "8080:8080"  # cAdvisor의 기본 포트
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
      - /dev/disk/:/dev/disk:ro
    restart: always
    deploy:
      resources:
        limits:
          cpus: "0.2"  
          memory: 128M  
    cpuset: "3"  

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "8084:3000"  # Grafana의 내부 포트를 외부 포트 8084로 매핑
    restart: always
    volumes:
      - grafana-storage:/var/lib/grafana 
    deploy:
      resources:
        limits:
          cpus: "0.5"  
          memory: 256M 
    cpuset: "3" 

volumes:
  grafana-storage:
  • 위는 dockercompose.yml 파일
  • 우선, prometheus.yml 파일 매핑시키기
  • 모든 도커 이미지에 대해, resource 제한을 걸어두기( 최소한의 자원만 할당하고 싶었기 때문에..)
  • 기본적으로 모든 도구들 기본 포트 사용 -> Grafana는 외부 포트 8084로 매핑하고, ALB를 통해 8084 포트만 뚫기

 

관리하기 편하게(?) 컨테이너를 이용하여 진행했다.

  • docker-compose up -d 를 이용해서 EC2에 올리게되면 위의 yml 파일에 세팅한 컨테이너 이름으로 띄워지게 된다.
  • web ui에서의 갱신시간을 짧게하면, CPU 사용률이 요동치는 걸 볼 수 있다.

도커 컨테이너의 사용량

  • cadvisor를 통해 수집한 메트릭
  • 도커 컨테이너의 각 cpu, memory, I/O 관련된 메트릭을 실시간으로 볼 수 있다.
  • 위 패널은 아래의 대시보드를 import 하였다
  • Docker-cAdvisor | Grafana Labs
 

Docker-cAdvisor | Grafana Labs

Thank you! Your message has been received!

grafana.com

 

EC2의 사용량

  • node_exporter를 통해 수집한 메트릭
  • EC2의 cpu, memory, I/O, Network traffic 등 다양한 메트릭을 실시간으로 볼 수 있다.
  • 위 패널은 아래의 대시보드를 import 하였다
  • Node Exporter Full | Grafana Labs
 

Node Exporter Full | Grafana Labs

Thank you! Your message has been received!

grafana.com


 

 

실제로, EC2에 올리기전엔 설치형으로 진행해 보았다만, 서비스 같은경우(web1, web2) 도커 컨테이너로 부하 분산하고, ALB로 로드밸런싱 설정하면서, 도커를 이용하는게 편해서, EC2의 경우 docker-compose로 현재 이용중에 있다.

 

  • 이제 여기에 추가해야하는게, Prometheus가 수집한 메트릭은 일정기간(세팅X -> 15일)만 임시보관을 하는데, 이 데이터를 저장하는 툴을 이용해 저장하는게 1차 목표다.
  • 툴 이름은 타노스.......
  • 다음엔 세션관련해서 예제랑 올려보겠다.

 

PromQL는 지금도 잘 모르겠다.

댓글