Prometheus와 Grafana를 이용한 API 서버 APM 구축 가이드

yedi·2025년 9월 5일
post-thumbnail

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 server
  • 포트 60818: 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)


설정 및 적용 과정

1. EC2 보안 그룹 인바운드 설정

Prometheus와 Grafana에 접근하려면 EC2 보안 그룹에서 관련 포트를 열어야 합니다.
기본적으로 9090(Prometheus), 3000(Grafana), 60818(API 서버)이 필요하며,
8080(Web 서버)은 필요 시에만 개방합니다.

포트 용도
3000 Grafana 웹 UI 접속
9090 Prometheus 웹 UI
60818 API 서버 메트릭 수집용
8080 Web 서버 접속용

2. API 서버(Spring Boot) 설정

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에서 메트릭이 출력되어야 합니다.

3. 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

4. Grafana 설치 및 설정

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용 템플릿)을 불러옵니다.


완료되면 아래와 같이 실시간으로 서버 대시보드를 확인할 수 있습니다.

0개의 댓글