
EC2 서버에서 여러 테스트를 진행하며 서버 성능에 문제가 발생하지 않을지 고민해 왔습니다. 이러한 고민을 바탕으로 APM 도입을 검토하였고, 그중 Spring Boot와 호환성이 뛰어난 Prometheus와 수집한 성능 지표를 대시보드 형태로 시각화할 수 있는 Grafana를 활용해 보았습니다.
Spring Boot 애플리케이션에서 메트릭이 수집되고 시각화되기까지의 흐름은 다음과 같습니다.
Actuator (엔드포인트 생성) → Micrometer (메트릭 수집 및 포맷 변환)
→ Prometheus (엔드포인트에서 메트릭 수집)
→ Grafana (수집된 메트릭 시각화)
| 구성요소 | 역할 및 설명 |
|---|---|
| Actuator | /actuator/prometheus와 같은 엔드포인트를 생성하여, Micrometer가 수집한 메트릭을 외부에 노출합니다. |
| Micrometer | Spring Boot 애플리케이션 내부의 메트릭(JVM, HTTP 요청 등)을 수집하고, Prometheus 형식으로 변환합니다. |
| Prometheus | Micrometer가 노출한 메트릭 엔드포인트(/actuator/prometheus)에 주기적으로 접근하여 데이터를 수집합니다. |
| Grafana | Prometheus에서 수집한 메트릭 데이터를 시각화 대시보드 형태로 표현합니다. |
현재 EC2 서버에는 두 개의 애플리케이션이 실행되고 있습니다.
8080: Spring 기반의 web server60818: Spring Boot 기반의 api server이 아키텍처에서는 Prometheus는 60818 API 서버만 연결하면 충분합니다.
Prometheus는 메트릭 엔드포인트(/actuator/prometheus)가 있는 서버만 수집 대상으로 하며, 8080 Web 서버는 화면 렌더링 전용이므로 모니터링 대상에 포함하지 않아도 됩니다.
따라서 60818만 수집 대상으로 지정해도 전체 시스템 성능 모니터링이 가능합니다.
[ EC2 서버 ]
┌────────────────────┐
│ Web Server (8080) │ → HTML 렌더링 전용
│ API Server (60818) │ → Prometheus 메트릭 수집 대상
└────────────────────┘
↓
Prometheus (9090)
↓
Grafana (3000)
Prometheus와 Grafana에 접근하려면 EC2 보안 그룹에서 관련 포트를 열어야 합니다.
기본적으로 9090(Prometheus), 3000(Grafana), 60818(API 서버)이 필요하며,
8080(Web 서버)은 필요 시에만 개방합니다.
| 포트 | 용도 |
|---|---|
| 3000 | Grafana 웹 UI 접속 |
| 9090 | Prometheus 웹 UI |
| 60818 | API 서버 메트릭 수집용 |
| 8080 | Web 서버 접속용 |

Prometheus가 수집할 메트릭을 노출하려면 Spring Boot 애플리케이션에서 Actuator와 Micrometer를 활성화해야 합니다.
이 단계에서 /actuator/prometheus 엔드포인트가 생성되어 Prometheus가 데이터를 가져올 수 있습니다.
Maven 의존성 추가 (pom.xml)
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

application.properties 설정
management.endpoints.web.exposure.include=health,info,prometheus
management.endpoint.prometheus.enabled=true
Spring Boot 실행 후 http://<EC2-IP>:60818/actuator/prometheus에서 메트릭이 출력되어야 합니다.

Prometheus는 지정된 엔드포인트에서 주기적으로 데이터를 수집하는 역할을 합니다.
운영 환경에서는 안정성이 보장된 3.5.0 LTS 버전을 설치하는 것을 권장합니다.
다운로드 및 압축 해제
VER=3.5.0
wget https://github.com/prometheus/prometheus/releases/download/v${VER}/prometheus-${VER}.linux-amd64.tar.gz
tar xvf prometheus-${VER}.linux-amd64.tar.gz


실행 시 설정 파일 지정
cd prometheus-${VER}.linux-amd64
./prometheus --config.file=prometheus.yml

prometheus.yml 설정
아래는 prometheus.yml 파일에서 자주 사용하는 핵심 설정 항목과 그 의미입니다.
| 항목 | 의미 |
|---|---|
| global.scrape_interval | 메트릭을 수집하는 주기 |
| global.evaluation_interval | 규칙 및 알람을 평가하는 주기 |
| job_name | 타겟 그룹을 구분하기 위한 논리적 이름 |
| metrics_path | 메트릭이 노출되는 엔드포인트 경로 |
| targets | 실제 메트릭 수집 대상 (IP:Port) |
| labels | 타겟에 부여하는 메타데이터 (Grafana 필터, 대시보드 분류용) |
이를 바탕으로 prometheus.yml을 다음과 같이 작성합니다.
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
labels:
app: "prometheus"
- job_name: "api-server"
metrics_path: "/actuator/prometheus"
static_configs:
- targets: ["localhost:60818"]
labels:
app: "popup-paging-api"

참고로, prometheus-3.5.0.linux-amd64 폴더명을 prometheus 으로 바꾸도록 합시다.
mv prometheus-3.5.0.linux-amd64 prometheus
cd prometheus
./prometheus --config.file=prometheus.yml
Grafana는 Prometheus에서 수집한 메트릭을 시각화하는 도구입니다.
설치 후 Prometheus를 데이터 소스로 연결하고, 필요한 대시보드를 가져와 활용합니다.
Grafana 설치
sudo yum install -y https://dl.grafana.com/oss/release/grafana-10.3.1-1.x86_64.rpm
sudo systemctl enable grafana-server
sudo systemctl start grafana-server


데이터 소스 연결 및 대시보드 활용
1) http://<EC2-IP>:3000으로 접속하여 기본 계정(admin/admin)으로 로그인합니다.
2) Data Source로 Prometheus(http://localhost:9090)를 등록합니다.



3) 대시보드 Import 시 ID 4701(Spring Boot용 템플릿)을 불러옵니다.




