웹이나 DB를 운영할 때 사용자의 이용이 생깁니다. 트래픽이 발생하고, 정도에 따라 지연시간이 생길 수 있습니다. 당연히 자원 사용이 동반되므로 서버 메모리나 CPU 사용률이 부족하지는 않은지 지켜보면서 관리해주어야 합니다. 이럴 때 사용할 수 있는 것이 프로메테우스입니다.
각종 지표를 수집하여 저장하고 검색할 수 있는 모니터링 시스템으로서 특징은 다음과 같습니다.
이벤트 모니터링 및 경고에 사용되는 무료 소프트웨어
독립형 오픈소스 프로젝트로 어떤 회사와도 독립적으로 유지 관리됨
Go로 작성되었고, 아파치2 라이선스를 따름
그라파나를 통한 시각화 지원
많은 시스템을 모니터링 할 수 있는 다양한 플러그인
프로메테우스가 주기적으로 exporter(모니터링 대상 시스템)로부터 pulling 방식으로 메트릭을 읽어서 수집함
우리 팀에서 하고 있는 DB 모니터링 방법 중 하나는 프로메테우스와 그라파나를 이용하는 것이다. DBMS variables 비교 사이트에서 다뤘던 Redis, MySQL, PostgreSQL 중 하나씩 맡아서 직접 모니터링을 구축해보는 시간을 갖게 되었고, Redis를 담당하게 되었다.
NHN 면접에서 어떤 메트릭을 어떻게 모니터링 할 수 있을 지에 대한 질문을 받아보기도 했었고, 늘 해보고 싶던 부분이어서 이번 기회에 확실히 알고 넘어가야겠다! 아자 💪
과제 요구사항은 다음과 같다. 일단 다 처음이기 때문에 주신 내용을 이해하는게 먼저..! 하나씩 스터디하면서 차근차근 설치해봐야겠다 :)
서버가 아예 재부팅 되거나 그럴 수도 있으니까 크론잡으로 5분마다 프로세스가 내려가 있는지 체크하고 내려가 있으면 자동으로 올려주도록 스크립트를 등록한다.
#!/usr/bin/env bash
# 로그 파일 위치
LOG_DIRECTORY="/home1/irteamsu/cronjob/logs"
LOG_FILE="$LOG_DIRECTORY/logfile_$(date "+%Y%m%d_%H").log"
# 확인할 프로세스
PYTHON_PROCESS="/home1/irteamsu/.pyenv/versions/py39/bin/python manage.py runserver [IP]:[PORT] --settings=main.config.settings.debug"
NODE_PROCESS="node ./node_modules/@vue/cli-service/bin/vue-cli-service serve --port [PORT]"
# 실행할 디렉토리
PROCESS_DIRECTORY="/home1/irteamsu/variable-comparison"
# 로그에 남길 현재시각
log_current_time() {
current_time=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$current_time] $1" >> "$LOG_FILE"
}
# 현재 시간을 시간 단위로 구하기
current_hour=$(date "+%H")
# 이전 시간대의 로그 파일 유지, 나머지 로그 파일 삭제
for ((hour=0; hour<current_hour; hour++)); do
if [ "$hour" -lt 10 ]; then
rm "$LOG_DIRECTORY/logfile_$(date "+%Y%m%d_0$hour").log" 2>/dev/null
else
rm "$LOG_DIRECTORY/logfile_$(date "+%Y%m%d_$hour").log" 2>/dev/null
fi
done
# python 프로세스 실행 중인지 확인
if pgrep -f "$PYTHON_PROCESS" >/dev/null; then
log_current_time "Python process is already running."
else
log_current_time "Python process is not running. Starting the process..."
source ~/.bash_profile
cd "$PROCESS_DIRECTORY"
pyenv activate py39
nohup /home1/irteamsu/.pyenv/versions/py39/bin/python manage.py runserver [IP]:[PORT] --settings=main.config.settings.debug > /dev/null 2>&1 &
if pgrep -f "$PYTHON_PROCESS" >/dev/null; then
log_current_time "Python process started."
else
log_current_time "Failed to start Python process."
fi
fi
# node 프로세스 실행 중인지 확인
if pgrep -f "$NODE_PROCESS" >/dev/null; then
log_current_time "Node.js process is already running."
else
log_current_time "Node.js process is not running. Starting the process..."
cd "$PROCESS_DIRECTORY"
nohup node ./node_modules/@vue/cli-service/bin/vue-cli-service serve --port [PORT] > /dev/null 2>&1 &
if pgrep -f "$NODE_PROCESS" >/dev/null; then
log_current_time "Node.js process started."
else
log_current_time "Failed to start Node.js process."
fi
fi