-
[모니터링] Prometheus + Grafana로 실시간 모니터링하기일하며 늘어가는 지식 2024. 9. 9. 11:23
오랜만에 블로그 포스팅 및 업무 관련 사용한 툴들 기록하기
시작
최근에 시작한 프로젝트에서 맡은 역할이 백엔드(기능개발 + 운영 + 관리)다..
백엔드 기능을 구현하면서 세션같은 재밌는(?)것도 공부했고, 적용도 했는데 이런건 다음에 올려야겠다.
먼저, 가장 최근에 구현한 프로메테우스 + 그라파나 도구로 실시간 리소스 데이터 수집 + 시각화를 진행했다.
간단하게, 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는 지금도 잘 모르겠다.
'일하며 늘어가는 지식' 카테고리의 다른 글
[AWS] amplify (0) 2025.01.16 [암호화] AES, RSA (0) 2025.01.06 [애플리케이션] React + Django + Nginx를 EC2에 배포! 거기에 Docker를 곁들인.. (2) (1) 2024.11.25 [애플리케이션] React + Django + Nginx를 EC2에 배포! 거기에 Docker를 곁들인.. (1) (2) 2024.11.17 [모니터링] 수집된 메트릭데이터 S3로 적재하기 (2) 2024.11.09