在亿万服务、海量数据的今天,对于互联网服务的要求就是三高,高并发、高性能、高可用 。为了实现“三高”,程序员们可真是使尽浑身解数,在技术架构上使用微服务架构,在部署方式上使用Docker、Kubernetes,在弹性扩容方面使用云计算等等 。而今天要给大家介绍的便是应用监控体系 。监控就像应用的跟屁虫一样,走到哪跟到哪,做了什么全知道并记录下来,通过监控体系的搭建,当应用有问题时可以快速“回放”应用轨迹,找到原因,长远来说,还可以预测故障的发生,提前避免 。
那么一个应用体系是怎么样的呢?用户通过在PC或智能终端(手机)通过浏览器或App对应用发起请求,请求通过网络传输到业务系统,业务系统的函数通过应用框架、中间件运行起来,运行系统又依托于操作系统,操作系统需要网络设备如网卡等与外界建立通讯,而这全套软件都是安装在硬件之上,如服务器、网卡等硬件设备都是安装在机房中 。因此对一个应用体系的全栈监控就包含APP监控、浏览器监控、服务器监控、网络监控、日志监控、基础设施监控、物理环境监控 。
APP监控
目前APP的主流操作系统有Android、IOS,因此每个APP开发时都会有两个版本,APP的开发流程是研发根据产品需求进行功能的开发,开发完成后打对应的Android包、IOS包在安卓应用商店、苹果应用商品进行上线 。因此对于APP的监控是通过打包时将探针安装在对应的应用包里,形成正式包对外发布 。
当用户手机下载了APP后,在使用APP的各个功能时,整个的行为轨迹也被探针记录下来了 。探针会采集两类数据,用户数据和APP运行数据,用户数据包括设备所在的地域、城市、设备的操作系统、使用时长、使用次数,运行数据包括APP运行网络情况、卡顿情况、缓慢情况 。获取到用户数据和运行数据后就可以运营分析和运维监控了,了解开发的APP用户日活、访问区域、访问版本等,帮助产品运营同学进行产品的优化迭代提供意见;通过运维数据可以知道用户打开APP是否白屏、是否卡顿、是否缓慢、是否网络被运营商劫持,从而帮助研发人员快速解决问题,提高用户留存率 。
浏览器监控
对于浏览器的监控,起源于早期互联网时代,购物、购票、办公等都是在PC端进行,随着移动互联网的兴起,逐步的被弱化,但是却是不可缺少的,因此浏览器监控也是监控体系中不可缺少的一环节 。浏览器监控体系也是包含三部分,探针采集数据发送后端、后端处理数据给到前端、前端呈现给用户 。
探针的实现取决于应用如何运行,对于浏览器应用来说,主要是前端基于html/css、JAVAScript进行开发,用户在浏览器输入URL,首先在本地进行缓存查询是否有该地址对应的IP地址,如果没有则再使用DNS进行域名解析,找到提供服务的地址,其次再对该地址进行TCP三次握手连接,发送请求获取请求数据,获取到数据后进行数据解析,包括HTML文档解析、DOM构建、页面渲染,最后呈现给到可视化页面用户 。
因此浏览器探针是一段JS代码,通过浏览器的加载事件、导航事件等获取页面访问的数据,比如浏览器基本信息、采集页面性能数据、采集Ajax性能数据和请求响应数据、JS错误数据、页面追踪数据等,再发送给到后台处理加工,形成用户运营数据(比如页面PV、运营商信息、浏览器信息、访问城市省会信息)、运维数据(比如Ajax错误信息、JS缓慢页面信息),帮助运营了解产品用户情况,更好的推广营销、帮助研发运维团队解决产品生产环境中的功能性能问题 。
服务器监控
对于服务器监控主要是监控后端系统的运行情况,因Java、Python、php、.Net/.NetCore、C/C++、Golang等语言都可以开发后端应用,因此服务器探针也包含各种语言的探针 。从这八种开发语言的特性来看,有的语言是编译型,即将源代码翻译成机器码后才能运行,例如Golang,C/C++;有的语言是解释型,边执行边翻译,例如PHP、Python;有的语言是混合型,介于编译型和解释型之间,即把代码编译成中间码再在语言提供的平台运行,例如Java、.Net/.NetCore 。因此不同类型语言的探针实现也不一样 。
对于解释型语言来说,使用HookApi的方式实现,例如Python在运行过程中会需要调用框架和函数,因此Python探针针对各个框架各数据库需要专门定义Hook函数,探针启动时会将我们写好的Hook函数(针对WEB框架,WSGI,数据库等)加入sys_meta_path中,这样用户函数在执行后就会先执行我们定义好的Hook函数,采集数据;对于编译型语言来说,使用SDK的方式实现,总体的思路和HookAPI一致,差别在于SDK是完全封装好的内容;对于混合型语言来说,使用Agent的方式实现,比如Java探针在JavaSE的Instrumention上做开发,在Java代码编译的时候进行了代码注入,Java探针依附在Java进程里,不会创建新的进程,而是创建多个线程来采集和汇总数据,如下图所示 用户的类A.class通过ClassLoader装载进JVM时会调用Javaagent嵌入监控代码生成A'.class,当有用户请求进来时,Engine会找到A'.class执行正常的业务逻辑,逻辑执行完毕后Engine会将监控Data写入监控数据缓存区(即一次采集周期),并且每隔60s会向Server发送数据,清理缓存区 。
推荐阅读
- 工控渗透框架ISF介绍:信息收集篇
- 鸠坑毛尖品质特征,鸠坑毛尖历史文化介绍
- 黑客术语介绍!web渗透小白的进阶之路
- 笑忘书歌词介绍
- 金银花茶的功效与作用,金银花茶功效与作用介绍
- 桂圆莲子红枣茶的做法,红枣桂圆茶材料做法介绍
- 老白茶如何醒茶,老白茶的功效介绍
- 花草茶搭配大全,排毒清脂花草茶材料做法功效介绍
- 老乌山古树茶介简,老乌山古茶山老乌山古茶山介绍
- 黄茶加工工艺先容,黄茶具备什么特点黄茶的来历介绍