爱奇艺智能前端异常监控平台的设计与实践
sinye56 2024-10-25 16:15 7 浏览 0 评论
前端监控一般包括三方面:异常监控、性能监控(First Meaningful Paint、First Contentful Paint等性能指标监控)及行为数据监控(PV、UV、页面停留时长等监控)。其中前端异常监控主要监控因前端代码执行异常、接口请求异常等导致页面出现异常,得不到预期结果的情况。从异常导致的问题表现方面来看,前端异常监控平台应能够帮助开发者轻松应对包括但不限于以下问题:
- 业务日益扩张,很多重要但较低频的报错事件不会使接口成功率降低和预警,导致问题不能及时发现。
- 对于有些报障反馈的问题,利用测试账号构造类似的数据无法复现。
- 接口报错事件反映前端传参不对,但当前请求相关的前端代码没有逻辑问题,需要花费较多时间推测可重现场景及寻找根源。
当前业界涵盖前端异常监控的成熟方案有很多,但这些平台也有使用定制困难等不利方面:
- 这些平台几乎都是收费的,有的跟云服务打包出售,有的单独出售。
- 这些前端监控平台的架构都是不开源的,大多数使用者没有办法对这类前端监控平台通过二次开发得到适合当前项目的前端监控平台。
- 这些前端监控平台大部分都不支持私有化部署,使用者无法得到监控数据做更深入的分析。
- 这些平台的功能定制化能力比较差,即使个别定制化能力比较好的平台,若想达到期望监控的效果,需要做比较复杂的定制或者较多地侵入业务项目逻辑。
因此我们自研了爱奇艺智能前端监控平台——鹰眼(Hawkeye),目前该平台已接入了爱奇艺内容创作、分发和变现平台的大部分业务,经过几个月的使用,帮助业务及时发现了不少问题,也帮助业务负责人对各自系统的整体的运行状态有了更深入的了解,对线上项目起到了很好的保障作用。
本文将从设计和实践方面分别对该平台进行详细阐述。
前端异常监控平台介绍
鹰眼是以帮助及时发现问题、加速业务项目排障为目标的前端异常监控平台。尤其善于应对业务繁多的场景,在对相对低频而又重要的业务进行监控这一方面表现非常理想。
鹰眼主要有以下三点优势:
- 提供事件聚合问题列表,支持业务类型隔离监控报警,支持按照异常业务码配置去监听接口请求错误,能帮助前后端开发人员更容易、更及时的发现系统问题。
- 会记录发生错误事件之前用户的操作和接口请求,并支持通过前端生成或记录接口返回的Trace Id来串联前后端链路,为异常排查提供更多的线索。
- 接入简单快捷,对代码的侵入性低。
整体架构如图1-1,包括了采集JSSDK, 后端采集服务,监控后台三部分。
采集JSSDK负责采集异常并上报,其中可采集的信息包括:JS运行时异常(包括通过window.addEventListener监听error事件收集到的TypeError、ReferenceError等异常以及通过window.addEventListener监听unhandlerejection事件收集到的promise异常)、接口请求异常、静态资源加载异常、前端框架错误、发生异常之前的用户操作和请求。采集服务先对数据做校验清洗,之后按照一定的报警策略进行报警,同时会投递消息到监控后台。监控后台基于公司大数据平台与流式计算平台构建了实时计算引擎,对接收的异常消息进行处理,为监控管理页面、报表统计、报警平台等提供数据。
接下来会从以下四个方面去介绍鹰眼前端异常监控的设计要点,这些是达成及时发现问题、加速业务项目排障这两个主要目标的关键。
一. 事件智能聚合
如果一个平台类项目页面访问量较高、业务较为复杂,那么某一类问题收集到的事件会非常多,庞大的事件量是不利于开发人员查看和发现问题的。因此我们对事件按照错误类型、错误信息及访问页面地址等按照规则等进行分类,为同一类的事件生成一个错误ID,并存入Redis中。
二. 业务类型隔离监控报警,支持按照异常业务码配置去监听接口请求错误
对于接入了10+业务类型的单页面应用,若只按照项目划分,不利于各业务负责人发现各自关注的问题。因此,我们支持建立业务类型、接口返回错误码以及报警Topic Id等的映射配置,之后在问题收集、监控报警、统计分析等各个过程中可根据配置进行定制化处理,如图1-3示意。
具体说明如下:
- 前端统一拦截Ajax/Fetch接口请求,根据配置传入的业务错误码去采集接口的报错信息。这样的方式对于业务项目逻辑是无侵入的。通过window.addEventListener的方式可以监听到网络请求的异常只能监控到Ajax失败的请求,但无法判断HTTP状态码,并且有的业务接口返回的HTTP状态码CODE是200,业务真正的错误码在Response Body中返回。因此对于Ajax请求监控,采用重写XMLHTTPRequest的方式采集错误。同时为了做到低侵入式的业务隔离监控,我们采用业务错误码配置的方式来监控接口的报错情况。
- 待办问题列表按照业务配置区分展示,帮助各个业务负责人及时对当天的项目问题进行整体把握。
- 同一平台项目下,报警按照业务区分,不同业务的报警不会相互影响。
三. 收集错误上下文,利用Trace Id串联前后端链路
有些异常事件的发生并不只涉及一次用户操作或接口请求,而可能是异常发生之前的接口超时引起的或者某个特定的操作系列导致的报错。因此对于当前报错之前的用户操作或请求以及请求耗时也需要进行收集,帮助快速定位问题。
对于接口请求异常,鹰眼支持记录后端返回的Trace Id串联前后端的链路监控,这样能够在前端监控发现问题时,直接根据Trace Id查看前后端的整个链路,关联业务日志,分析异常环节,快速定位问题。
同时,鹰眼也支持前端生成Trace Id,通过设置HTTP请求头实现(如图1-5),请求头遵从公司Rover全链路追踪系统的数据规范。
四. 基于公司大数据平台与流式计算平台建设监控后台
鹰眼异常监控系统构建在公司大数据平台与流式计算平台之上,后台技术架构如图1-6所示。
数据源:前端上报的异常事件会首先进入消息队列当中,作为统一的数据源供后续存储和计算使用;同时,使用消息队列也是一种削峰的手段,避免业务高峰时期大量上报的异常事件拖垮服务。
引擎:引擎层分为存储引擎和计算引擎。存储引擎:根据数据类型与特点,选择合适的数据存储。使用Redis生成异常事件的错误ID,根据项目、异常类型、异常值等维度生成唯一的错误ID,同一类异常事件将聚合在相同错误下。使用ES存储异常事件中的部分字段,主要用于鹰眼监控平台中检索使用。使用HBbase存储异常事件的全部字段,因为上报的异常事件中包含了异常堆栈、上下文等信息,数据量较大且并不用于检索,因此选择了适合存储海量数据的HBbase。MySQL主要存储一些配置信息,例如项目设置、报警配置等。计算引擎:主要使用流式计算引擎Flink对上报的异常事件进行实时的计算和聚合。
展望
目前鹰眼监控已接入了爱奇艺内容创作、分发和变现平台的大部分业务,在日常工作中大幅度辅助提升了运维效率,具体表现如下:
- 通过查看当前的问题列表(如图1-2)及时发现问题,先于用户报障发现问题。业务开发同学可以选择各自业务的问题查看,后端同学可以设置默认展示Service API Error(接口报错)查看。
- 通过Stack Trace、用户设备环境信息、Trace Id等快速定位问题, 通过错误上下文快速排查疑难杂症,如图1-4,图1-5。其中利用Trace Id的全链路监控可以显著提升接口报错的排查效率。
- 通过各种维度的统计,去分析项目的运行状况。鹰眼的数据方便接入各种可视化平台统计分析,可分析项目问题发生的趋势,以及各个项目问题解决的情况。比如利用Grafana出色的多数据源支持和报表功能,进行数据报表的开发和展示,如图1-7。
以上所述,鹰眼已经可以很好的满足我们日常业务中的监控需求,但还有几个方向值得我们去思考,例如,在SDK代码体积,需求程度、开发成本等之间做权衡时,可以考虑是否需要实现以下功能:
页面崩溃:页面崩溃后,正常的上报流程就无法走通了,如果需要投递页面崩溃前相关信息,可以通过beforeunload结合sessionStorage,在下次打开页面时上报,如果项目使用PWA(Progress Web Application),也可以在SserviceWworker实现上报。合并日志:如果用户访问量大,上报日志多,或用户反复触发同一个错误时,我们考虑是否需要将几次日志合并到一起再上报。HTTP2.0:HTTP2.0上报头部压缩,多路复用的优点,会使监控投递性能更高。
在未来我们将继续优化扩展鹰眼的能力,比如:尽快提供小程序SDK,提供更多WEB框架的支持,帮助更多技术栈的开发者们及时发现问题、快速排障。同时也会尽快将开源提上日程,以便更多有需要的开发团队使用和借鉴。
相关推荐
- 程序员:JDK的安装与配置(完整版)_jdk的安装方法
-
对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...
- Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置
-
一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...
- 麒麟系统安装JAVA JDK教程_麒麟系统配置jdk
-
检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...
- 学习笔记-Linux JDK - 安装&配置
-
前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...
- Linux新手入门系列:Linux下jdk安装配置
-
本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...
- 测试员必备:Linux下安装JDK 1.8你必须知道的那些事
-
1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...
- Linux 下安装JDK17_linux 安装jdk1.8 yum
-
一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...
- 在Ubuntu系统中安装JDK 17并配置环境变量教程
-
在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...
- 如何在 Linux 上安装 Java_linux安装java的步骤
-
在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...
- Windows和Linux环境下的JDK安装教程
-
JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...
- linux安装jdk_linux安装jdk软连接
-
JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...
- linux安装jdk,全局配置,不同用户不同jdk
-
jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...
- 运维大神教你在linux下安装jdk8_linux安装jdk1.7
-
1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...
- window和linux安装JDK1.8_linux 安装jdk1.8.tar
-
Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...
- 最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?
-
默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- linux进程通信 (63)