本文介绍了获取云监控报警回调的有趣实践。
本文内容来自实战派征文,作者为wangbin_ouhin。
场景介绍
针对阿里云上部署的业务系统,现在有通过Zabbix收集指标和服务的死活监视。
为了提高业务监视的可靠性和及时性,经调查后决定通过使用阿里云的云监控和Zabbix组成双保险,并针对核心服务器进行深度定制:当云监控(CMS)监视到问题时,通过报警回调办公区树莓派的Web接口,实现办公区内的语音播报。便于运维小伙伴及时跟进。
结构图如下:
目标读者
已在使用阿里云平台,想要通过云监控的报警回调第一时间获取系统警报的运维团队。
前提条件/环境准备
已开通云监控(CMS)服务
一台云服务器(监视对象)
办公区内的树莓派(标准noobs系统)及音响
操作步骤
步骤一:在树莓派上启动报警回调服务
报警服务基于Python3实现,使用Python CGI脚本启动Web服务,并通过路由器的NAT对外公开,以供阿里云调用。
服务目录文件如下
../
├── cgi-bin
│ └── warning.py <= 语音播报脚本
├── cgiserver.py <= Web服务CGI脚本
├── warning-recovery.mp3 <= 报警事件恢复的语音文件
└── warning.mp3 <= 报警事件开始的语音文件
语音播报脚本(warning.py)的实现
使用vlc库播放语音。
使用cgi库获取云监控的回调参数。
'alertState'为OK视为问题恢复;
上述以外视为问题发生。
*报警参数文档URL:
*源代码:
#!/usr/bin/env python3
import time,vlc
import cgi
form = cgi.FieldStorage()
audio_file = "warning.mp3"
if 'alertState' in form and form['alertState'].value == "OK":
audio_file = "warning-recovery.mp3"
audio_warning="file:///home/pi/Desktop/py-server/" + audio_file
vlc_instance = vlc.Instance()
vlc_player = vlc_instance.media_player_new()
vlc_media = vlc_instance.media_new(audio_warning)
vlc_player.set_media(vlc_media)
vlc_player.play()
time.sleep(1)
audio_length = vlc_player.get_length() / 1000
time.sleep(audio_length)
Web服务CGI脚本(cgiserver.py)的实现
使用Python标准的http.server库来启动Web服务。此处使用8000端口提供服务。
*源代码:
from http.server import CGIHTTPRequestHandler, HTTPServer
handler = CGIHTTPRequestHandler
handler.cgi_directories = ['/cgi-bin', '/htbin'] # this is the default
server = HTTPServer(('0.0.0.0', 8000), handler)
server.serve_forever()
准备报警开始和恢复时的mp3文件
建议使用10秒以内辨识度高的语音文件,文本最好重复2遍。
另外,记得在树莓派音量按钮右键点击,选择AV Jack,以便通过音响输出。
*此处非常感谢办公室的小姐姐友情录音。
启动Web服务对外公开
转到cgiserver.py脚本目录,执行如下命令启动Web服务。
python3 cgiserver.py
并在路由器上设置NAT把树莓派的8000端口服务对外公开。
*由于路由器厂商差别较大此处省略截图。
步骤二:云监控(CMS)报警规则设定
创建报警规则
打开【云监控】服务,依次点击左侧【报警服务】》【报警规则】。页面展示后点击【创建报警规则】按钮。设置截图及说明如下:
添加监视规则
本次实验以云服务器的CPU使用率为例进行展示。截图及说明如下:
方案验证
进入验证用云服务器,使CPU使用率达到100%
执行命令: yes > /dev/null &
*本服务器是双核,需要执行两次
*记录下返回的PID,测试完毕后使用kill PID命令结束进程。
树莓派接收到阿里云的调用
手机和邮件收到报警信息的同事,树莓派连接的音响播放了报警信息。
恢复的时的报警同理。
结语
通过云监控的回调来播放报警语音的尝试得到了同事们的认可,可以在开会等不方便查看短信及邮件的情况下第一时间了解到报警状况。后续还可以结合IoT配置灯光提醒,有很大的扩展潜力。有兴趣的小伙伴可以尝试一下。