OneDay Network
alert 시스템 구축하기(bash,slack webhooks) 본문
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 -c "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 -n 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 -L -v -d "$(send_slack)" -H "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 -L -v -d "$(send_slack)" -H "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
위 그림과 같이 정상적으로 알림이 오는 것을 확인 할 수 있다.
'System' 카테고리의 다른 글
로그 파싱 및 로그 내용 데이터베이스화, 시각화(Bash,Influx,Grafana) (0) | 2020.10.12 |
---|
Comments