320x100
320x100

프로메테우스의 전체 구조

프로메테우스는 pull 기반 모니터링 시스템으로, 각 대상 시스템이 제공하는 메트릭을 주기적으로 수집하고,

시계열 데이터로 저장한 후 쿼리 / 시각화

 

 

 

 

 

Prometheus Server (중앙 수집기)

핵심 엔진

 

- 역할

타겟 (endpoint)에서 메트릭 수집 (HTTP Pull)

시계열 데이터 저장

PromQL 쿼리 처리

알람 조건 평가

 

- 내부구성

Scraper (타겟에서 데이터 수집)

TSDB (메트릭 저장소)

Query Engine (PromQL 실행)

Alert Manager (알림 전달)

 

 

 

 

 

Exporter

대상 시스템이 Promehteus 형식으로 메트릭을 노출하도록 도와주는 에이전트

`/metrics` 엔드포인트를 제공 (API)

 

- 종류 예시

node_exporter (서버 OS)

mysqld_exporter (DB)

nginx_exporter (웹 서버)

jmx_exporter (JVM 기반 앱)

kube-state-metrics (쿠버네티스 상태)

 

 

 

 

 

AlertManager

알림 담당 시스템

 

- 기능

중복 알림 제거

심각도별 분류

Slack, SMS, Email, webhook 전송

장애 복구 후 알림 종료 처리

 

 

 

 

 

Pushgateway

Pull이 어려운 환경에서 사용

 

- 기능

배치 작업, 단발성 스크립트 등의 매트릭을 push

프로메테우스가 Pushgateway를 다시 Pull

 

 

 

 

 

Grafana (외부 시각화 툴)

프로메테우스의 데이터를 시각화

 

- 기능

대시보드

알람 시각 표시

히스토리 분석

 

 

 

 

데이터 흐름

애플리케이션 > Exporter > Prometheus > Grafana
                             > AlertManager > Slack, Email...

 

1. 프로메테우스가 설정된 주기마다 타겟에 접근 > /metrics 호출

2. 시계열 데이터로 저장

3. PromQL로 조회

4. 조건 충족 시 AlertManager로 전달

 

 

 

 

 

프로메테우스 주요 설정 파일

- prometheus.yml

핵심 설정 (타겟, 수집 주기, 알람 룰 포함)

 

- rules/*.yml

알람 룰 정의

 

- alertmanater.yml

알림 라우팅 설정. 알림을 어디로, 어떻게 대응할 것인지 설정

 

- recording_rules.yml

집계용 사전 계산 규칙. 자주 쓰는 쿼리를 서비스 메트릭 처럼 저장

 

- web.yml

인증 및 TLS 설정

 

- targets.json

파일 기반 서비스 디스커버리. 타겟을 동적으로 파일로 관리

 

- prometheus.service

systemd 서비스 파일 (리눅스)

 

 

 

 

 

prometheus.yml

- 기본 구조

global:
  scrape_interval: 15s # 수집 주기
  evaluation_interval: 15s # 알람 조건 평가 주기
  scraoe_timeout: 30s # 수집 타임아웃

alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - "alertmanager:9093"

rule_files:
  - "rules/*.yml"

scrape_configs:
  - job_name: "node"
    static_configs:
    - targets: ["localhost:9100"]

 

- scrpe_config (타겟정의)

# static 방식
scrape_configs:
  - job_name: "api-server"
    static_configs:
      - targets: ["10.0.0.1:8080"]

# 파일 기반 디스커버리
file_sd_configs:
  - files:
    - "/etc/prometheus/targets/*.json"

# 쿠버네티스 서비스 디스커버리
kubernetes_sd_configs:
  - role: pod

# 라벨 리라이트
relabel_configs:
- source_labels: [__address__]
  target_label: instance
  regex: (.*):.*
  replacement: $1

 

 

 

 

 

 

rules/*.yml (알람 룰 / Alert Rules)

groups:
- name: cpu_alerts
  rules:
  - alert: HighCPUUsage
    expr: avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) < 0.2 # PromQL 조건
    for: 3m # 지속 시간
    labels: # 심각도 분류
      severity: critical
    annotations: # 메시지 템플릿
      summary: "CPU 사용률 높음"
      description: "서버 CPU 사용률 80% 이상 지속"

 

 

 

 

 

 

alertmanater.yml

global:
  resolve_timeout: 5m

route: # 알람 흐름
  receiver: "slack" # 알림 대상

receivers:
- name: "slack"
  slack_configs:
  - channel: "#alert"
    text: "{{ .CommonAnnotations.summary }}"

 

 

 

 

 

recording_rules.yml

groups:
- name: app_rules
  rules:
  - record: job:http_requests:rate5m
    expr: sum(rate(http_requests_total[5m])) by (job)

 

 

 

 

 

 

web.yml

basic_auth_users:
  admin: "$2y$05$..."
tls_server_config:
  cert_file: cert.pem
  key_file: key.pem

 

 

 

 

 

 

 

targets.json

[
  {
    "targets": ["10.0.0.1:9100"],
    "labels": {
      "env": "prod"
    }
  }
]

 

 

 

 

 

 

prometheus.service

[Service]
ExecStart=/usr/local/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/data

 

- 설정 검증

promtool check config prometheus.yml
promtool check rules rules/*.yml

 

300x250
728x90