20.23-20.26 告警系统邮件引擎

本文介绍了一种自建告警系统的实现方案,包括告警邮件引擎的设计与实现,通过定时任务触发告警检查,以及如何实现告警收敛避免误报。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

20.23/20.24/20.25 告警系统邮件引擎
20.26 运行告警系统
20.23/22.24/22.25告警系统邮件引擎

邮件首先要有一个mail.py,因为之前做zabbix的时候,做过mail.py的脚本,在这里,直接调用进行使用就可以。但是告警邮件引擎核心,conf主配置文件调用到的都是mail.sh ,所以这里需要定义调用mail.py的sh脚本,mail.sh目的是做告警收敛,如果不想做告警收敛,在发现问题的时候直接告警就好,但是,可能会发生1分钟前发现问题,1分钟户问题解决,这样就会变成误报,这样会很麻烦,收敛的目的就是1分钟前发现问题,然后到10分钟后,服务还没有恢复,就会告诉管理人员10分钟了服务还未恢复。
先到sahres目录下来
[root@aming-01 ~]# cd /usr/local/sbin/mon/shares

[root@aming-01 shares]# pwd
/usr/local/sbin/mon/shares

[root@aming-01 shares]# ls
502.sh disk.sh load.sh
把之前的mail.py 拷贝到mon/mail 目录下
mail.sh内容 //其中mail.py内容到这里下载https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.py
[root@aming-01 shares]# cp /usr/lib/zabbix/
alertscripts/ externalscripts/
[root@aming-01 shares]# cp /usr/lib/zabbix/alertscripts/mail.py ../mail/mail.py
[root@aming-01 shares]# cd ..
[root@aming-01 mon]# ls
bin conf log mail shares
[root@aming-01 mon]# cd mail
[root@aming-01 mail]# ls
mail.py
[root@aming-01 mail]# vim mail.py

[root@aming-01 mail]# vim mail.py

#!/usr/bin/env python
#-- coding: UTF-8 --
import os,sys
reload(sys)
sys.setdefaultencoding('utf8')
import getopt
import smtplib
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart
from subprocess import *
def sendqqmail(username,password,mailfrom,mailto,subject,content):
gserver = 'smtp.163.com'
gport = 25
try:
msg = MIMEText(unicode(content).encode('utf-8'))
msg['from'] = mailfrom
msg['to'] = mailto
msg['Reply-To'] = mailfrom
msg['Subject'] = subject
smtp = smtplib.SMTP(gserver, gport)
smtp.set_debuglevel(0)
smtp.ehlo()
smtp.login(username,password)
smtp.sendmail(mailfrom, mailto, msg.as_string())
smtp.close()
except Exception,err:
print "Send mail failed. Error: %s" % err
"mail.py" 40L, 1394C 1,1 顶端
需要知道的地方有三个,第一个,gserver = 'smtp.163.com' 发邮件的服务器的域名
第二个 , sendqqmail('aming_test2017@163.com','cc293016','aming_test2017@163.com' 这是我的163邮箱 和密码
这是mail.py,这还没有完,因为最核心的地方不是mail.py,而是 mail.sh,因为我们在所有的子脚本中,用到的都是mail.sh
[root@aming-01 mail]# vim mail.py
[root@aming-01 mail]# vim mail.sh

log=$1
t_s=date +%s
t_s2=date -d "2 hours ago" +%s //定义2个小时的时间戳
if [ ! -f /tmp/$log ] //日志不存在就创建日志
then
echo $t_s2 > /tmp/$log
fi
t_s2=tail -1 /tmp/$log|awk '{print $1}' //下面这一段等于一个计时器
echo $t_s>>/tmp/$log
v=$[$t_s-$t_s2] //时间戳对比
echo $v
if [ $v -gt 3600 ] // 当故障存在3600秒,就会进行告警
then
./mail.py $1 $2 $3
echo "0" > /tmp/$log.txt //等同于计数器
else
if [ ! -f /tmp/$log.txt ]
then
echo "0" > /tmp/$log.txt
fi
nu=cat /tmp/$log.txt
nu2=$[$nu+1]
echo $nu2>/tmp/$log.txt
if [ $nu2 -gt 10 ]
then
./mail.py $1 "trouble continue 10 min $2" "$3"
echo "0" > /tmp/$log.txt //邮件告警结束以后,重新开始计数
fi
fi

                                                                    30,0-1       底端

该脚本运用于,间隔3600 故障;10分钟内故障;间歇性故障;核心判断:计时3600秒、计数10次
20.26 运行告警系统

要执行告警系统,肯定要是每分钟,执行一次,写到crontab里面去
crontab -e

          • cd /usr/local/sbin/mon/bin ; bahs main.sh
            监控发送邮件的部分,尽量少用空格,因为mail.py发送邮件是以 空格来定义三个参数的
            [root@aming-01 mail]# pwd
            /usr/local/sbin/mon/mail

[root@aming-01 mail]# crontab -e
no crontab for root - using an empty one

            • cd /usr/local/sbin/mon/bin; bash main.sh
              ~
              ~
              ~
              ~
              ~
              因为是实验所以没有必要真正写到crontab里面去,可以手动的执行下
              [root@aming-01 mail]# cd /usr/local/sbin/mon/bin/
              [root@aming-01 bin]# sh -x main.sh
  • export send=1
  • send=1
    ++ /sbin/ifconfig
    ++ grep -A1 'ens33: '
    ++ awk '/inet/ {print $2}'
  • export addr=192.168.202.130
  • addr=192.168.202.130
    ++ pwd
  • dir=/usr/local/sbin/mon/bin
    ++ echo /usr/local/sbin/mon/bin
    ++ awk -F/ '{print $NF}'
  • last_dir=bin
  • '[' bin == bin ']'
  • conf_file=../conf/mon.conf
  • exec
    [root@aming-01 bin]#
    很明显这个肯定是有错的,exec就是把接下来的执行过程搞到了日志里,可以看下日志
    ++ date '+%F %T'
  • echo '2017-11-27 21:11:31 load average'
  • /bin/bash ../shares/load.sh
  • grep -q to_mon_502=1 ../conf/mon.conf
    ++ awk -F = '{print $2}'
    ++ sed 's/ //g'
    ++ grep logfile= ../conf/mon.conf
  • export log=/data/log/xxx.xxx.com/access.log
  • log=/data/log/xxx.xxx.com/access.log
  • $'/bin/bash\302\240\302\240../shares/502.sh'
    main.sh:行23: /bin/bash ../shares/502.sh: 没有那个文件或目录
    [root@aming-01 bin]#
    把502=1 改成 502=0 不需要监控,仅仅需要执行一个load
    [root@aming-01 bin]# vim ../conf/mon.conf

to config the options if to monitor

定义mysql的服务器地址、端口以及user、password

to_mon_cdb=0 ##0 or 1, default 0,0 not monitor, 1 monitor
db_ip=10.20.3.13
db_port=3315
db_user=username
db_pass=passwd

httpd 如果是1则监控,为0不监控

to_mon_httpd=0

php 如果是1则监控,为0不监控

to_mon_php_socket=0

http_code_502 需要定义访问日志的路径

to_mon_502=0
logfile=/data/log/xxx.xxx.com/access.log

request_count 定义日志路径以及域名

to_mon_request_count=0
req_log=/data/log/www.discuz.net/access.log
domainname=www.discuz.net

~
~
~
~
~
~
~
~
:wq
一开始你在调试的时候,建议把这部分先注释掉 #exec 1>>../log/mon.log 2>>../log/err.log,因为我们先暂时不需要把日志写入到日志里面去
#exec 1>>../log/mon.log 2>>../log/err.log
echo "date +"%F %T" load average"
/bin/bash ../shares/load.sh
#先检查配置文件中是否需要监控502
if grep -q 'to_mon_502=1' $conf_file; then
export log=grep 'logfile=' $conf_file |awk -F '=' '{print $2}' |sed 's/ //g'
/bin/bash ../shares/502.sh
fi

~
-- 插入 -- 17,2
:wq
[root@aming-01 bin]# vim main.sh
[root@aming-01 bin]#
再来执行下
[root@aming-01 bin]# sh -x main.sh

  • export send=1
  • send=1
    ++ grep -A1 'ens33: '
    ++ awk '/inet/ {print $2}'
    ++ /sbin/ifconfig
  • export addr=192.168.202.130
  • addr=192.168.202.130
    ++ pwd
  • dir=/usr/local/sbin/mon/bin
    ++ awk -F/ '{print $NF}'
    ++ echo /usr/local/sbin/mon/bin
  • last_dir=bin
  • '[' bin == bin ']'
  • conf_file=../conf/mon.conf
    ++ date '+%F %T'
  • echo '2017-11-27 21:20:06 load average'
    2017-11-27 21:20:06 load average
  • /bin/bash ../shares/load.sh
    21:20:06 load is 0
  • grep -q to_mon_502=1 ../conf/mon.conf
    [root@aming-01 bin]#
    说明执行过程没问题,当它调用load.sh也是没问题的
    [root@aming-01 bin]# bash ../shares/load.sh
    21:24:27 load is 0
    [root@aming-01 bin]#
    还有一种把文件的内容作为第三个参数
    [root@aming-01 bin]# cd ..
    [root@aming-01 mon]# cd mail/
    [root@aming-01 mail]# ls
    mail.py mail.sh
    [root@aming-01 mail]# vi mail.sh
    [root@aming-01 mail]# cd ..
    [root@aming-01 mon]# cd shares/
    [root@aming-01 shares]# ls
    502.sh disk.sh load.sh
    [root@aming-01 shares]# vim load.sh

#! /bin/bash
##Writen by aming##
load=uptime |awk -F 'average:' '{print $2}'|cut -d',' -f1|sed 's/ //g' |cut -d. -f1
if [ $load -gt 10 ] && [ $send -eq "1" ]
then
echo "$addr date +%T load is $load" >../log/load.tmp
/bin/bash ../mail/mail.sh aming_test@163.com "$addr_load:$load" cat ../log/load.tmp
fi
echo "date +%T load is $load"

~

~
~
10,0-1 全部
这就是我们的监控系统,至于发邮件,就不再演示了,自己去研究下,尤其是在告警收敛这款

转载于:https://blog.51cto.com/ch71smas/2045433

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值