튜토리얼

Prometheus Grafana 애플리케이션 모니터링 시스템 구축 가이드: 지표 수집부터 시각화까지

강코의 코딩 일기 2026. 5. 15. 17:19
반응형

Prometheus와 Grafana를 활용해 애플리케이션 모니터링 시스템을 직접 구축한 경험을 공유합니다. 지표 수집부터 대시보드 시각화, 실전 팁까지 상세 가이드를 통해 안정적인 시스템 운영 노하우를 얻어가세요.

안녕하세요! 개발자의 삶에서 서비스의 안정적인 운영만큼 중요한 것이 또 있을까요? 아무리 멋진 기능을 만들어도 서비스가 느려지거나 멈춰버린다면 사용자 경험은 한없이 추락하게 됩니다. 하지만 눈에 보이지 않는 문제들을 어떻게 파악하고 빠르게 대응할 수 있을까요? 바로 애플리케이션 모니터링 시스템의 힘이 필요할 때입니다.

오랫동안 다양한 모니터링 툴을 경험하면서, 저는 PrometheusGrafana 조합이 비용 효율적이면서도 강력한 기능을 제공한다는 점을 직접 체감했습니다. 이 글에서는 제가 실제로 적용하고 운영해 본 경험을 바탕으로, Prometheus와 Grafana를 활용해 애플리케이션 모니터링 시스템을 구축하는 가이드를 상세하게 공유하고자 합니다. 지표 수집부터 아름다운 대시보드 시각화까지, 이 가이드를 통해 여러분의 서비스도 더욱 견고하게 운영되기를 바랍니다.

Prometheus와 Grafana를 활용한 애플리케이션 모니터링 시스템 구축 가이드: 지표 수집부터 대시보드 시각화까지 - computer, laptop, tech, blue computer, blue laptop, blue tech, computer, laptop, tech, tech, tech, tech, tech

Image by yeiferr on Pixabay

애플리케이션 모니터링, 왜 중요할까요?

여러분은 서비스에서 갑자기 에러가 발생했을 때, 혹은 특정 API 응답 속도가 현저히 느려졌을 때, 무엇부터 확인하시나요? 로그 파일을 뒤져보거나, 서버에 접속해 CPU 사용률을 확인하는 일련의 과정들은 이미 문제가 발생한 후에 이루어지는 사후 대응에 가깝습니다. 진정한 안정적인 서비스 운영은 문제가 발생하기 전에 징후를 감지하고, 발생 시에는 빠르고 정확하게 원인을 파악하여 해결하는 데 있습니다.

애플리케이션 모니터링은 단순히 서버의 CPU, 메모리 사용량을 보는 것을 넘어, 애플리케이션 내부에서 발생하는 다양한 지표(Metrics)들을 수집하고 분석하는 과정입니다. 예를 들어, 웹 서비스라면 초당 요청 수(RPS), 평균 응답 시간, 에러 발생률, 데이터베이스 쿼리 시간 등을 들 수 있습니다. 이러한 지표들을 지속적으로 관찰함으로써 다음과 같은 이점을 얻을 수 있습니다.

  • 문제의 사전 감지: 특정 지표가 임계치를 넘어서면 알림을 받아 잠재적 문제를 미리 파악할 수 있습니다.
  • 빠른 원인 분석: 여러 지표를 동시에 시각화하여 문제 발생 시 어떤 부분이 영향을 미 주었는지 빠르게 유추할 수 있습니다.
  • 성능 최적화: 특정 구간에서 성능 병목이 발생하는 지점을 찾아내어 개선점을 도출할 수 있습니다.
  • 용량 계획: 서비스 성장 추이를 예측하고 필요한 인프라 자원을 미리 확보하는 데 도움을 줍니다.

저는 직접 모니터링 시스템을 구축하고 나서야, 단순히 "잘 돌아가겠지"라고 막연히 생각했던 것들이 실제로는 수많은 잠재적 위험을 안고 있었다는 것을 깨달았습니다. 이제는 눈으로 직접 지표를 확인하며 더욱 자신 있게 서비스를 운영하고 있습니다.

Prometheus: 강력한 지표 수집 엔진

수많은 모니터링 툴 중에서 Prometheus가 각광받는 이유는 무엇일까요? 제가 직접 써보니 Prometheus는 시계열 데이터베이스(Time-series Database, TSDB)를 기반으로 한 강력한 지표 수집 및 저장 시스템이라는 점이 가장 매력적이었습니다. Pull 방식의 지표 수집, 유연한 쿼리 언어(PromQL), 그리고 Alertmanager를 통한 경고 시스템 연동은 Prometheus를 모니터링 스택의 핵심으로 자리매김하게 했습니다.

Prometheus의 아키텍처와 작동 방식

Prometheus는 기본적으로 Pull 방식으로 지표를 수집합니다. 즉, Prometheus 서버가 모니터링 대상(Target)에 주기적으로 HTTP 요청을 보내 지표를 가져오는 방식입니다. 이는 에이전트를 일일이 설치하고 관리해야 하는 Push 방식의 부담을 덜어줍니다.

주요 구성 요소는 다음과 같습니다.

  • Prometheus Server: 지표를 수집하고 저장하며, PromQL을 통해 쿼리를 처리합니다.
  • Exporters: 모니터링 대상(애플리케이션, 서버, 데이터베이스 등)의 지표를 Prometheus가 수집할 수 있는 형태로 노출하는 역할을 합니다. 예를 들어, Node Exporter는 서버의 CPU, 메모리, 디스크 지표를, cAdvisor는 Docker 컨테이너 지표를 노출합니다.
  • Pushgateway: 단발성 작업이나 짧은 주기의 배치 작업처럼 Pull 방식에 적합하지 않은 지표를 Push 방식으로 Prometheus에 전달할 때 사용합니다.
  • Alertmanager: Prometheus 서버에서 정의된 경고 규칙에 따라 알림을 받고, 중복 알림을 제거하거나 적절한 채널(Slack, Email 등)로 전달하는 역할을 합니다.

`prometheus.yml` 설정 예시

Prometheus의 설정은 `prometheus.yml` 파일을 통해 이루어집니다. 저는 주로 `scrape_configs` 섹션을 활용하여 어떤 대상을 모니터링할지 정의합니다.

global:
  scrape_interval: 15s # 모든 Job의 기본 수집 주기
  evaluation_interval: 15s # 경고 규칙 평가 주기

scrape_configs:
  - job_name: 'prometheus' # Prometheus 자체 모니터링
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node_exporter' # 서버 지표 모니터링 (Node Exporter)
    static_configs:
      - targets: ['localhost:9100'] # Node Exporter 기본 포트

  - job_name: 'my_application' # 직접 개발한 애플리케이션 지표 모니터링
    metrics_path: '/actuator/prometheus' # Spring Boot Actuator 경로 예시
    static_configs:
      - targets: ['my-app-server:8080']

위 예시처럼 `job_name`으로 모니터링 대상을 구분하고, `targets`에 대상의 주소를 지정합니다. `metrics_path`를 통해 지표를 노출하는 특정 경로를 지정할 수도 있습니다. 저는 Spring Boot 애플리케이션의 경우 Spring Boot Actuator를 활용하여 손쉽게 Prometheus 지표를 노출했습니다. 이는 개발자의 부담을 크게 줄여주는 유용한 기능입니다.

Grafana: 시각화의 마법사

Prometheus가 지표를 수집하고 저장하는 엔진이라면, Grafana는 그 지표들을 아름답고 직관적인 대시보드로 시각화하는 마법사입니다. 저는 Grafana를 처음 사용했을 때, 다양한 패널 타입과 강력한 커스터마이징 기능에 깊은 인상을 받았습니다. 복잡한 데이터를 한눈에 파악할 수 있게 해주는 Grafana는 모니터링 시스템의 꽃이라고 할 수 있습니다.

Grafana의 역할과 데이터 소스 연결

Grafana는 다양한 데이터 소스(Data Source)를 지원합니다. Prometheus는 물론, InfluxDB, Elasticsearch, MySQL, PostgreSQL 등 여러 종류의 데이터베이스에서 데이터를 가져와 시각화할 수 있습니다. 모니터링 시스템 구축 시, Grafana에 Prometheus를 데이터 소스로 추가하는 것이 첫 단계입니다.

Prometheus 데이터 소스 추가 과정:

  1. Grafana 웹 UI에 접속합니다.
  2. Configuration -> Data Sources 메뉴로 이동합니다.
  3. Add data source를 클릭하고 Prometheus를 선택합니다.
  4. URL에 Prometheus 서버의 주소(예: `http://localhost:9090`)를 입력하고 Save & Test 버튼을 눌러 연결을 확인합니다.

이 과정은 매우 직관적이며, 연결이 성공하면 이제 Grafana에서 Prometheus의 지표를 활용할 준비가 된 것입니다.

대시보드 생성과 PromQL 쿼리

Grafana 대시보드는 패널(Panel)들의 집합으로 구성됩니다. 각 패널은 특정 지표를 그래프, 테이블, 숫자 등으로 표현합니다. 저는 주로 그래프 패널을 활용하여 시계열 데이터를 시각화하고, 특정 순간의 값을 확인하기 위해 Stat 패널을 사용합니다.

패널에서 데이터를 가져오기 위해서는 PromQL(Prometheus Query Language)을 사용합니다. PromQL은 매우 유연하고 강력한 쿼리 언어로, 복잡한 집계, 필터링, 함수 적용 등을 통해 원하는 데이터를 정확하게 추출할 수 있습니다.

PromQL 쿼리 예시:

  • `node_cpu_seconds_total{mode="idle"}`: 각 CPU의 유휴 시간을 나타내는 지표.
  • `rate(node_cpu_seconds_total{mode="idle"}[5m])`: 지난 5분 동안의 CPU 유휴 시간 변화율 (초당 증가량). 이를 1에서 빼면 CPU 사용률을 구할 수 있습니다.
  • `sum(rate(http_requests_total{job="my_application", status_code="200"}[1m])) by (instance)`: `my_application`에서 발생한 200 응답 코드를 가진 HTTP 요청의 1분당 평균 처리량을 인스턴스별로 합산.

처음에는 PromQL이 다소 생소하게 느껴질 수 있지만, 몇 번 사용해보면 그 강력함에 매료될 것입니다. 저는 주로 `rate()`, `sum()`, `avg()`, `irate()`, `histogram_quantile()` 등의 함수를 자주 활용합니다. 특히 `rate()` 함수는 변화율을 측정할 때 매우 유용하며, `histogram_quantile()`은 API 응답 시간의 P95, P99와 같은 백분위수를 구할 때 필수적입니다.

# HTTP 요청 처리량 (1분당)
sum(rate(http_requests_total{job="my_application"}[1m])) by (instance)

# HTTP 요청 에러율 (1분당)
sum(rate(http_requests_total{job="my_application", status_code=~"5.."}[1m])) by (instance)
/
sum(rate(http_requests_total{job="my_application"}[1m])) by (instance) * 100

# API 응답 시간 95th 백분위수 (Histogram 지표 사용)
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket{job="my_application"}[5m])) by (le, instance))

이러한 쿼리들을 조합하여 애플리케이션의 상태를 한눈에 파악할 수 있는 대시보드를 구성할 수 있습니다. 저는 처음에 Grafana 공식 사이트나 커뮤니티에서 제공하는 대시보드 템플릿을 임포트하여 시작했고, 점차 서비스 특성에 맞춰 커스터마이징하는 방식으로 익숙해졌습니다.

Prometheus와 Grafana를 활용한 애플리케이션 모니터링 시스템 구축 가이드: 지표 수집부터 대시보드 시각화까지 - computer, summary, chart, business, seo, presentation, business presentation, screen, laptop screen, growth, notebook, laptop, digital notebook, computer, chart, business, business, seo, seo, seo, seo, seo, presentation, growth, growth, laptop

Image by Lalmch on Pixabay

실전 구축 가이드: 단계별 따라하기

이제 실제로 Prometheus와 Grafana를 설치하고 애플리케이션을 모니터링하는 과정을 단계별로 살펴보겠습니다. 저는 Docker Compose를 활용하여 빠르고 쉽게 환경을 구축하는 방법을 선호합니다.

1. Docker Compose를 이용한 Prometheus, Grafana 설치

가장 먼저 Prometheus와 Grafana를 실행할 `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'
    networks:
      - monitoring_net

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin
    networks:
      - monitoring_net

  node_exporter: # 서버 자체 지표를 위한 Node Exporter (선택 사항)
    image: prom/node-exporter:latest
    container_name: node_exporter
    ports:
      - "9100:9100"
    command:
      - '--path.rootfs=/host'
    volumes:
      - /:/host:ro,rslave
    networks:
      - monitoring_net

volumes:
  prometheus_data:
  grafana_data:

networks:
  monitoring_net:

이 파일과 함께 Prometheus 설정 파일인 `prometheus.yml`도 준비합니다. `node_exporter`를 함께 구성하여 호스트 서버의 지표도 바로 수집할 수 있도록 했습니다.

`prometheus.yml` (간소화 버전):

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['prometheus:9090'] # Docker 네트워크에서 서비스 이름으로 접근

  - job_name: 'grafana'
    static_configs:
      - targets: ['grafana:3000'] # Grafana 자체 지표

  - job_name: 'node_exporter'
    static_configs:
      - targets: ['node_exporter:9100'] # Node Exporter

이제 터미널에서 `docker-compose up -d` 명령어를 실행하면 Prometheus (9090 포트)와 Grafana (3000 포트), Node Exporter (9100 포트)가 실행됩니다.

2. 애플리케이션에 지표 노출하기

Prometheus가 지표를 수집하려면, 모니터링 대상 애플리케이션이 특정 엔드포인트로 지표를 노출해야 합니다. 저는 주로 다음과 같은 방법을 사용합니다.

Spring Boot 애플리케이션: Spring Boot Actuator 활용

Spring Boot 프로젝트에서는 `spring-boot-starter-actuator` 의존성을 추가하고, `application.properties` 또는 `application.yml`에 설정을 추가하는 것만으로 Prometheus 지표를 노출할 수 있습니다. 이는 정말 간편하고 강력한 기능입니다.

`pom.xml` (Maven) 또는 `build.gradle` (Gradle) 의존성 추가:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

`application.yml` 설정:

management:
  endpoints:
    web:
      exposure:
        include: prometheus,health # prometheus 엔드포인트 노출
  metrics:
    tags:
      application: my-spring-app # 모든 지표에 공통 태그 추가

이렇게 설정하면 애플리케이션이 실행될 때 `http://<your-app-ip>:<port>/actuator/prometheus` 경로로 Prometheus가 수집할 수 있는 지표를 노출합니다. 이제 Prometheus의 `prometheus.yml`에 해당 애플리케이션을 타겟으로 추가하면 됩니다.

  - job_name: 'my_spring_application'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['<your-spring-app-ip>:8080'] # 실제 애플리케이션 IP와 포트

Python 애플리케이션: Prometheus Python Client 라이브러리 활용

Spring Boot처럼 편리한 프레임워크가 아닌 경우, 각 언어별 Prometheus Client 라이브러리를 활용하여 지표를 직접 노출해야 합니다. Python의 경우 `prometheus_client` 라이브러리를 사용할 수 있습니다.

설치:

pip install prometheus_client

간단한 Python Flask 애플리케이션 예시:

from flask import Flask
from prometheus_client import generate_latest, Counter, Histogram, Gauge
import time

app = Flask(__name__)

# 지표 정의
REQUEST_COUNT = Counter('http_requests_total', 'Total HTTP Requests', ['method', 'endpoint'])
REQUEST_LATENCY = Histogram('http_request_duration_seconds', 'HTTP Request Latency', ['method', 'endpoint'])
IN_PROGRESS_REQUESTS = Gauge('http_requests_in_progress', 'In progress HTTP requests')

@app.route('/')
def hello():
    REQUEST_COUNT.labels(method='GET', endpoint='/').inc()
    start_time = time.time()
    IN_PROGRESS_REQUESTS.inc()
    try:
        # 실제 작업 수행
        time.sleep(0.1)
        return "Hello, World!"
    finally:
        IN_PROGRESS_REQUESTS.dec()
        REQUEST_LATENCY.labels(method='GET', endpoint='/').observe(time.time() - start_time)

@app.route('/metrics')
def metrics():
    return generate_latest(), 200, {'Content-Type': 'text/plain; version=0.0.4; charset=utf-8'}

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

이 예시에서는 `/metrics` 엔드포인트를 통해 Prometheus가 수집할 수 있는 지표를 노출합니다. 카운터(Counter), 히스토그램(Histogram), 게이지(Gauge) 등 다양한 지표 타입을 활용하여 애플리케이션의 핵심 데이터를 측정할 수 있습니다.

Prometheus의 `prometheus.yml`에는 다음과 같이 추가합니다.

  - job_name: 'my_python_application'
    metrics_path: '/metrics' # Python 앱의 지표 경로
    static_configs:
      - targets: ['<your-python-app-ip>:5000']

3. Grafana 대시보드 임포트 및 커스터마이징

Prometheus가 지표를 수집하기 시작했다면, 이제 Grafana에서 이 지표들을 시각화할 차례입니다.

  1. Prometheus 데이터 소스 추가: 앞에서 설명한 대로 Grafana에 Prometheus를 데이터 소스로 추가합니다.
  2. 대시보드 임포트: Grafana는 Grafana Labs 대시보드 웹사이트에서 다양한 템플릿을 제공합니다. 예를 들어, Node Exporter를 위한 대시보드(ID: 1860)나 Spring Boot Actuator를 위한 대시보드(ID: 12900) 등을 검색하여 쉽게 임포트할 수 있습니다.
    • Grafana UI에서 Dashboards -> Import를 클릭합니다.
    • Grafana.com Dashboard에 해당 대시보드의 ID를 입력하고 Load를 클릭합니다.
    • 데이터 소스를 Prometheus로 선택하고 Import를 클릭합니다.
  3. 대시보드 커스터마이징: 임포트한 대시보드를 기반으로 서비스에 필요한 패널을 추가하거나 기존 패널의 쿼리를 수정하여 최적화합니다. 예를 들어, 특정 API의 응답 시간만 보고 싶다면 해당 API의 엔드포인트를 PromQL 쿼리에 추가하여 필터링할 수 있습니다.

이 과정을 통해 저는 몇 시간 만에 기본적인 모니터링 대시보드를 구성하고, 점차 세부적인 지표들을 추가하여 우리 팀에 특화된 대시보드를 완성할 수 있었습니다. 처음부터 완벽한 대시보드를 만들려고 하기보다는, 필요한 것들을 하나씩 추가해 나가는 것이 중요합니다.

Prometheus와 Grafana를 활용한 애플리케이션 모니터링 시스템 구축 가이드: 지표 수집부터 대시보드 시각화까지 - home office, computer, desk, display, iphone, keyboard, laptop, luxury, macbook, modern, organized, table, tablet, technology, work place, home office, computer, computer, computer, computer, desk, laptop, technology, technology, technology, technology, technology

Image by Pexels on Pixabay

성공적인 모니터링 시스템을 위한 팁과 고려사항

Prometheus와 Grafana를 구축하는 것 자체도 중요하지만, 더 나아가 효과적인 모니터링 시스템을 만들기 위해서는 몇 가지 고려해야 할 사항들이 있습니다. 직접 운영하면서 깨달은 몇 가지 팁을 공유합니다.

1. 경고(Alerting) 설정: Alertmanager 연동

모니터링의 핵심은 문제가 발생했을 때 빠르게 인지하고 대응하는 것입니다. 이를 위해 Prometheus와 Alertmanager를 연동하여 경고 시스템을 구축해야 합니다. 저는 Alertmanager를 Slack과 연동하여 중요한 알림을 팀 채널로 즉시 전송하도록 설정했습니다.

Alertmanager 설정 예시 (`alertmanager.yml`):

route:
  receiver: 'slack-notifications'
  group_by: ['alertname', 'instance']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h

receivers:
  - name: 'slack-notifications'
    slack_configs:
      - channel: '#alerts-channel' # Slack 채널 이름
        api_url: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX' # Slack Webhook URL
        send_resolved: true
        title: '[{{ .Status | toUpper }}] {{ .CommonLabels.alertname }}'
        text: '{{ .Annotations.description }}\n*Instance:* {{ .CommonLabels.instance }}\n*Severity:* {{ .CommonLabels.severity }}'

Prometheus 경고 규칙 설정 (`rules.yml`):

groups:
  - name: general.rules
    rules:
      - alert: HighCpuUsage
        expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m # 5분 이상 지속될 경우
        labels:
          severity: critical
        annotations:
          summary: 'High CPU usage on {{ $labels.instance }}'
          description: 'CPU usage is above 80% for 5 minutes on instance {{ $labels.instance }}'

      - alert: HighErrorRate
        expr: sum(rate(http_requests_total{job="my_application", status_code=~"5.."}[1m])) by (instance) / sum(rate(http_requests_total{job="my_application"}[1m])) by (instance) * 100 > 5
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: 'High error rate on {{ $labels.instance }}'
          description: 'Error rate for {{ $labels.instance }} is above 5% for 2 minutes'

경고 규칙은 단순히 CPU 사용량이 높다는 것 외에, 애플리케이션의 에러율, 응답 시간, 특정 비즈니스 지표 등에 대해서도 설정하는 것이 중요합니다. 너무 많은 경고는 피로도를 높이므로, 정말 중요한 지표 위주로 신중하게 설정해야 합니다.

2. 지표 설계의 중요성: 무엇을 측정할 것인가?

모든 것을 지표로 만들 필요는 없습니다. 무엇을 측정할지 신중하게 설계하는 것이 중요합니다. 저는 다음의 원칙을 따랐습니다.

  • RED(Rate, Errors, Duration) 지표: 서비스의 핵심인 요청 수(Rate), 에러 수(Errors), 응답 시간(Duration)은 필수적으로 측정합니다.
  • USE(Utilization, Saturation, Errors) 지표: 인프라(서버, DB 등) 모니터링에 유용합니다. 자원 사용률(Utilization), 포화도(Saturation), 에러를 측정합니다.
  • 비즈니스 지표: 단순 시스템 지표를 넘어, 가입자 수, 주문 완료 수, 로그인 성공률 등 서비스의 핵심 비즈니스 로직과 관련된 지표를 수집하여 서비스의 건강 상태를 파악합니다.

특히, 지표에 적절한 레이블(Label)을 부여하는 것이 중요합니다. 예를 들어 `http_requests_total{method="GET", endpoint="/api/users", status_code="200"}`처럼 레이블을 세분화하면, 나중에 PromQL 쿼리 시 특정 조건을 기준으로 데이터를 필터링하고 집계하기가 훨씬 용이해집니다. 레이블을 너무 많이 사용하면 카디널리티 문제가 발생할 수 있으니, 필요한 만큼만 추가해야 합니다.

지표 타입 설명 활용 예시
Counter 단조롭게 증가하는 값 (재시작 시 0으로 초기화). 총 요청 수, 총 에러 수, 총 처리된 작업 수
Gauge 임의로 오르내릴 수 있는 현재 값. 현재 메모리 사용량, 현재 동시 접속자 수, 큐에 대기 중인 메시지 수
Histogram 관측 값의 분포(버킷)와 합계, 총 개수를 기록. API 응답 시간 분포, 요청 크기 분포 (P95, P99 등 백분위수 분석)
Summary 관측 값의 개수, 합계, 그리고 클라이언트 측에서 계산된 백분위수. Histogram과 유사하나, 클라이언트 측에서 백분위수를 미리 계산 (자원 소모 주의)

3. 확장성 및 고가용성 고려

서비스 규모가 커지면 단일 Prometheus 서버로는 한계에 봉착할 수 있습니다. 수집해야 할 지표의 양이 많아지거나, 모니터링 대상이 여러 데이터센터에 분산될 수 있기 때문입니다. 이럴 때는 다음과 같은 방안을 고려해볼 수 있습니다.

  • Federation: 여러 Prometheus 서버에서 수집된 지표를 상위 Prometheus 서버에서 다시 수집하는 방식.
  • Thanos/Cortex: Prometheus의 확장성 문제를 해결하기 위한 솔루션들. 장기 저장, 고가용성, 분산 쿼리 등을 지원합니다. 이들은 Kubernetes 환경에서 특히 많이 사용됩니다.
  • 리모트 저장소(Remote Storage): 지표를 S3와 같은 객체 저장소나 다른 시계열 데이터베이스에 장기 저장하도록 설정할 수 있습니다.

처음부터 복잡하게 구성할 필요는 없지만, 서비스가 성장함에 따라 모니터링 시스템도 함께 확장될 수 있도록 아키텍처를 유연하게 설계하는 것이 중요합니다. 저는 소규모 서비스에서는 단일 Prometheus로 시작하여, 나중에 필요에 따라 Thanos와 같은 솔루션을 도입하는 것을 고려했습니다.

마치며: 안정적인 서비스 운영의 핵심

지금까지 Prometheus와 Grafana를 활용한 애플리케이션 모니터링 시스템 구축 가이드를 상세하게 다루어 보았습니다. 직접 지표를 수집하고 시각화하며, 경고 시스템을 구축하는 과정은 때로는 번거롭게 느껴질 수 있습니다. 하지만 이 과정을 통해 얻는 서비스에 대한 깊은 이해와 안정성은 그 어떤 노력과도 바꿀 수 없는 가치라고 확신합니다.

모니터링 시스템은 한 번 구축했다고 끝나는 것이 아니라, 서비스의 변화에 맞춰 지표를 추가하고, 대시보드를 개선하며, 경고 규칙을 최적화하는 지속적인 개선 과정이 필요합니다. 이 글이 여러분의 모니터링 시스템 구축 여정에 조금이나마 도움이 되기를 바랍니다. 궁금한 점이나 여러분의 경험을 댓글로 공유해 주시면 저에게도 큰 힘이 될 것 같습니다. 함께 더 안정적인 서비스를 만들어나가요!

📌 함께 읽으면 좋은 글

  • [튜토리얼] Minikube 로컬 쿠버네티스 개발 환경 구축부터 애플리케이션 배포까지 완벽 가이드
  • [튜토리얼] Playwright E2E 테스트 자동화 완벽 가이드: CI/CD 연동부터 리포팅까지
  • [튜토리얼] GitHub Actions로 React 앱 자동 배포: CI/CD 파이프라인 구축 실전 가이드

이 글이 도움이 되셨다면 공감(♥)댓글로 응원해 주세요!
궁금한 점이나 다루었으면 하는 주제가 있다면 댓글로 남겨주세요.

반응형