Network

Prometheus 디스코드 웹훅

Ry- 2025. 10. 2. 07:50

백엔드 서버가 가동중일시 이 서버를 모니터링할 수 있는 Prometheus라는 오픈소스가 있다.

Prometheus는 서버의 Metrics 정보를 수집하는 서버로서 Grafana와 같이 연동하여 모든 데이터를 시각화한다.

오늘은 Node.js 백엔드에 Prometheus을 적용하여 백엔드 서버가 다운될 때 알림을 디스코드 WebWook을 통해서 알리도록 하겠습니다.

 

Prometheus나 Grafana는 웹사이트에서도 다운로드할 수 있지만, 저는 Docker을 이용해 이미지를 가져와 컨테이너로 만들었습니다.

 

│  docker-compose.yml
│
├─alertmanager
│      alertmanager.yml
│
├─backend
│      .gitignore
│      Dockerfile
│      package.json
│      server.js
│
└─prometheus
        prometheus.yml
        rules.yml

 

 

#Dockerfile
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD ["node", "server.js"]
#package.json
{
  "name": "discord-webhook-proxy",
  "version": "1.0.0",
  "main": "server.js",
  "dependencies": {
    "express": "^4.18.2",
    "axios": "^1.5.0"
  }
}
#app.js
app.post('/webhook', async (req, res) => {
  console.log('Received alert:', JSON.stringify(req.body, null, 2));
  const { alerts } = req.body;

 

백엔드에서는 post 메서드로 서버의 상태를 출력하고 있으면 된다

 

docker-compose.yml

 

version: '3.8'

services:
  backend:
    build: ./backend
    container_name: backend-app
    ports:
      - "3000:3000"
    networks:
      - monitoring

  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - ./prometheus/rules.yml:/etc/prometheus/rules.yml
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
    ports:
      - "9090:9090"
    networks:
      - monitoring
    depends_on:
      - backend

  alertmanager:
    image: prom/alertmanager:latest
    container_name: alertmanager
    volumes:
      - ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml
    command:
      - '--config.file=/etc/alertmanager/alertmanager.yml'
    ports:
      - "9093:9093"
    networks:
      - monitoring

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3001:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
    networks:
      - monitoring

networks:
  monitoring:
    driver: bridge

 

prometueus.yml

global:
  scrape_interval: 15s
  evaluation_interval: 15s

# Alertmanager 설정
alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - alertmanager:9093

# 규칙 파일 로드
rule_files:
  - "rules.yml"

# 스크레이프 대상 설정
scrape_configs:
  - job_name: 'backend'
    static_configs:
      - targets: ['localhost:3000']
    metrics_path: '/metrics'

  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

 

이때 alertmanager의 규칙을 정할 수 있는 rule이 중요하다.

 

groups:
  - name: backend_alerts
    interval: 30s
    rules:
      # 서비스 다운
      - alert: ServiceDown
        expr: up{job="backend"} == 0
        for: 15s
        labels:
          severity: critical
        annotations:
          summary: "🔴 Backend service is down"
          description: "Backend service has been down for more than 1 minute"

 

summary, description을 통해서 실제 디스코드에서 나올 오류 메시지를 정할 수 있다.

 

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'backend_alerts'
  routes:
    - match:
        severity: critical
      receiver: 'backend_alerts'
      repeat_interval: 5m

receivers:
  - name: 'discord_webwook'
    discord_configs:
      - webhook_url: '(url) 입력'
        title: '{{ .CommonAnnotations.summary }}'
        message: '{{ .CommonAnnotations.description }}'
        send_resolved: true

 

 

 

rule에 적은 대로 서버에 어떤 문제가 발생하게 되면 alertmanager에 들어와서 match에 맞는 작업들을 수행하게 됩니다.

이제 docker을 실행해 주고 백엔드 서버를 끄게 되면

이처럼 discord에 백엔드 서버가 꺼졌다고 알림이 오게 됩니다.

 

#도커 명령어 
docker-compose up -d # 도커 컴포즈 파일 실행 -d 는 demon으로 실행 터미널 유지할 필요 X
docker logs [id or name] # 서버 오류 확인 
docker ps -a # 꺼진 컨테이너 까지 다 확인
docker system prune -f # 컨테이너 정리