Skip to content

DockerMiniProject/slack_alarm_bot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

8 Commits
Β 
Β 

Repository files navigation

πŸ“€ Slack_Alarm_Bot

nginx 및 MySQL ν”„λ‘œμ„ΈμŠ€μ˜ λ¦¬μ†ŒμŠ€λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜κ³ , μž„κ³„μΉ˜λ₯Ό μ΄ˆκ³Όν•  경우 Slack으둜 μžλ™ μ•ŒλžŒμ„ λ³΄λ‚΄λŠ” μ‹œμŠ€ν…œμ„ κ΅¬μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.


πŸ‘¨β€πŸ‘¨β€πŸ‘¦β€πŸ‘¦ νŒ€μ› μ†Œκ°œ

μœ ν˜Έμ€€ μž₯μˆ˜ν˜„ μ΄μ„±λΉˆ

🎯 ν”„λ‘œμ νŠΈ λͺ©ν‘œ

이 ν”„λ‘œμ νŠΈλŠ” μžλ™ν™”λœ μ„œλ²„ λͺ¨λ‹ˆν„°λ§μ„ 톡해 μ‹€μ‹œκ°„ λŒ€μ‘λ ₯을 높이고, IT 인프라λ₯Ό 효과적으둜 κ΄€λ¦¬ν•˜λ©°, 기둝된 데이터λ₯Ό 기반으둜 μΆ”ν›„ ν™œμš©ν•  수 μžˆλ„λ‘ ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€.

πŸš€ λͺ©ν‘œ

  • μ„œλ²„ ν”„λ‘œμ„ΈμŠ€ λ¦¬μ†ŒμŠ€(Nginx, MySQL)의 CPU 및 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ λͺ¨λ‹ˆν„°λ§
  • μž„κ³„κ°’ 초과 μ‹œ Slack μ•ŒλžŒ μ „μ†‘ν•˜μ—¬ μ‹€μ‹œκ°„ λŒ€μ‘ κ°€λŠ₯
  • 주기적인 둜그 기둝을 톡해 데이터 ν™œμš©
  • IT 인프라 κ΄€μ μ—μ„œ μžλ™ν™” 및 μœ μ§€λ³΄μˆ˜ νš¨μœ¨μ„± ν–₯상

πŸ”‘ 핡심 ν‚€μ›Œλ“œ

  • crontab (주기적 μ‹€ν–‰)
  • grep (μ •κ·œν‘œν˜„μ‹ μ‚¬μš©)
  • uptime (μ„œλ²„ 가동 μ‹œκ°„ 체크)

🚨 μ•ŒλžŒ

CPU μ•ŒλžŒ λ©”λͺ¨λ¦¬ μ•ŒλžŒ Mysql

πŸ“Œ ꡬ성 κ³Όμ •

  1. manager μƒˆλ‘œμš΄ μœ μ € 계정 생성 및 둜그 디렉토리 생성
  2. process_monitor.sh (Nginx) & process_monitor_mysql.sh (MySQL) 슀크립트 μž‘μ„± 및 μ‹€ν–‰ κΆŒν•œ λΆ€μ—¬
  3. crontab을 ν™œμš©ν•˜μ—¬ μžλ™ μ‹€ν–‰ μ„€μ • (1λΆ„λ§ˆλ‹€ μ‹€ν–‰)
  4. wrk을 μ΄μš©ν•œ λΆ€ν•˜ ν…ŒμŠ€νŠΈ 및 μ„±λŠ₯ 점검

πŸ”Ή 1. μ‚¬μš©μž 및 둜그 디렉토리 μ„€μ •

λ¨Όμ €, λͺ¨λ‹ˆν„°λ§ 슀크립트λ₯Ό μ‹€ν–‰ν•  관리 계정(manager)을 μƒμ„±ν•˜κ³ , 둜그λ₯Ό μ €μž₯ν•  디렉토리λ₯Ό 생성

# manager μ‚¬μš©μž μΆ”κ°€ 및 sudo κΆŒν•œ λΆ€μ—¬
sudo adduser manager
id manager
sudo usermod -aG sudo manager

# nginx μ„€μΉ˜ 및 확인
sudo apt update
sudo apt install nginx
sudo systemctl start nginx
sudo systemctl status nginx

# mysql μ„€μΉ˜ 및 확인
sudo apt update
sudo apt install mysql-server
sudo systemctl start mysql
sudo systemctl status mysql

# 둜그 μ €μž₯을 μœ„ν•œ 디렉토리 및 파일 생성
sudo mkdir -p /var/log/manager_logs
sudo touch /var/log/manager_logs/process_monitor.log
sudo touch /var/log/manager_logs/process_monitor_mysql.log

# κΆŒν•œ μ„€μ •
sudo chmod 777 /var/log/manager_logs
sudo chmod 777 /var/log/manager_logs/process_monitor.log
sudo chmod 777 /var/log/manager_logs/process_monitor_mysql.log
sudo chown manager:manager /var/log/manager_logs/process_monitor.log
sudo chown manager:manager /var/log/manager_logs/process_monitor_mysql.log

πŸ”Ή 2. λ¦¬μ†ŒμŠ€ λͺ¨λ‹ˆν„°λ§ 슀크립트 μž‘μ„±

βœ… Nginx λͺ¨λ‹ˆν„°λ§ 슀크립트

nano /home/manager/process_monitor.sh

πŸ“Œ process_monitor.sh (Nginx λ¦¬μ†ŒμŠ€ λͺ¨λ‹ˆν„°λ§)

#!/bin/bash
LOG_FILE="/var/log/manager_logs/process_monitor.log"
PROCESS="nginx: worker process"
CPU_THRESHOLD=10.0  
MEM_THRESHOLD=10700  

SLACK_WEBHOOK_URL="https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXX"

echo "$(date '+%Y-%m-%d %H:%M:%S') - Checking $PROCESS resource usage..." >> $LOG_FILE
PIDS=$(pgrep -f "$PROCESS")

if [ -z "$PIDS" ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Process $PROCESS not running" >> $LOG_FILE
    exit 1
fi

TOTAL_CPU=0
TOTAL_MEM=0

for PID in $PIDS; do
    CPU_USAGE=$(ps -p "$PID" -o %cpu --no-headers | awk '{print $1}')
    MEM_USAGE=$(ps -p "$PID" -o rss --no-headers | awk '{print $1}')
    TOTAL_CPU=$(echo "$TOTAL_CPU + $CPU_USAGE" | bc)
    TOTAL_MEM=$(echo "$TOTAL_MEM + $MEM_USAGE" | bc)
done

echo "$(date '+%Y-%m-%d %H:%M:%S') - Total CPU: $TOTAL_CPU% | Total Memory: $TOTAL_MEM KB" >> $LOG_FILE

send_slack_alert() {
    curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$1\"}" $SLACK_WEBHOOK_URL
}

if (( $(echo "$TOTAL_CPU > $CPU_THRESHOLD" | bc -l) )); then
    send_slack_alert "πŸ”₯ *High CPU Usage Alert!* Process: $PROCESS | CPU: $TOTAL_CPU%"
fi

if [ "$TOTAL_MEM" -ge "$MEM_THRESHOLD" ]; then
    send_slack_alert "πŸ”₯ *High Memory Usage Alert!* Process: $PROCESS | Memory: $TOTAL_MEM KB"
fi

βœ… MySQL λͺ¨λ‹ˆν„°λ§ 슀크립트

nano /home/manager/process_monitor_mysql.sh

πŸ“Œ process_monitor_mysql.sh (MySQL λ¦¬μ†ŒμŠ€ λͺ¨λ‹ˆν„°λ§)

#!/bin/bash
LOG_FILE="/var/log/manager_logs/process_monitor_mysql.log"
PROCESS="mysqld"
CPU_THRESHOLD=10.0  
MEM_THRESHOLD=10700  

SLACK_WEBHOOK_URL="https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXX"

echo "$(date '+%Y-%m-%d %H:%M:%S') - Checking $PROCESS resource usage..." >> $LOG_FILE
PIDS=$(pgrep -f "$PROCESS")

if [ -z "$PIDS" ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Process $PROCESS not running" >> $LOG_FILE
    exit 1
fi

TOTAL_CPU=0
TOTAL_MEM=0

for PID in $PIDS; do
    CPU_USAGE=$(ps -p "$PID" -o %cpu --no-headers | awk '{print $1}')
    MEM_USAGE=$(ps -p "$PID" -o rss --no-headers | awk '{print $1}')
    TOTAL_CPU=$(echo "$TOTAL_CPU + $CPU_USAGE" | bc)
    TOTAL_MEM=$(echo "$TOTAL_MEM + $MEM_USAGE" | bc)
done

echo "$(date '+%Y-%m-%d %H:%M:%S') - Total CPU: $TOTAL_CPU% | Total Memory: $TOTAL_MEM KB" >> $LOG_FILE

send_slack_alert() {
    curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$1\"}" $SLACK_WEBHOOK_URL
}

if (( $(echo "$TOTAL_CPU > $CPU_THRESHOLD" | bc -l) )); then
    send_slack_alert "πŸ”₯ *High CPU Usage Alert!* Process: $PROCESS | CPU: $TOTAL_CPU%"
fi

if [ "$TOTAL_MEM" -ge "$MEM_THRESHOLD" ]; then
    send_slack_alert "πŸ”₯ *High Memory Usage Alert!* Process: $PROCESS | Memory: $TOTAL_MEM KB"
fi

πŸ”Ή 3. Crontab μžλ™ μ‹€ν–‰ μ„€μ •

crontab -e

λ‹€μŒ λ‚΄μš©μ„ μΆ”κ°€:

* * * * * /bin/bash /home/manager/process_monitor.sh
* * * * * /bin/bash /home/manager/process_monitor_mysql.sh

πŸ”Ή 4. λΆ€ν•˜ ν…ŒμŠ€νŠΈ (wrk ν™œμš©)

sudo apt install wrk -y
wrk -t4 -c1000 -d100s http://localhost/

πŸ›  νŠΈλŸ¬λΈ”μŠˆνŒ…

문제 원인 ν•΄κ²° 방법
Slack μ•ŒλžŒμ΄ μ „μ†‘λ˜μ§€ μ•ŠμŒ SLACK_WEBHOOK_URL이 μ˜¬λ°”λ₯΄μ§€ μ•Šκ±°λ‚˜, λ„€νŠΈμ›Œν¬ 문제 λ°œμƒ SLACK_WEBHOOK_URL이 μ •ν™•ν•œμ§€ 확인
crontab이 μ‹€ν–‰λ˜μ§€ μ•ŠμŒ crontab이 μ œλŒ€λ‘œ λ“±λ‘λ˜μ§€ μ•Šμ•˜κ±°λ‚˜, μ‹€ν–‰ κΆŒν•œ 문제 λ°œμƒ crontab -l λͺ…λ Ήμ–΄λ‘œ λ“±λ‘λœ μž‘μ—… 확인, /var/log/syslogμ—μ„œ cron μ‹€ν–‰ μ—¬λΆ€ 확인 sudo grep process_monitor.sh /var/log/syslog , chmod +x둜 μ‹€ν–‰ κΆŒν•œ λΆ€μ—¬ ν›„ μž¬λ“±λ‘
MySQL ν”„λ‘œμ„ΈμŠ€κ°€ κ°μ§€λ˜μ§€ μ•ŠμŒ mysqld ν”„λ‘œμ„ΈμŠ€κ°€ μ˜ˆμƒκ³Ό λ‹€λ₯Έ μœ„μΉ˜μ—μ„œ μ‹€ν–‰ μ€‘μ΄κ±°λ‚˜, μ„œλΉ„μŠ€κ°€ 쀑지됨 pgrep -a mysqld λ˜λŠ” systemctl status mysql μ‹€ν–‰ ν›„ MySQL μ„œλΉ„μŠ€κ°€ μ‹€ν–‰ 쀑인지 ν™•μΈν•˜κ³ , pgrep -f "mysqld"둜 ν”„λ‘œμ„ΈμŠ€ 탐색
둜그 파일이 μƒμ„±λ˜μ§€ μ•ŠμŒ 둜그 디렉토리 λ˜λŠ” νŒŒμΌμ— λŒ€ν•œ κΆŒν•œ 문제 /var/log/manager_logs/와 /var/log/manager_logs/process_monitor.log의 κΆŒν•œ 확인 (chmod 777 및 chown manager:manager μ„€μ •)
Nginx의 PIDκ°€ μ—¬λŸ¬ 개 발견됨 (Master, Worker 쑴재) NginxλŠ” Master ν”„λ‘œμ„ΈμŠ€ 1개 + Worker ν”„λ‘œμ„ΈμŠ€ μ—¬λŸ¬ 개둜 ꡬ성됨 pgrep -f "nginx: worker process"λ₯Ό μ‚¬μš©ν•˜μ—¬ Worker ν”„λ‘œμ„ΈμŠ€λ§Œ λͺ¨λ‹ˆν„°λ§ν•˜λ„둝 μ„€μ •
Nginx의 λͺ¨λ“  Worker ν”„λ‘œμ„ΈμŠ€μ˜ CPU 및 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ ν•©μ‚° ν•„μš” pgrep둜 찾은 각각의 PID μ‚¬μš©λŸ‰μ„ κ°œλ³„μ μœΌλ‘œ 체크해야 함 for PID in $(pgrep -f "nginx: worker process"); do ... done 루프λ₯Ό μ‚¬μš©ν•˜μ—¬ CPU 및 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ λͺ¨λ‘ ν•©μ‚°
Nginx λ˜λŠ” MySQL이 μž¬μ‹œμž‘λ  λ•Œ PID 변경됨 ν”„λ‘œμ„ΈμŠ€κ°€ μž¬μ‹œμž‘λ  λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ PIDκ°€ 할당됨 맀번 pgrep을 μ‹€ν–‰ν•˜μ—¬ ν˜„μž¬ μ‹€ν–‰ 쀑인 ν”„λ‘œμ„ΈμŠ€λ₯Ό λ‹€μ‹œ κ°μ§€ν•˜λ„λ‘ 슀크립트 μˆ˜μ •

πŸͺ„ μ•žμœΌλ‘œ μΆ”κ°€ν•  κΈ°λŠ₯

κΈ°λŠ₯ μ„€λͺ… κΈ°λŒ€ 효과
ELK Stack 연동 Elasticsearch, Logstash, Kibanaλ₯Ό μ΄μš©ν•œ 둜그 μ‹œκ°ν™” μž₯μ•  λ°œμƒ 원인 뢄석 및 μ‹€μ‹œκ°„ λŒ€μ‹œλ³΄λ“œ 제곡
MySQL 쿼리 μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§ mysqld_exporter와 Slow Query Log 뢄석 λΉ„νš¨μœ¨μ μΈ 쿼리 탐색 및 μ΅œμ ν™”
Nginx μƒνƒœ 점검 API 연동 stub_status λͺ¨λ“ˆμ„ ν™œμš©ν•˜μ—¬ Nginx μƒνƒœ 쑰회 Active Connections, Request μ²˜λ¦¬λŸ‰ λ“± λͺ¨λ‹ˆν„°λ§ κ°€λŠ₯
Slack μ•ŒλžŒ μ„ΈλΆ„ν™” κ²½κ³  μˆ˜μ€€λ³„ μ•ŒλžŒ (INFO, WARNING, CRITICAL) 운영자의 λΆˆν•„μš”ν•œ μ•ŒλžŒ ν”Όλ‘œλ„λ₯Ό 쀄이고, μ€‘μš”ν•œ μ•ŒλžŒλ§Œ 즉각 λŒ€μ‘ κ°€λŠ₯
Failover μ‹œμŠ€ν…œ ꡬ좕 μž₯μ•  λ°œμƒ μ‹œ λ°±μ—… μ„œλ²„λ‘œ νŠΈλž˜ν”½ μžλ™ μ „ν™˜ μ„œλΉ„μŠ€ 연속성 μœ μ§€
λ°±μ—… 및 볡ꡬ μžλ™ν™” MySQL 데이터 λ°±μ—… + 주기적인 μŠ€λƒ…μƒ· μ €μž₯ μž₯μ•  λ°œμƒ μ‹œ μ‹ μ†ν•œ 볡ꡬ κ°€λŠ₯

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •