컨테이너 기반 애플리케이션의 성능을 실시간으로 확인하고 싶으신가요? Prometheus로 메트릭을 수집하고 Grafana로 시각화하는 모니터링 시스템 구축 방법을 친절하게 알려드립니다.
안녕하세요! 여러분이 열심히 개발하고 운영하는 서비스, 혹시 지금도 잘 돌아가고 있는지 궁금하지 않으신가요? 사용자들은 만족하고 있을지, 혹시 모르는 사이에 성능 문제가 발생하고 있지는 않은지 말이죠. 특히 컨테이너 기반 애플리케이션은 유연하고 확장성이 좋지만, 동시에 수많은 컨테이너의 상태를 한눈에 파악하기 어렵다는 과제가 있거든요. 이런 고민을 해결해 줄 멋진 솔루션이 바로 Prometheus와 Grafana 조합이랍니다!
이 글에서는 여러분의 소중한 컨테이너 기반 서비스를 안정적으로 운영할 수 있도록, Prometheus와 Grafana를 활용한 모니터링 시스템을 어떻게 처음부터 구축하는지 친절하게 알려드릴 거예요. 복잡하게만 느껴졌던 모니터링, 이제 여러분도 쉽게 시작할 수 있습니다!
📑 목차
- 모니터링, 왜 중요할까요?
- Prometheus와 Grafana, 어떤 관계일까요?
- Prometheus: 강력한 시계열 데이터 수집기
- Grafana: 아름다운 데이터 시각화 전문가
- Prometheus 설치 및 설정
- 1. Docker Compose 파일 생성
- 2. Prometheus 설정 파일 (prometheus.yml) 작성
- 3. Prometheus 실행
- 컨테이너 메트릭 수집하기: Node Exporter와 cAdvisor
- Node Exporter 활용: 호스트 시스템 모니터링
- cAdvisor로 컨테이너 상태 파악: 컨테이너별 메트릭 수집
- Grafana 설치 및 대시보드 구축
- 1. Grafana 설치
- 2. 데이터 소스 추가
- 3. 대시보드 임포트
- 실전 예제: 웹 애플리케이션 모니터링
- 1. Nginx와 Nginx Exporter 추가
- 2. Prometheus에 Nginx Exporter 추가
- 3. Grafana 대시보드에서 확인
- 마무리하며: 안정적인 시스템 운영을 위한 첫걸음
Image by Daria-Yakovleva on Pixabay
모니터링, 왜 중요할까요?
여러분은 운전할 때 자동차 계기판을 보시죠? 속도, 연료량, 엔진 온도 등 다양한 정보를 통해 차량 상태를 파악하고 안전하게 운전할 수 있잖아요. 소프트웨어 시스템도 마찬가지예요. 개발한 서비스가 잘 동작하는지, 성능은 괜찮은지, 혹시 오류가 발생하고 있지는 않은지 실시간으로 확인하는 것이 바로 모니터링입니다.
모니터링이 제대로 이루어지지 않으면 어떤 문제가 발생할 수 있을까요? 예를 들어, 사용자 수가 갑자기 폭증했는데 서버의 CPU 사용량이 치솟고 있다는 걸 알아채지 못하면, 결국 서비스는 느려지다가 멈춰버리겠죠. 혹은 데이터베이스 연결 풀이 고갈되어 장애가 발생했는데, 원인을 찾느라 몇 시간이 걸릴 수도 있고요. 이런 상황은 사용자 이탈로 이어지고, 심지어는 기업 이미지 손상까지 초래할 수 있습니다.
특히 도커(Docker)나 쿠버네티스(Kubernetes) 같은 컨테이너 기술을 사용하면, 수십, 수백 개의 컨테이너가 생성되고 사라지기를 반복하는데요. 각각의 컨테이너가 어떤 상태인지, 리소스는 얼마나 사용하고 있는지 일일이 확인하는 것은 거의 불가능에 가깝죠. 그래서 체계적인 컨테이너 모니터링 시스템은 안정적인 서비스 운영에 필수적이라고 할 수 있어요. 문제가 발생하기 전에 미리 감지하고, 발생한 문제의 원인을 신속하게 찾아 해결하는 데 결정적인 역할을 하거든요.
Prometheus와 Grafana, 어떤 관계일까요?
자, 그럼 이제 오늘 주인공인 Prometheus와 Grafana에 대해 알아볼까요? 이 둘은 모니터링 시스템을 구축할 때 환상의 짝꿍으로 불린답니다. 각각 어떤 역할을 하는지 살펴볼게요.
Prometheus: 강력한 시계열 데이터 수집기
Prometheus는 오픈 소스 모니터링 및 알림 툴킷이에요. 주로 시계열(Time-Series) 데이터베이스 역할을 하면서, 설정된 대상(타겟)으로부터 메트릭(Metric) 데이터를 주기적으로 Pull 방식으로 수집하고 저장합니다. 여기서 메트릭이란 CPU 사용량, 메모리 사용량, 네트워크 트래픽, 애플리케이션 응답 시간 등 시스템이나 애플리케이션의 상태를 나타내는 수치 데이터를 의미해요.
Prometheus의 가장 큰 특징 중 하나는 PromQL이라는 강력한 쿼리 언어를 제공한다는 점이에요. 이 쿼리 언어를 사용하면 수집된 방대한 메트릭 데이터에서 원하는 정보를 추출하고, 복잡한 연산을 수행할 수 있답니다. 예를 들어, "지난 5분 동안 특정 서버의 평균 CPU 사용률" 같은 정보를 쉽게 조회할 수 있죠.
Grafana: 아름다운 데이터 시각화 전문가
반면에 Grafana는 오픈 소스 데이터 시각화 및 대시보드 도구입니다. Prometheus가 수집하고 저장한 데이터를 가져와서, 누구나 쉽게 이해할 수 있는 아름다운 그래프, 차트, 테이블 형태로 시각화해주는 역할을 하죠. Grafana는 Prometheus뿐만 아니라 Elasticsearch, InfluxDB, MySQL 등 다양한 데이터 소스를 지원해요.
즉, Prometheus가 데이터를 수집하고 저장하는 '뇌' 역할을 한다면, Grafana는 그 데이터를 보기 좋게 보여주는 '눈' 역할을 하는 셈입니다. 이 둘이 함께라면 데이터 수집부터 분석, 시각화까지 완벽한 모니터링 환경을 구축할 수 있어요.
둘의 관계를 표로 정리하면 다음과 같아요.
| 구분 | Prometheus | Grafana |
|---|---|---|
| 주요 역할 | 메트릭 수집, 시계열 데이터 저장, PromQL 쿼리 | 데이터 시각화, 대시보드 구축, 알림 설정 (데이터 소스 연동) |
| 데이터 처리 방식 | Pull 모델 (타겟으로부터 메트릭 가져오기) | Query 모델 (데이터 소스에 쿼리 전송) |
| 핵심 기능 | PromQL, Service Discovery, Alertmanager | 다양한 시각화 패널, 대시보드 템플릿, 사용자 권한 관리 |
| 데이터베이스 | 내장 시계열 데이터베이스 | 자체 데이터베이스 없음 (외부 데이터 소스에 의존) |
Prometheus 설치 및 설정
이제 직접 모니터링 시스템을 구축해볼 시간이에요! 여기서는 Docker Compose를 활용해서 간단하게 Prometheus를 설치하고 설정하는 방법을 알려드릴게요. 도커를 사용하면 환경 구성이 훨씬 간편해지거든요.
1. Docker Compose 파일 생성
먼저, 프로젝트 루트 디렉토리에 docker-compose.yml 파일을 생성하고 아래 내용을 추가해 주세요.
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
- '--web.console.templates=/usr/share/prometheus/consoles'
restart: unless-stopped
volumes:
prometheus_data:
이 설정은 Prometheus 컨테이너를 생성하고, 로컬의 prometheus.yml 파일을 컨테이너 내부의 설정 파일로 마운트해요. prometheus_data 볼륨은 Prometheus가 수집한 시계열 데이터를 저장하는 데 사용됩니다.
2. Prometheus 설정 파일 (prometheus.yml) 작성
Prometheus가 어떤 메트릭을 수집할지 정의하는 설정 파일인 prometheus.yml을 생성하고 아래 내용을 작성해 주세요.
global:
scrape_interval: 15s # 기본 스크랩 간격
evaluation_interval: 15s # 규칙 평가 간격
scrape_configs:
- job_name: 'prometheus'
# Prometheus 자체 메트릭을 수집합니다.
static_configs:
- targets: ['localhost:9090']
global 섹션에서는 전역 스크랩 간격과 규칙 평가 간격을 설정해요. scrape_configs 섹션에서는 어떤 타겟에서 어떤 메트릭을 수집할지 정의합니다. 여기서는 Prometheus 자체 메트릭을 수집하도록 설정했어요.
3. Prometheus 실행
이제 터미널에서 docker-compose.yml과 prometheus.yml 파일이 있는 디렉토리로 이동한 다음 다음 명령어를 실행하면 Prometheus가 시작됩니다.
docker-compose up -d
브라우저를 열고 http://localhost:9090으로 접속하면 Prometheus UI를 확인할 수 있을 거예요. 'Status' -> 'Targets' 메뉴에서 'prometheus' 잡이 'UP' 상태인지 확인해 보세요!
Image by ValterM on Pixabay
컨테이너 메트릭 수집하기: Node Exporter와 cAdvisor
Prometheus가 잘 동작하는 것을 확인했으니, 이제 컨테이너 환경의 실제 메트릭을 수집해볼 차례입니다. 이를 위해 Exporter라는 도우미들을 활용할 거예요. Exporter는 시스템이나 애플리케이션의 메트릭을 Prometheus가 이해할 수 있는 형식으로 노출시켜주는 역할을 합니다.
Node Exporter 활용: 호스트 시스템 모니터링
Node Exporter는 서버의 CPU 사용량, 메모리, 디스크 I/O, 네트워크 트래픽 등 호스트 시스템 수준의 메트릭을 수집하는 데 사용돼요. 컨테이너가 동작하는 물리/가상 서버의 전반적인 상태를 파악하는 데 필수적이죠.
docker-compose.yml 파일에 Node Exporter 서비스를 추가합니다.
version: '3.8'
services:
prometheus:
# ... (기존 Prometheus 설정) ...
node_exporter:
image: prom/node-exporter:latest
container_name: node_exporter
ports:
- "9100:9100"
command:
- '--path.rootfs=/host'
volumes:
- /:/host:ro,rslave # 호스트의 루트 파일 시스템을 읽기 전용으로 마운트
restart: unless-stopped
그리고 prometheus.yml 파일에도 Node Exporter를 스크랩하도록 설정해야겠죠?
# ... (기존 global 및 prometheus job 설정) ...
scrape_configs:
# ... (기존 prometheus job 설정) ...
- job_name: 'node_exporter'
static_configs:
- targets: ['node_exporter:9100'] # Docker Compose 내부에서는 서비스 이름으로 접근
docker-compose up -d로 다시 실행한 후 Prometheus UI의 'Targets'에서 node_exporter가 'UP' 상태인지 확인해 보세요. 이제 호스트의 CPU 사용률(node_cpu_seconds_total), 사용 가능한 메모리(node_memory_MemAvailable_bytes) 같은 메트릭을 PromQL로 조회할 수 있습니다.
cAdvisor로 컨테이너 상태 파악: 컨테이너별 메트릭 수집
cAdvisor (Container Advisor)는 구글에서 개발한 도구로, 도커 컨테이너의 개별 리소스 사용량 메트릭을 수집하는 데 특화되어 있어요. CPU, 메모리, 네트워크, 파일 시스템 사용량 등 컨테이너별 상세 정보를 얻을 수 있어, 컨테이너 기반 모니터링에서 핵심적인 역할을 합니다.
docker-compose.yml 파일에 cAdvisor 서비스를 추가합니다.
version: '3.8'
services:
prometheus:
# ... (기존 Prometheus 설정) ...
node_exporter:
# ... (기존 Node Exporter 설정) ...
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
restart: unless-stopped
cAdvisor는 호스트의 여러 경로를 마운트하여 컨테이너 정보를 수집합니다. 이제 prometheus.yml에도 cAdvisor를 스크랩하도록 추가해 주세요.
# ... (기존 global 및 prometheus, node_exporter job 설정) ...
scrape_configs:
# ... (기존 prometheus, node_exporter job 설정) ...
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080'] # Docker Compose 내부에서는 서비스 이름으로 접근
다시 docker-compose up -d로 실행 후 Prometheus 'Targets'에서 cadvisor가 'UP' 상태인지 확인합니다. 이제 container_cpu_usage_seconds_total, container_memory_usage_bytes 등 컨테이너별 상세 메트릭을 확인할 수 있게 되었어요. 이 메트릭들은 특정 컨테이너의 리소스 사용량이 과도한지 아닌지 판단하는 데 아주 유용하답니다.
Grafana 설치 및 대시보드 구축
데이터는 이제 Prometheus에 차곡차곡 쌓이고 있지만, 숫자로만 보는 건 한계가 있죠? Grafana를 통해 이 데이터를 멋진 대시보드로 시각화해 봅시다!
1. Grafana 설치
docker-compose.yml 파일에 Grafana 서비스를 추가합니다.
version: '3.8'
services:
prometheus:
# ... (기존 Prometheus 설정) ...
node_exporter:
# ... (기존 Node Exporter 설정) ...
cadvisor:
# ... (기존 cAdvisor 설정) ...
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
restart: unless-stopped
volumes:
prometheus_data:
grafana_data: # Grafana 데이터 볼륨 추가
docker-compose up -d 명령어로 Grafana를 실행합니다. 이제 http://localhost:3000으로 접속하면 Grafana 로그인 화면이 나타날 거예요. 초기 로그인 정보는 ID: admin, Password: admin입니다. 로그인 후에는 비밀번호 변경을 요청할 거예요.
2. 데이터 소스 추가
Grafana에서 Prometheus 데이터를 사용하려면 데이터 소스로 Prometheus를 추가해야 해요.
- Grafana 로그인 후 왼쪽 메뉴에서 톱니바퀴 아이콘(Configuration)을 클릭하고 'Data Sources'를 선택합니다.
- 'Add data source' 버튼을 클릭합니다.
- 'Prometheus'를 선택합니다.
- 'HTTP' 섹션의 'URL' 필드에
http://prometheus:9090을 입력합니다. (Grafana 컨테이너에서 Prometheus 컨테이너로 접근하기 위한 내부 Docker Compose 서비스 이름) - 'Save & test' 버튼을 클릭하여 연결을 확인합니다. "Data source is working" 메시지가 뜨면 성공이에요!
3. 대시보드 임포트
Grafana는 다양한 대시보드를 쉽게 가져와 사용할 수 있도록 Grafana Labs에서 수많은 대시보드 템플릿을 제공하고 있어요. 우리가 설치한 Node Exporter와 cAdvisor를 위한 대시보드도 물론 있답니다!
- 왼쪽 메뉴에서 '+' 아이콘을 클릭하고 'Import'를 선택합니다.
- Node Exporter Full 대시보드 ID인
1860을 'Import via grafana.com' 필드에 입력하고 'Load'를 클릭합니다. - Prometheus 데이터 소스를 선택한 후 'Import' 버튼을 클릭합니다.
- 마찬가지로 cAdvisor 대시보드 ID인
12884를 입력하여 임포트합니다.
이제 왼쪽 메뉴에서 'Dashboards'를 클릭하면 방금 임포트한 대시보드들을 볼 수 있을 거예요. 대시보드를 클릭하면 호스트와 컨테이너의 실시간 메트릭이 멋진 그래프로 시각화되어 나타나는 것을 확인할 수 있습니다. CPU 사용률, 메모리 사용량, 디스크 I/O 등 중요한 정보들을 한눈에 파악할 수 있죠! 정말 편리하죠?
Image by Hervejean on Pixabay
실전 예제: 웹 애플리케이션 모니터링
지금까지는 시스템 및 컨테이너 리소스 모니터링에 집중했는데요, 실제 운영에서는 애플리케이션 자체의 메트릭을 모니터링하는 것도 매우 중요합니다. 예를 들어, 웹 애플리케이션의 요청 처리량, 응답 시간, 오류 발생률 등을 파악하는 것이죠.
대부분의 최신 웹 프레임워크나 라이브러리(예: Spring Boot Actuator, Node.js Prometheus Client)는 Prometheus Exporter를 쉽게 통합할 수 있는 기능을 제공합니다. 여기서는 간단한 Nginx 웹 서버를 예시로 들어볼게요. Nginx는 기본적으로 Prometheus Exporter를 제공하지 않지만, nginx-exporter와 같은 서드파티 Exporter를 통해 메트릭을 노출할 수 있습니다.
1. Nginx와 Nginx Exporter 추가
docker-compose.yml 파일에 Nginx와 nginx-exporter 서비스를 추가합니다.
version: '3.8'
services:
prometheus:
# ...
node_exporter:
# ...
cadvisor:
# ...
grafana:
# ...
nginx:
image: nginx:latest
container_name: web_nginx
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro # Nginx 설정 파일 마운트
restart: unless-stopped
nginx_exporter:
image: nginx/nginx-prometheus-exporter:latest # 예시 이미지, 실제는 다른 이미지를 사용할 수 있습니다.
container_name: nginx_exporter
ports:
- "9113:9113"
environment:
- NGINX_SCRAPE_URI=http://web_nginx/stub_status # Nginx의 상태 페이지 URL
restart: unless-stopped
nginx.conf 파일에는 Nginx의 상태 페이지(stub_status)를 활성화하는 설정이 필요해요.
# nginx.conf 예시
events {
worker_connections 1024;
}
http {
server {
listen 80;
location / {
return 200 'Hello from Nginx!';
}
location /stub_status {
stub_status on;
allow 127.0.0.1; # exporter가 접근할 수 있도록 허용
deny all;
}
}
}
2. Prometheus에 Nginx Exporter 추가
prometheus.yml 파일에 nginx_exporter를 스크랩하도록 설정합니다.
# ... (기존 scrape_configs) ...
- job_name: 'nginx_exporter'
static_configs:
- targets: ['nginx_exporter:9113']
이제 docker-compose up -d로 다시 실행하면, http://localhost:80으로 접속할 때마다 Nginx의 요청 처리량, 활성 연결 수 등의 메트릭(nginx_up, nginx_connections_active 등)이 Prometheus로 수집될 거예요.
3. Grafana 대시보드에서 확인
Grafana에서 새로운 대시보드를 만들거나 기존 대시보드에 패널을 추가하여 Nginx 관련 메트릭을 시각화할 수 있습니다. 예를 들어, nginx_connections_active 메트릭을 PromQL 쿼리로 조회하여 현재 활성 연결 수를 그래프로 볼 수 있죠. 이렇게 하면 웹 애플리케이션의 부하 상태를 실시간으로 파악하고, 필요하다면 스케일 아웃 등의 조치를 취할 수 있답니다.
애플리케이션에서 직접 Prometheus 클라이언트 라이브러리를 사용하여 비즈니스 로직과 관련된 커스텀 메트릭(예: 회원가입 성공률, 특정 API 호출 횟수)을 노출한다면, 더욱 정교한 모니터링이 가능해집니다. 이처럼 Prometheus와 Grafana는 인프라부터 애플리케이션까지 전반적인 모니터링을 가능하게 해주는 강력한 도구입니다.
마무리하며: 안정적인 시스템 운영을 위한 첫걸음
어떠셨나요? Prometheus로 컨테이너와 호스트의 메트릭을 수집하고, Grafana로 그 데이터를 아름답게 시각화하는 과정이 생각보다 어렵지 않다는 것을 느끼셨으리라 생각해요. 이 가이드를 통해 여러분은 컨테이너 기반 애플리케이션 모니터링 시스템 구축의 탄탄한 기반을 다지신 겁니다.
이렇게 구축된 모니터링 시스템은 단순히 문제가 발생했는지 알려주는 것을 넘어, 서비스의 성능 병목 지점을 찾고, 향후 발생할 수 있는 문제를 예측하며, 더 나아가 시스템 최적화와 안정적인 서비스 운영에 결정적인 도움을 줄 거예요. 마치 어두운 밤길을 밝혀주는 등대처럼 말이죠!
물론 오늘 다룬 내용은 아주 기본적인 시작점이고, 실제 운영 환경에서는 Prometheus Alertmanager를 통한 알림 설정, Service Discovery를 활용한 동적인 타겟 관리, 장기 데이터 저장을 위한 Thanos 같은 솔루션 연동 등 더 많은 고려사항이 있을 수 있습니다. 하지만 핵심은 바로 이 조합, Prometheus와 Grafana라는 것을 잊지 마세요.
이제 여러분의 손으로 직접 모니터링 시스템을 구축해보고, 서비스의 건강 상태를 실시간으로 확인하는 즐거움을 경험해 보시길 바랍니다. 혹시 구축 과정에서 궁금한 점이 있거나, 더 알고 싶은 부분이 있다면 언제든지 댓글로 남겨주세요! 여러분의 안정적인 서비스 운영을 응원합니다!
📌 함께 읽으면 좋은 글
- [개발 도구] Postman, Insomnia, Hoppscotch 전격 비교: API 개발 및 테스트 효율 높이는 도구 선택 가이드
- [보안] DevSecOps 문화 도입을 위한 CI/CD 파이프라인 보안 자동화 전략
- [기술 리뷰] Spring Boot, NestJS, Django 비교 분석: 엔터프라이즈 백엔드 개발을 위한 프레임워크 선택 가이드
이 글이 도움이 되셨다면 공감(♥)과 댓글로 응원해 주세요!
궁금한 점이나 다루었으면 하는 주제가 있다면 댓글로 남겨주세요.
'튜토리얼' 카테고리의 다른 글
| VS Code 원격 개발 환경 구축: SSH와 Dev Containers 활용 실전 가이드 (1) | 2026.07.06 |
|---|---|
| GitHub Actions로 웹 애플리케이션 배포 자동화: CI/CD 구축 실전 가이드 (0) | 2026.07.05 |
| ESLint, Prettier, Husky, lint-staged 통합 설정 가이드: 코드 품질과 컨벤션 유지를 위한 완벽 전략 (0) | 2026.07.04 |
| VS Code Dev Containers 완벽 가이드: 컨테이너 기반 개발 환경 구축 마스터하기 (1) | 2026.07.03 |
| Docker Compose로 로컬 개발 환경 효율적으로 구축하기 실전 가이드 (0) | 2026.07.03 |