利用Openshift中的cronjob + zalenium实现网站监控
背景介绍
有一个网站(pf.apps.example.com),会获取主机的信息,但是主机信息的格式不统一,而且经常性会添加机器,但是信息又是不确定的,所以有时添加新机器会缺失字段,导致网站异常。
有两种解决方法,
优化代码,提高代码的兼容性,不致于导致页面无法显示。
严格规范字段的输入,必须保证字段的完整性。
不管哪种方法,我们都需要在页面出现故障时第一时间知道。这就要求编写代码自动监测网站相关页面的可用性,一旦出现问题,及时发邮件告知,第一时间恢复。
有使用到上篇介绍的zalenium
Openshift部署zalenium(容器化的selenium)及Python自动测试
编写监控脚本
监控脚本使用selenium控制浏览器,先模拟登录,再访问需要测试的页面,如果页面正常打开则正常,否则发邮件告警。(由于这个网站的每个页面都有id=content的一个div,所以通过检测页面中是否存在id=content的div来判断页面是否正常)monitor.py
# -*- coding: utf-8 -*-""" ------------------------------------------------- File Name: test Description : Author : 潘晓华 date: 2018/6/5 ------------------------------------------------- """import unittestfrom selenium import webdriverfrom selenium.webdriver.remote.remote_connection import RemoteConnectionimport smtplibfrom email.mime.text import MIMETextfrom email.header import Header TEST_USERNAME = 'test'TEST_PASSWORD = '123456'NOTICE_EMAIL = 'panxiaohua@mail.com'class SeleniumTestCase(unittest.TestCase): def setUp(self): remoteconnection = RemoteConnection('http://zalenium.apps.example.com/wd/hub', keep_alive=False, resolve_ip=False) self.driver = webdriver.Remote(command_executor=remoteconnection, desired_capabilities={ 'browserName': "chrome", 'video': 'False', 'platform': 'LINUX', 'platformName': 'LINUX' }) self.driver.implicitly_wait(30) self.driver.maximize_window() def test_login_test_case(self): self.driver.get("http://pf.apps.example.com") username_input = self.driver.find_element_by_id('username') password_input = self.driver.find_element_by_id('password') login_button = self.driver.find_element_by_id('login_btn') username_input.clear() username_input.send_keys(TEST_USERNAME) password_input.clear() password_input.send_keys(TEST_PASSWORD) login_button.click() try: self.driver.find_element_by_id('content') self.driver.get("http://pf.apps.example.com/dashboard/dailyresource") self.driver.find_element_by_id('content') except Exception, e: self.notice_by_email() def notice_by_email(self): sender = 'panxiaohua@mail.com' message = MIMEText(u'自动平台有故障,请检查', 'plain', 'utf-8') message['From'] = Header(u"AutoPf") # 发送者 message['To'] = Header("panxiaohua") # 接收者 subject = u'自动化平台有故障告警' message['Subject'] = Header(subject) try: smtpObj = smtplib.SMTP() smtpObj.connect('mail.com', 25) # 25 为 SMTP 端口号 smtpObj.login(sender, '123456') smtpObj.sendmail(sender, [NOTICE_EMAIL], message.as_string()) print u"邮件发送成功" except smtplib.SMTPException: print u"Error: 无法发送邮件" def tearDown(self): self.driver.quit()if __name__ == '__main__': unittest.main()
制作监控镜像
基于python27,安装相关的模块,并将monitor.py导入镜像
# DockerfileFROM centos/python-27-centos7:2.7 RUN bash -c 'pip install selenium -i https://pypi.douban.com/simple/'COPY monitor.py ./monitor.py
创建定时任务
通过创建Cronjob每隔一个小时,运行创建的容器,并检测对应网站的状态。
# cronjob.yamlkind: CronJob apiVersion: batch/v1beta1 metadata: name: monitor spec: jobTemplate: spec: template: spec: containers: - name: monitor-autopf image: harbor.apps.example.com/autopf/monitor:v1 imagePullPolicy: Always command: ["bash", "-c", "python monitor.py"] restartPolicy: Never schedule: "0 * * * *"
通过configmap实现通用监控
很明显,以上的镜像只能针对该网站的指定两个页面(一个是登录后自动跳转的页面,另一个为“http://pf.apps.example.com/dashboard/dailyresource”),如果有新的监控项或者对其它网站有监控,就必须重新制作对应的镜像。这将会是多麻烦。
通过ConfigMap可以将监控代码作为变动项,而保证镜像统一。也就是说将monitor.py(或者有其它依赖的文件)作为configmap资源,挂载到镜像中,最后再通过设置command来执行监控。
创建ConfigMap将monitor.py代码放在configmap中
apiVersion: v1 data: monitor.py: "# -*- coding: utf-8 -*-\r\n\"\"\"\r\n-------------代码内容---------------unittest.main()"kind: ConfigMap metadata: creationTimestamp: null name: monitor
将它挂载到Cronjob中的/opt/app-root/src下
... jobTemplate: spec: template: spec: containers: - command: - bash - -c - python monitor.py image: harbor.apps.example.com/autopf/monitor:v1 imagePullPolicy: Always name: monitor-autopf volumeMounts: - mountPath: /opt/app-root/src name: monitor-cm restartPolicy: Never volumes: - configMap: defaultMode: 420 name: monitor name: monitor-cm schedule: 0 */6 * * * ...
至此便完成了通用监控镜像,如果监控有更新,只需要更改configmap中的monitor.py的代码即可。
与主题无关
作者:潘晓华Michael
链接:https://www.jianshu.com/p/dd4c7b22557b
共同学习,写下你的评论
评论加载中...
作者其他优质文章