DevOps

[모니터링] 서비스에 문제가 생기면 메세지를 받아보자

dev.yong 2020. 11. 4. 13:59

서비스를 운영할 때 예상치 못한 부분에서 장애나 오류는 언제든지 일어날 수 있다. 사전에 예방하는 것도 중요하지만 장애가 발생했을 때 이를 빠르게 인지하고 대처하는 것 또한 중요하다.

 

도입이유

- 물리적 서버 문제 발생 시 사용하고 있는 클라우드 서비스에서 알람을 보내주지만 어플리케이션단의 문제가 발생했을 때 노티기능이 없다.

- 서비스에 문제가 있는 상태에서 방관하고 있으면 유저에게 서비스에 대한 신뢰를 잃어버릴 수 있다.

 

의사결정 배경 및 요구사항

- 문제가 발생했을 떄 즉시 인지할 수 있어야 한다.

- 다른 할일도 많다 개발이 간편해야한다.

- 팀원에게 익숙한 언어이거나 러닝커브가 작아야한다.

- 비용적인 문제가 없어야 한다.

- 시스템 관련 알림채널은 통일되어야 알림이 왔을 때 집중할 수 있다.

 

서비스 체크를 하는 스크립트 언어는 파이썬을 선택했다.

- 간단하다.

- 팀원 중 파이썬을 다룰 수 있는 인원이 있다.

 

알림 채널은 슬랙 메세지를 선택했다.

- 현재 조직에서 사용하고 있다.

- 타 서비스와 연계할 수 있는 플러그인들이 다양하다.

- 비용적인 문제가 없다.

 

많은 방법들이 있겠지만 간단하게 구성을 했다.

지속적인 서비스 체크 - 문제발생시 담당자에게 슬랙 메세지 발송

 

작업

슬랙 설정

슬랙에서 메세지를 보내는 방법은 2가지가 있다.

- 상호작용을 할 수 있는 Bots

- 일방적으로 메세지  발송만 하는 Incoming Webhook

 

메세지 수신만 받을 목적이기 때문에 Incoming Webhook으로 세팅했다.

웹훅 세팅을 해서 webhook url이라는 메세지를 보내기 위한 키값을 받아야한다.웹훅 설정방법은 슬랙 공식문서에 자세하게 설명되어있다. (슬랙 웹훅 설정 바로가기)

파이썬 스크립트 작성

webhook url을 발급받고 서비스가 문제가 있을 때 슬랙으로 메세지를 발송해주는 간단한 파이썬 스크립트를 작성했다.

서비스url목록을 설정하고 응답값이 200 OK값이 아니면 슬랙 메세지를 전송하는 방식이다.

아래 스크립트를 크론탭에 등록하여 1분에 한번씩 체크하도록 설정했다.

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-
##########################################################################
# NAME          : api_check.py
# Author        : yong
# LAST UPDATE   : 2020-11-03
# Verersion     : 0.1
##########################################################################
import requests as req
from datetime import datetime
import time
 
# check 대상 api
sites = ('서비스URL''서비스URL2')
 
# 슬랙 메세지 전송 함수
def send_slack_message(msg):
    webhook_url = "슬랙 WEBHOOKURL"
    today = datetime.now().strftime('%Y-%m-%d %H:%M:%S ')
    payload = {
        "text""[ERROR] \n" +
        today + "\n" + msg
    }
    req.post(webhook_url, json=payload)
 
# 서비스 체크
for site in sites:
        try:
            r = req.get(site)
            print(site, 'return_code :', r.status_code)
 
        except Exception as e:
            print (site, 'r.status_code')
            send_slack_message("[" + site +"]" + " service is not running !!")
        time.sleep(5)

cs
 
 

 

서버 crontab 스케쥴 설정

1분마다 헬스체크 스크립트를 실행하는 crontab 스케쥴을 설정한다.

# crond 수정
crontab -e
 
# 1분마다 서비스 체크 스크립트 실행
* * * * * python /파일경로/api_check.py
 
# crond 재시작
service crond restart
cs

 

서비스에 문제가 발생하게 되면 아래와 같은 슬랙 메세지가 발송된다.