京东前端:PhantomJS 和NodeJS在网站前端监控平台的最佳实践

news/2024/5/8 18:19:21/文章来源:https://blog.csdn.net/weixin_34245082/article/details/85993942

http://www.infoq.com/cn/articles/practise-of-phantomjs-and-nodejs-in-jingdong

1. 为什么需要一个前端监控系统

通常在一个大型的 Web 项目中有很多监控系统,比如后端的服务 API 监控,接口存活、调用、延迟等监控,这些一般都用来监控后台接口数据层面的信息。而且对于大型网站系统来说,从后端服务到前台展示会有很多层:内网 VIP、CDN 等。

但是这些监控并不能准确地反应用户看到的前端页面状态,比如:页面第三方系统数据调用失败,模块加载异常,数据不正确,空白开天窗等。

这时候就需要从前端 DOM 展示的角度去分析和收集用户真正看到的东西,从而检测出页面是否出现异常问题。

2. 需要监控系统解决的问题

页面通常出现以下问题时需要及时邮件、短信上报通知相关人员修复问题。

  • 返回错误(50x, 40x)无法打开
  • 模块加载失败
  • 页面乱码
  • 数据正确性
  • 现场快照,复现问题

3. 技术选型

监控的意义和测试的意义在本质上是一致的,都是对已上线功能进行回归测试,但不同的是监控需要做长期的可持续可循环的回归测试,而测试仅仅需要在上线之后做一次回归测试。

既然监控和测试的本质一致,那我们是完全可以采用测试的方式来做监控系统的。在自动化测试技术遍地开花的时代,不乏很多好用的自动化工具,我们仅仅需要把这些自动化工具进行整合为我们所用即可。

  • NodeJS - 特别适用于网络密集型任务
  • PhantomJS - 模拟无界面的浏览器,提供丰富的内核交互 API

NodeJS

NodeJS 是一个 JavaScript 运行环境,并且 NodeJS 支持非组塞 I/O 和异步、事件驱动,这点对于我们构建基于 DOM 元素的监控是比较重要的。

PhantomJS

PhantomJS 是一个基于 webkit 的 JavaScript API。它使用 QtWebKit 作为它的核心浏览器,使用 webkit 来编译解释执行 JavaScript 代码。任何你可以在基于 webkit 浏览器做的事情,它都能做到。

它不仅是个隐形的浏览器,提供了诸如 CSS 选择器、支持Web标准、DOM操作、JSON、HTML5、Canvas、SVG 等,同时也提供了处理文件 I/O 的操作,从而使你可以向操作系统读写文件等。PhantomJS 的用处可谓非常广泛,诸如网络监测、网页截屏、无需浏览器的 Web 测试、页面访问自动化等。

为什么不是 Selenium

做自动化测试的同学肯定都知道 Selenium。可以使用 Selenium 将测试用例在浏览器中执行,而且 Selenium 对各种平台和常见浏览器支持比较好,但是 Selenium 上手难度系数略高,而且使用Selenium 需要在服务器端安装浏览器。

考虑到监控主要任务在监控不在测试。系统并不需要太多考虑兼容性,而且监控功能相对单一,主要对页面进行功能上的回归测试,所以选择了 PhantomJS。

4. 架构设计

架构概览

架构如下图所示。

(点击放大图像)

架构简述

对于 DOM 监控服务,在应用层面上进行了垂直划分:

  • 规则管理系统。
  • 规则队列生成器。
  • 长时持续处理器。
  • PhantomJS 服务。
  • 服务化 API。

在应用层面上进行的垂直划分可以对应用做分布式部署,提高处理能力。后期再性能优化、系统改造扩展等方面也能提高简易性。

5. 解决方案

(1)前台规则录入

这是一个独立的 Web 系统,系统主要用来收集用户录入的页面信息、页面对应的规则、展示错误信息。通过调用后端页面抓取服务来完成页面检测的任务,通过系统可以创建三种类型的检测页面:常规监控、高级监控、可用性监控。

常规监控

录入一个页面地址,和若干检测规则。注意这里的检测规则,我们把常用的一些检测点抽象成了一条类似测试用例的语句。每条规则用来匹配页面上的一个 DOM 元素,用 DOM 元素的属性来和预期做匹配,如果匹配失败系统就会产生一条错误信息,后续交由报警系统处理

匹配类型一般有这几种:长度、文本、HTML、属性
处理器 类似编程语言中的操作符:大于、大于等于、小于、小于等于、等于、正则。

这样做的好处就是,录入规则的人只要了解一点 DOM 选择器的知识就可以上手操作了,在我们内部通常是交由测试工程师统一完成规则的录入。

高级监控

主要用来提供高级页面测试的功能,一般由有经验的工程师来撰写测试用例。这个测试用例写起来会有一些学习成本,但是可以模拟 Web 页面操作,如:点击、鼠标移动等事件。从而做到精确捕捉页面信息。

可用性监控

可用性监控侧重于对页面的可访问性、内容正确性等比 严重的问题 的即时监控。通常这类页面我们只需要在程序里面启一个 Worker 不断的去获取页面 HTML 就可以对结果进行检测匹配了,所以我们选择了 NodeJS 来做异步的页面抓取队列,高效快速的完成这种网络密集型任务。

(2)主动错误上报

页面脚本执行错误监控

页面引入一段监控脚本来收集页面产成 error 事件的信息,自动上报给后端服务,在系统里面可以汇总所有报错信息,以及对应的客户端浏览器版本、操作系统、IP 地址等。

页面主动上报

这个功能需要对应的前端工程师在代码中调用错误上报 API,来主动提交错误信息。主要使用的场景有,页面异步服务延时无响应、模块降级兜底主动通知等。监控脚本提供几个简单的 API 来完成这项任务。

// error 方法调用后立即上报错误信息并发出邮件、短信通知
errorTracker.error('错误描述')
// info 方法调用后立即上报信息,并在单位时间内仅仅产生一条邮件、短信通知
errorTracker.info('信息描述')
// log 方法调用后由报错检测是否达到设置阀值,最终确认是否报错
errorTracker.log('日志信息')

(3)后端页面抓取服务

由于京东很多页面内容是异步加载的,像首页、单品等系统有许多第三方异步接口调用,使用后端程序抓取到的页面数据是同步的,并不能取到动态的 JavaScript 渲染的数据,所以就必须使用像 PhantomJS 这种能模拟浏览器的工具。

常规监控我们使用 PhantomJS 模拟浏览器打开页面进行抓取,然后将监控规则解析成 JavaScript 代码片段执行收集结果。

高级监控我们使用 PhantomJS 打开页面后向页面注入像 jasmine, Mocha 等类似的前端 JavaScript 测试框架,然后在页面执行对应的录入测试用例并返回结果。

规则队列生成器

规则队列生成器会将规则系统采集的规则转化类成消息队列,然后交由长时持续处理器依次处理。

为什么采用类消息队列的处理方式?

这和 PhantomJS 的性能是密不可分的,由多次实践发现,PhantomJS 并不能很好地进行并发处理,当并发过多,会导致 CPU 过载,从而导致机器宕机
在本机环境下的虚拟机中进行并发测试,数据并不理想,极限基本在 ab -n 100 -c 50 左右。 所以为了防止并发导致的问题,就选择了使用类消息队列来避免因为并发过高导致的服务不可用。

类消息队列的实现

我们这里通过调用内部的分布式缓存系统生成类消息队列,队列的生成其实可以参考数据接口–队列。最基本的模型就是在缓存中创建一个 KEY ,然后根据队列数据结构的模式进行数据的插入和提取。

当然,类消息队列的中间介质可根据你实际的条件来选择,当然你也可以使用本机内存实现。这可能会导致应用和类消息队列竞争内存。

长时持续处理器

长时持续处理器是要功能就是消费规则队列生成器生成的类消息队列。

长时持续处理实现

在长时持续处理器的具体实现中,我们充分利用了 JavaScript 的 setInterval 方法来持续获取累消息队列的内容下发给规则转化器,然后转发给负载均衡调度器。之后再对返回的结果进行统一处理,比如邮件或者短信报警。

API

PhantomJS 服务可以做为公共 API 提供给客户端进行测试需求的处理, API 通过 HTTP 方式调用。在 API 的处理上需要提供 HTTP 数据到规则和 PhantomJS 的转换。从而又演化出了 HTTP 数据到规则转换器。

PhantomJS 服务

PhantomJS 服务是指将 PhantomJS 结合 HTTP 服务和子进程进行服务化的处理
首先、启动 HTTP 服务,然后将长时处理器下发的规则进行进一步转化,转化后启动子进程,HTTP 服务会监听子进程的处理结果,并在处理完毕之后返回。

(4)报警系统

报警系统我们目前使用的是京东内部自的统一监控平台 UMP,通过调用平台提供的一些 API 来实现报警邮件与短信通知。

如何根据报警到具体页面?

在用户通过监控管理系统录入规则后,监控系统会根据 UMP 规则针对用户录入的页面生成 UMP 使用的 key。当长时持续处理器发现 PhantomJS 服务返回的结果标示为异常后,就会使用 key 来进行日志记录。

何时出发报警?

报警主要分为了短信和邮件报警。邮件报警是在每条异常之后就会发给指定系统用户。短信则是根据异常次数来进行处理的,当异常次数过大,就会下发短信通知。

(5)部署

对于此系统部署是分为两大块进行的。因为机器资源数量有限,没有将所有部分都单独部署。

规则管理系统以及规则队列生成器和持续处理器整合部署在一台机器上,PhantomJS服务部署在了其他的机器上。进程管理使用了著名的PM2。这样就可以避免自己在开发类似的部署功能。PM2 是一个带有负载均衡功能的NodeJS应用的进程管理器。可充分利用CPU,并保证进程永远都存活。

PM2 特性:

  • 内建负载均衡(使用 Node cluster 集群模块)。
  • 无缝重启类似 nginx reload。
  • 具有 Ubuntu 和 CentOS 的开机启动脚本。
  • 控制台检测。

不过在此次部署中,并没有使用内建负载均衡的特性,没用通过集群的方式部署代理。仅仅使用了后台运行和 0 秒停机重载的特性

6. 总结与展望

其实我们现在开发的这套监控系统并不复杂,只是合理的运用了一些现有的技术框架。抽象出来我们自己需要的一些功能。但却有效的达到了我们的预期功能,并且节省了很多之前需要人肉测试的时间成本。系统本身还有很多问题在待解决状态,比如报警系统的规则处理与阀值设定,JavaScript报错的准确过滤机制等,这些问题我们都会一一解决,并且未来的前端监控系统会成为一个平台,核心服务在后端爬取页面服务,应用端可以有多种形式,比如监控、测试工具等。

一些可以持续优化点:

    • 监控系统虽然在应用层面进行了垂直划分,但是由于机器资源等限制,并没有进行单独功能的部署。这点可能会在后期的使用中进行优化。因为现在仅仅提供给本部门使用。
    • PhantomJS服务还需要进一步优化,以承载大并发,大处理量。提供成稳定的服务。协同开发业务线和测试业务线制定统一的规范,以达到优化的监控。
    • 报警由于依赖于公司内部的UMP系统,所以并不是特别灵活,每次系统接入都需要用户去UMP系统接入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_742432.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FLASH PLAYER 谷歌浏览器浏览网站无法正常显示的问题

大家使用谷歌浏览器访问网站时,有没有遇到如下情况: 谷歌浏览器通知你需要安装Adobe Flash Player,即使你按照提示安装了Adobe Flash Player,关闭浏览器重新 访问含有Adobe Flash Player的页面是,页面还会提示&#x…

艾格官方网站

2019独角兽企业重金招聘Python工程师标准>>> 艾格官方网站ETAM( http://www.kguowai.com/html/195.html)是著名女装品牌,源于1916年的德国,到1928年,连锁店网络发展到了巴黎,并以此为基地,逐步成为法国乃至…

NVMe Driver 需要装吗_不访问非法网站,不装乱七八糟的软件,还需要装杀毒软件吗?...

有些朋友会说:装杀毒软件会拖慢电脑速度,甚至还有广告弹窗,我使用电脑的习惯很好,平时不访问乱七八糟的网站,也不装什么七七八八的软件,我根本不需要装杀毒软件。是这样吗?很多人认为&#xff0…

Google的全新在线地图API演示网站 - More than a map

日期:2012-10-28 来源:GBin1.com More Than A Map是Google最新上线的Google地图API使用的演示网站,提供了丰富的Google Maps API的使用。 包括一下几个方面的功能展示: 基础功能卫星功能街景功能地点功能路线功能数据可视化功能相…

h5 img 图片显示不全_浅谈H5建站有哪些优势

移动互联网时代,基于 H5响应式网站的快速发展是当今时代的大势所趋,它可以帮助企业覆盖整个网络,同时提高转化率的营销和品牌形象。许多企业网站纷纷采用H5响应式技术建设网站,下面我们来分析 H5建站有什么优势。自适应传统网站无…

域名“江苏盱眙”Jsxuyi.com淘域抢注 可做地方网站

为什么80%的码农都做不了架构师?>>> 淘域网(B08.com)6月8日消息,.com域名Jsxuyi.com于昨日在域名预定平台抢注成功,目前该域名已进入为期三天的域名竞价期。域名Jsxuyi.com可音译为“江苏盱眙”&#xff0…

解决12306.cn网站验证码获取提示“基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系“的问题...

https://dynamic.12306.cn/otsweb/passCodeAction.do?randsjrand&0.8967564508222368 这是图片的访问网址 大家看清楚了,是Https的网站,也就是说是需要证书才能访问了,这个只要获取证书就行了,方法如下 先直接在浏览器输入这…

TypeWonder – 在任何网站上实时预览字体效果

TypeWonder 让网页字体的选择过程变得轻松愉快。它可以帮助您在任何网站上快速测试 Web 字体效果!输入网站网址,就能够即时预览的字体的实际效果,还可以从数百种字体中进行挑选,您还可以得到所需字体的代码,可以很方便…

.net网站开发(一):1.input表单元素

其实,在半年前我对网站开发还是完全不感冒的,不是没认识,而是只认识到表面。我以为网站模型就那几样,新闻、论坛、博客啥的,仿个站出来有什么意思?但现在我是知道了,大多应用开发还是采用B/S架构…

ABUSE建了个恶意网站数据库

2019独角兽企业重金招聘Python工程师标准>>> 数据库已经按不同类型标记了各种恶意网站,例如它们当前是否在线,恶意内容类型,潜在威胁信息等。安全软件开发人员和浏览器开发人员可以免费使用此数据库来帮助用户拦截可能存在威胁的恶…

jQuery Masonry构建pinterest网站布局注意要点(转)

在愚人码头的博客上看到有关于如何构建pinterest网站的文章,其实就是“图片瀑布流显示”,我试着在本地做了一个,没有什么问题,但是放到公司的网站上就问题多多。一是定位不准确,二是图片显示不完整。但是重新改变下窗口…

【JAVA WEB教程】jsp环境搭建+部署网站(eclipse+tomcat)【详细+图文】

下载tomcat7.X下载地址为:http://tomcat.apache.org/download-70.cgi下载完成之后就开始安装NextI Agree选中所有的复选框输入你的用户名和密码注意:一定要选择JDK下面的JRE选择安装目录点击finish在eclipse中删掉原来默认的J2EE web服务器创建一个新的服…

通过 HTTPS 和 SSL 确保 Windows Azure 网站 (WAWS) 安全

编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Erez Benari 撰写。 随着身份盗窃和各种形式的网络犯罪迅速增多,使用安全套接字层 (SSL) 对网站进行保护变得越来越重要和普遍。如果将网站托管在 Windows Azure 网站 (WAWS) 上,您可…

如何在Github网站仓库创建文件夹

首先要有一个已经建好的仓库,如这里我建了个pic仓库 点击Add file 再点Create new file 假设我要建立一个blog文件夹,只需要在填入blog后加上斜杠/即可 加上 / 自动转化为文件夹 滚动页面到最底下发现无法提交(commit)&#…

如何在Github网站仓库删除文件

比如删除如下test.png文件 点进去后即可发现右侧有一个很小的删除按钮(找了好一会TVT 点击后commit changes即可

大型网站技术架构(一)大型网站架构演化

2019独角兽企业重金招聘Python工程师标准>>> 看完了有一本书,就应该有所收获,有所总结,最近把《大型网站技术架构》一书给看完了,给人的印象实在深刻,再加上之前也搞过书本上讲的反向代理和负载均衡以及ses…

一个网站故障排查的、代码更新的简便脚本

故障排错脚本由于近来公司的服务器经常会出点小问题,基于各种原因要去排错。这里我用python写了一个脚本,主要四调用os模块操作。有一个是要统计mysql最大连接数的。因为好像python不支持"show processlist",所以自己写了一个模块m…

nofollow标签_网站seo优化nofollow的具体用法

一个人的资源是有限了,一个人的精力也是有限的,我们在优化的时候,要知道网站首页是一个网站权重最高,也是权重最集中的地方,这时候就需要进行权重之间的传递,就需要用到nofollow标签了,下面我们…

网站地图生成器_Mobirise for mac(网站创建开发) v4.10.7最新免费版

Mobirise mac是款高效的网站创建软件,Mobirise为您提供顶级工具栏和网站构建器面板,使您可以轻松地构建网站,且需无需编写任何代码。使用Mobirise只需几分钟就可以拖放块并构建网站,轻松创建响应式和移动优化的网站,欢…

网站管理助手4.0 mysql_会员管理--管理中心

一、创建站点软件界面如图:点击“创建站点”,如图:站点名称:填写一个FTP账号,可以是英文(建议小写)和数字的组合FTP密码:建议保持默认或自己设定一个容易记住但比较复杂的密码,切勿用FTP账号做密…