Prometheus Alertmanager 연동 - 모바일 알림

Prometheus Alertmanager의 알림을 Echobell로 보내고, 서버 및 인프라 장애에 대해 푸시 알림이나 전화 알림을 받으세요.


Alertmanager와 함께 사용하는 Prometheus는 널리 쓰이는 오픈 소스 모니터링 및 알림 스택입니다. Alertmanager를 Echobell과 연동하면 알림 규칙이 실행될 때마다 즉시 모바일 알림(긴급 알림이나 전화 형식 알림 포함)을 받을 수 있습니다.

사전 준비 사항

  • 채널을 하나 이상 만들어 둔 Echobell 계정
  • 실행 중인 Prometheus + Alertmanager 환경
  • Alertmanager 설정 파일(alertmanager.yml)을 편집할 수 있는 권한

설정 개요

  1. Echobell 채널 만들기
  2. 알림 템플릿 구성하기(선택 사항인 링크 템플릿 포함)
  3. 연동 방식 선택하기:
    • Alertmanager의 웹훅 리시버를 이용한 Webhook 방식(권장)
    • Alertmanager의 이메일 리시버를 이용한 이메일 방식(대안)
  4. 알림 규칙 만들거나 업데이트하기
  5. 테스트하고 다듬기

단계별 가이드

Echobell 채널 만들기

  1. Echobell 앱을 엽니다
  2. 새 채널을 만듭니다(예: "Prometheus Alerts")
  3. 쉽게 구분할 수 있도록 색상을 선택합니다

알림 템플릿 구성하기

Alertmanager의 Webhook 페이로드에는 status, commonLabels, commonAnnotations, externalURL과 alerts 배열 같은 구조화된 필드가 들어 있습니다. Echobell 템플릿에서 이러한 필드를 직접 참조할 수 있습니다.

권장 템플릿은 다음과 같습니다.

제목 템플릿:

{{commonLabels.alertname}} - {{status}}

본문 템플릿:

🔔 Alert: {{commonLabels.alertname}}
📊 Severity: {{commonLabels.severity}}
🖥️ Instance: {{alerts[0].labels["instance"]}}
⏰ Starts: {{alerts[0].startsAt}}
ℹ️ Summary: {{commonAnnotations.summary}}
🧾 Description: {{commonAnnotations.description}}

선택 사항인 링크 템플릿(고급 설정):

{{alerts[0].generatorURL || externalURL}}

이렇게 하면 알림 기록 안에서 알림이 발생한 그래프나 대시보드로 바로 이동하는 링크가 표시됩니다. generatorURL이 없는 경우에는 externalURL이 대신 사용됩니다.

연동 방식 A — Webhook(권장)

  1. Echobell 채널의 트리거 항목에서 Webhook URL을 복사합니다
  2. Alertmanager에서 해당 URL로 요청을 보내는 웹훅 리시버를 추가합니다

최소한의 alertmanager.yml 예시:

route:
  receiver: echobell-webhook

receivers:
  - name: echobell-webhook
    webhook_configs:
      - url: "https://hook.echobell.one/t/<channel-token>"
        send_resolved: true
        http_config:
          follow_redirects: true

참고 사항:

  • send_resolved: true로 설정하면 알림이 해제될 때(status가 resolved로 바뀔 때)도 알림을 보냅니다
  • Echobell은 JSON 본문을 그대로 읽으므로 위 템플릿이 정상적으로 렌더링됩니다

연동 방식 B — 이메일(대안)

이메일 방식을 선호하거나 반드시 이메일을 사용해야 한다면, Alertmanager의 이메일 리시버를 사용해 채널에 연결된 이메일 주소로 보내세요.

  1. Echobell의 트리거 섹션에서 채널의 이메일 주소를 복사합니다
  2. Alertmanager에서 이메일 리시버를 구성하고 간단한 템플릿을 사용합니다

예시 설정:

receivers:
  - name: echobell-email
    email_configs:
      - to: "PASTE_CHANNEL_EMAIL_ADDRESS"
        send_resolved: true
        subject: "{{ .CommonLabels.alertname }} - {{ .Status }}"
        html: |
          <p><strong>Summary:</strong> {{ .CommonAnnotations.summary }}</p>
          <p>{{ .CommonAnnotations.description }}</p>
          <p>
            <a href='{{ (index .Alerts 0).GeneratorURL }}' target='_blank' rel='noopener'>Open in Prometheus</a>
          </p>

이메일 트리거용 Echobell 템플릿에서는 Echobell이 자동으로 제공하는 subject, text, html 같은 변수를 사용할 수 있습니다.

알림 규칙 예시 만들기

전체 흐름을 테스트해 볼 수 있는 간단한 규칙 예시입니다.

groups:
  - name: example
    rules:
      - alert: HighCPU
        expr: avg(rate(process_cpu_seconds_total[5m])) > 0.8
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "High CPU usage"
          description: "CPU has been over 80% for 2 minutes"

이 알림이 실행되면 Alertmanager가 설정된 리시버로 이벤트를 보내고, Echobell이 해당 채널의 구독자에게 알림을 전달합니다.

연동 테스트하기

  1. 임계값을 일시적으로 낮추거나 금방 실행되는 테스트 알림을 만듭니다
  2. 알림이 실행될 때 Echobell 알림이 도착하는지 확인합니다
  3. 링크 템플릿을 사용한다면 기록을 열고 링크를 눌러 봅니다
  4. 알림을 해제한 뒤 해제 알림이 도착하는지 확인합니다(활성화한 경우)

알림 유형 선택하기

  • 긴급: 심각한 운영 환경 장애, 즉시 호출이 필요한 인시던트
  • 전화: 잠을 깨우거나 집중 모드를 반드시 뚫어야 하는 중대한 장애
  • 일반: 일상적인 알림, 경고, 참고용 공지

모범 사례

  1. 템플릿은 간결하면서도 필요한 정보를 담으세요(알림 이름, 심각도, 인스턴스, 요약)
  2. 링크 템플릿을 사용해 관련 그래프나 대시보드로 바로 이동하세요
  3. Alertmanager에서 알림을 그룹화하고 라우팅해 불필요한 소음과 알림 피로를 줄이세요
  4. severity 레이블을 포함하고, 긴급도에 맞는 Echobell 알림 유형을 사용하세요
  5. Echobell Webhook URL은 비밀 정보처럼 보호하고, 노출되었다면 교체하세요

문제 해결

Echobell에 알림이 도착하지 않는다면:

  • Webhook URL이나 채널 이메일 주소가 올바른지 확인하세요
  • Echobell 채널이 활성 상태이고 구독자가 있는지 확인하세요
  • Alertmanager 로그에 전송 오류가 없는지 확인하세요
  • alertmanager.yml의 라우트가 실제로 의도한 리시버를 가리키는지 확인하세요
  • 간단한 일회성 알림 규칙으로 테스트해 보세요
  • 이메일을 사용한다면 SMTP 설정이 정상 작동하고 메일이 전달되는지 확인하세요

개인정보 보호와 데이터 처리

Echobell은 개인정보 보호를 최우선으로 합니다:

  • 알림 내용은 사용자의 기기에만 남습니다
  • 서버에는 최소한의 설정 데이터만 저장됩니다
  • Webhook URL과 채널 이메일 주소는 비밀 정보로 취급해야 합니다
  • Echobell은 알림 페이로드를 서버에 보관하지 않습니다

추가 자료