Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

OneDay Network

alert 시스템 구축하기(bash,slack webhooks) 본문

System

alert 시스템 구축하기(bash,slack webhooks)

programming 2020. 10. 12. 18:16

1. HTTP Status Code 체크 및 alert 발송 스크립트(bash)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/bash
 
DATE=`date`
time=`date +'%H:%M'`
md=`date +'%Y-%m-%d'`
pod="server ip"
domain_list="domain 1 domain 2"
 
 
for((i=1;i<=2;i++))
do
        domain_name=`echo $domain_list | awk -v i=$i '{print $i}'`
        total_log=`kubectl exec $pod -- bash -"cat /var/log/access/$domain_name.log"`
        err_log=`echo "$total_log" | awk -v domain_name=$domain_name '{if ($1==domain_name && $8=="502") print $0}'`
 
        log_count=`echo "$err_log" | grep $md | grep $time | wc -l`
        domain=`echo "$err_log" | grep $md | grep $time | head -1 | awk '{print $1}'`
 
 
        if (( $log_count > 1 ))
        then    
                send_slack()
                {
                        cat << EOF
                {"attachments": [{"color":"blue",  "author_name""category: $pod Access Log Alert""title""Date: $DATE\nStatus: 502 Error""text""Domain:$domain\nError_Count: $log_count"}]}
EOF
                }
                curl ---"$(send_slack)" -"Content-Type: application/json; charset=utf-8" slack webhooks url
                echo $DATE "| Alert : $pod access log domain:$domain log_count:$log_count -> Send slack" >> /var/log/slack_alert.log
 
        elif (( $log_count == 1 ))
        then    
                log_data=`echo "$err_log" | grep $md | grep $time | awk '{print $4}'`
                send_slack()
                {
                        cat << EOF
                {"attachments": [{"color":"blue",  "author_name""category: $pod Access Log Alert""title""Date: $DATE\nStatus: 502 Error""text""Domain: $domain\nError_Count: $log_count\nError_URL: $log_data"}]}
EOF
                }
                curl ---"$(send_slack)" -"Content-Type: application/json; charset=utf-8" slack webhooks url
                echo $DATE "| Alert : $pod access log domain:$domain log_count:$log_count -> Send slack" >> /var/log/slack_alert.log
        fi
done
 
echo "$DATE running shell script" >> /var/log/run.log
cs

 

위 스크립트의 목적은 로그상 도메인에 해당하는 HTTP Status Code가 502인 것들을 1분 주기로 체크 하여 슬랙으로 알람을 전송하기 위함이다.

 

bash 스크립트 제작시 주의 할 점은 echo시 해당 변수에 큰따옴표를 붙여주는 것이다. 

echo 할때 큰따옴표를 붙이지 않으면 한줄로 출력된다.

따라서, wc -l로 해당 로그의 줄 수를 체크시 1줄로 나오는 문제가 있었다.

 

awk에서 bash 변수를 사용하려면 -v 옵션을 통해 사용할 수 있다.

awk -v i=$i '{print $i}'

for문의 i 변수를 awk에서 i라는 변수를 통해 선언하여, awk i 변수가 for문의 i와 같은 값을 가질 수 있다. (1~2)

 

2. 자동 수행(crontab)

crontab을 1분마다 수행하려고 하였으나

문제점이 해당시간 1초에 스크립트를 수행하는 문제점이 있어 올바르게 체크 되지 않았다.

1초에 수행하기 때문에 2~59초 사이에 일어난 일은 감지를 못하는 점이 문제였다. 

내가 원하는바는 해당시간의 마지막 초쯤 스크립트가 수행되길 원했다.

따라서 crontab을 수행할때 sleep을 이용하여 해결하였다. 

 

vi /etc/crontab

*   *    * * *   root   sleep 58; /root/error_alert.sh

 

3. slack 

위 그림과 같이 정상적으로 알림이 오는 것을 확인 할 수 있다. 

 

 

Comments