Skip to content

[Chore] 모니터링 알림을 디스코드로 연결하고 대시보드의 빈 패널과 틀린 값을 고친다 - #336

Merged
KiSeungMin merged 1 commit into
developfrom
chore/monitoring-alert-dashboard
Sep 21, 2026
Merged

KiSeungMin merged 1 commit into
developfrom
chore/monitoring-alert-dashboard

Conversation

@KiSeungMin

Copy link
Copy Markdown
Contributor

✔️ 연관 이슈

📝 작업 내용

  • Prometheus 알림을 디스코드로 보냅니다. 규칙 7개가 평가만 되고 받을 곳이 없었습니다. Alertmanager 를 추가하고 앱 에러 알림과 같은 DISCORD_WEBHOOK_URL 로 보냅니다. 웹훅 주소는 설정 파일에 적지 않고 컨테이너가 뜰 때 환경변수에서 파일로 옮겨 읽습니다.
  • Redis, RabbitMQ 수집을 추가했습니다. redis-exporter 를 붙이고, RabbitMQ 는 이미지에 내장된 rabbitmq_prometheus 의 detailed 엔드포인트에서 큐별 적체와 컨슈머 수를 가져옵니다. 항상 비어 있던 패널 4개가 채워집니다.
  • 대시보드의 틀린 값을 고쳤습니다.
패널 문제 바꾼 것
5xx 비율 기준이 5(=500%)라 항상 초록 /api 한정, 1% 주황, 5% 빨강
평균 응답시간 기준 5ms 라 평소에도 빨강 p50 으로 교체 (300ms, 1s)
프로세스 메모리 mysql-exporter 메모리를 그리고 있었음 JVM heap, non-heap
CPU 호스트 전체 CPU 앱 프로세스 CPU
외부 API 성공률 호출이 없으면 0% 빨강 호출 없음으로 표시
요청 지표 전반 요청의 96% 가 스캐너 /api 한정, 1시간 창, p99 제거
  • promtail 이 Loki 자기 로그를 수집하지 않게 했습니다. 하루 로그의 97% 가 Loki 자기 로그였습니다.
  • 패널마다 읽는 법을 한 줄씩 description 으로 달았습니다.

👤 사용자 영향

  • 없습니다. 모니터링 컨테이너와 설정만 바뀌고 앱과 Redis, RabbitMQ 설정은 그대로입니다.

🔌 API 호환성

  • 요청/응답 DTO 변경 없음
  • 기존 Flutter 앱 버전과 호환 확인
  • breaking change 있음

🗄️ DB migration

  • 없음

🔐 인증/권한

  • 영향 없음

✅ 검증 결과

  • promtool(규칙 7개), amtool, promtail -check-syntax, docker compose config 를 dev, prod 모두 통과했습니다.
  • 로컬에서 prod compose 로 Redis, RabbitMQ, 두 exporter, Alertmanager, Prometheus 를 띄워 확인했습니다.
    • Redis, RabbitMQ 수집 up = 1, redis_memory_max_bytes = 512MB, 큐를 만든 뒤 큐별 컨슈머와 적체 지표가 나오는 것
    • 백엔드가 없어 OnOBackendDownProd 가 실제로 firing 되고, 로컬에 띄운 가짜 웹훅으로 디스코드 embed 형식이 도착하는 것
    • 수정한 대시보드 쿼리 41개가 문법 오류 없이 도는 것
  • 실제 서버 네트워크에서 exporter 가 붙는지와 실데이터 값은 dev 반영 후 확인하겠습니다.

🚀 배포 리스크

  • 머지되면 알림이 바로 켜집니다. 앱 에러 알림과 같은 디스코드 채널로 가고, 지금은 규칙 7개가 모두 inactive 라 반영 직후 몰리지는 않습니다.
  • dev 에는 Alertmanager 를 두지 않았습니다. dev 가 자주 내려가서 알림이 시끄러울 수 있기 때문입니다. 그래서 디스코드 전송은 prod 반영 때 처음 실제로 동작합니다.

↩️ 롤백/대응 방법

  • 이 PR 을 revert 하고 Restart Monitoring Stack 워크플로를 해당 환경으로 돌리면 됩니다.

- ono-alerts.yml 규칙 7개는 평가되고 있었지만 prometheus.prod.yml 에 alerting 설정이 없어서 어디로도 가지 않았다. Alertmanager 를 붙이고 앱 에러 알림과 같은 DISCORD_WEBHOOK_URL 로 보낸다. 웹훅 주소는 설정 파일에 적지 않으려고 컨테이너가 뜰 때 환경변수를 파일로 옮겨 webhook_url_file 로 읽는다
- Redis 와 RabbitMQ 는 떠 있는데 수집을 안 해서 Dependency 대시보드 패널 4개가 항상 비어 있었다. redis-exporter 를 추가하고, RabbitMQ 는 이미지에 내장된 rabbitmq_prometheus 의 detailed 엔드포인트에서 큐별 적체와 컨슈머 수를 가져온다. 합계만 보면 큐 하나의 컨슈머가 죽어도 티가 안 나기 때문이다
- 5xx 비율은 단위가 0~1 인데 경고 기준이 5 라서 에러율이 100% 여도 초록이었고, 평균 응답시간은 기준이 5ms 라 평소에도 빨강이었다. 기준을 고치고 평균 대신 p50 을 둔다
- Server/Process Memory 패널은 JVM 이 내보내지 않는 process_resident_memory_bytes 를 그려서 실제로는 mysql-exporter 메모리를 보여주고 있었다. JVM 메모리로 바꾸고, CPU 도 호스트 전체가 아닌 앱 프로세스 기준으로 바꾼다
- 하루 요청의 96% 가 스캐너라 요청 지표를 /api 로 한정하고, 행동 지표에서는 security_rejected, not_found, unmapped_request 를 뺀다. 트래픽이 적어 5분 창은 너무 튀기 때문에 1시간 창으로 보고 p99 는 뺐다
- 외부 API 성공률은 호출이 없으면 0% 빨강으로 보였다. 호출이 없을 때는 값을 비우고 호출 없음으로 표시한다
- promtail 이 Loki 자기 로그를 수집해서 하루 로그의 97% 를 차지하고 있었다. 수집 대상에서 빼고 Alertmanager 로그를 넣는다
- 배포와 모니터링 재시작 워크플로에 새 컨테이너를 추가하고, restart-monitoring 의 .env.prod 에 빠져 있던 DISCORD_WEBHOOK_URL 을 넣는다

Closes #335
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

chore 코드 수정, 내부 파일 수정

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant