国庆长假来临,IT们都在祈祷服务器和程序正常,安安心心过个假期吧。

首先配置mailx发送邮箱
vim /etc/mail.rc
编辑mail.rc,在最底下加入几行配置(这里用的是腾讯企业邮箱)
#邮箱地址
set from=monster@sz-ysxd.com
#发送服务器
set smtp=smtps://smtp.exmail.qq.com:465
#发送邮箱
set smtp-auth-user=monster@sz-ysxd.com
#邮箱认证码
set smtp-auth-password=xxxx
#忽略证书警告
set ssl-verify=ignore
#证书存放位置
set nss-config-dir=/etc/pki/nssdb
发送邮件格式
echo “我是内容” | mail -s “我是标题” monster@sz-ysxd.com
下面脚本思路:
1.定时任务里面定时每十分钟执行一次此脚本,脚本后面跟随一条生成docker 容器状态并写入指定日志用来比较
2.此脚本每10分钟运行的时候,获取当前的容器状态信息写入ram2.log
3.loop用来判断是第几行的数据,循环读取docker 容器信息第7列也就是内存的数值
4.拿现在的容器内吃数值和10分钟之前的数值比较,如果大于或等于之前的数值并且大于或等于70%就触发告警(如果10分钟之前内存使用率大于70%现在却降下去了便不告警,反之10分钟之前没有大于70%使用率,现在大于了也不告警等待10分钟后的对比。如果符合现在比10分钟之前大于或等于内存使用率,还得判断是否高于或等于70%,低于70%即可无视,高于便要考虑是否给容器加大资源了。)
#!/bin/bash
#内存使用率超过70%重启容器发送邮件告警
Time=$(date +"%Y-%m-%d %T")
#显示所有信息用来有邮箱告警查看
docker stats --no-stream > /data/ram2.log
loop=0
#循环读取每个容器的百分值
for line in `cat /data/ram.log | awk '{print (100*$7)}'`
do
loop=$(( $loop + 1 ))
#断大于等于7000(70%)
if [ `sed -n $loop'p' /data/ram2.log | awk '{print (100*$7)}'` -ge "$line" -a "$line" -ge 7000 ]; then
#如果大于70%发送邮件告警
echo -e "【47.119.195.139:9529】有容器内存使用率达到70%,使用情况如下:\n-------------------------------------------------------------------------------------------------------------------------------------\n 【10分钟前的状态】\n `sed -n $loop'p' /data/ram.log` \n 【现在的状态信息】 \n `sed -n $loop'p' /data/ram2.log` \n-------------------------------------------------------------------------------------------------------------------------------------\n `docker ps | awk '{print $1,$2,$3}'`" | mail -s "S3监测告警[$Time]" it@sz-ysxd.com 2>/dev/null
#exit
fi
done
效果:
S1

S2

S3

上面这种模式几乎每10分钟都会发送邮件告警,太频繁了,现在直接改成每秒都查询大于等于80%就告警
改良版:
1.使用nohub bash /data/miao1.sh &后台运行miao1.sh脚本,脚本会每秒都查询容器信息并写入miao1.log里面
2.写入日志后,立马查询当前是否有容器内存使用率是否有到达80%
3.需要注意查到有大于等于80%的容器需要把后台进程kill掉,不然大于80%后每秒都在发送邮件告警!!!
在 /data 下面新建个miao1.sh 脚本
while true; do docker stats --no-stream > /data/miao1.log ;bash /data/miao1mx.sh; sleep 1; done
miao1mx.sh脚本
#!/bin/bash
#每秒查询内存有无超过80%
Time=$(date +"%Y-%m-%d %T")
loop=0
#循环读取每个容器的百分值
for line in `cat /data/miao1.log | awk '{print (100*$7)}'`
do
loop=$(( $loop + 1 ))
#判断大于等于8000(80%)
if [ "$line" -ge 8000 ]; then
#如果大于80%发送邮件告警
echo -e "【47.119.195.139:9529】有容器内存使用率达到80%,使用情况如下:\n-------------------------------------------------------------------------------------------------------------------------------------\n `sed -n $loop'p' /data/miao1.log` \n " | mail -s "S3监测告警[$Time]" it@sz-ysxd.com 2>/dev/null
kill 23505
fi
done