加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 动态 > 正文

阿里百川码力APP监控 来了!

发布时间:2016-11-05 04:52:01 所属栏目:动态 来源:阿里百川专区的网站
导读:副标题#e# 阿里百川码力APP监控来了! 这个APP监控 和手淘一起成长 历经千锤百炼 走过千BUG万坑 如今百川起产品 为了让你的APP更好 用户更爽! 在移动互联网时代,一款应用是否成功,用户体验是一个关键的因素。APM的发展使得用户体验越来越完善,本文通过9

对于数据采集之后会统一进入可以承载海量数据的存储系统和日志系统,统计系统会利用落地的数据完成数据的计算处理、生成报表,帮助开发者长期跟踪应用和服务的性能,而告警系统则会根据规则在问题发生时发出短信、邮件等即时告警,从而帮助开发者及时解决问题,降低损失。

可用性的度量检测方式-性能

阿里百川码力APP监控 来了!

在应用开发时,程序错误、主线程卡顿和资源使用超过系统限制导致的崩溃,是最严重、也是需要首先解决的问题。

通常开发者会借助模拟器、Instrument或者自动化测试发现一部分问题,但是测试往往难以覆盖用户使用场景下的设备、网络等环境。如果借助于社交媒体或者邮件反馈渠道,虽然可以有限地拿到真实的用户反馈,但是用户往往不能清楚的描述出复现问题所需的信息,往复沟通成本极高。所以,在客户端上,码力APM通过以下检测方式来收集应用崩溃信息。

阿里百川码力APP监控 来了!

码力APM在信号捕获方式中,通过sigaction设置信号中断时的回调,这样,就可以在回调中根据程序运行状态生成对应的崩溃日志。此外,对于SIGARBT(abnormal termination),我们还需要通过NSSetUncaughtExceptionHandler来获取未捕获异常的堆栈,来补全崩溃信息。

而后,把崩溃日志上报到码力APM,会依据崩溃日志的堆栈信息,聚合同一类型的崩溃后写入数据存储。同时,告警系统可以依据崩溃次数、崩溃率等规则,即时发出告警。

此外,码力Apm提供了dSYM上报脚本,在Xcode的build phrase中添加脚本,就可以在编译成功后自动上报dSYM文件。通过对dSYM文件的解析,重新聚合后写入数据存储,聚合可以减少高达90%数据库行数;同时,也实现了崩溃日志符号化。不依赖mac环境符号化,更好地利用云计算平台服务更多开发者。

阿里百川码力APP监控 来了!

第二种技术是卡顿检测,卡顿检测的基础是RunLoop,通过RunLoop Observer监听主线程RunLoop状态的变更。在这里,把RunLoop当作在操场上跑圈的运动员,把Before Sources当做每圈的起点,同时另外开启一条线程作为计时员,每5秒判断一次RunLoop是否跑过一圈。如果5秒内RunLoop没有完成一次RunLoop,则视为主线程卡顿。在发现主线程卡顿后,会生成卡顿日志,如果是复现的卡顿,可以选择不重复上报。

此外,针对设备不同的运行时期,如启动阶段、后台阶段、空闲阶段,我们会动态调整阈值,降低检测的开销。

阿里百川码力APP监控 来了!

对于无法通过信号捕获、卡顿检测的崩溃,码力APM引入了应用中止检测,中止检测虽然不能还原崩溃现场,但是可以揭示问题的存在。在应用进入active状态时,码力APM在持久存储上设立一个标志位,表示程序在正常运行。在应用退出active状态或检测到崩溃时,码力APM就清除持久存储上的标志位,表示程序在已知的情况下退出。这样,在下一次应用启动时,如果持久存储上的标志位为真,则说明应用上一次运行在未知情况下退出,这种情况码力APM就计为应用非正常中止上报。

同时,为了过滤因为电量耗尽导致的关机,码力APM还增加了电量检测,在低电量时,清除标志位,避免中止误报。

可用性的度量检测方式-网络

阿里百川码力APP监控 来了!

请求错误、流量开销高、被运营商劫持等网络问题是应用开发时另一类棘手的问题。当然我们也可以借助模拟器、Instrument或者自动化测试发现简单的网络问题,但是测试难以覆盖复杂的用户网络环境,也难以导出网络性能数据进行长期比对监控。如果使用手工埋点的方式记录网络性能,一方面,我们需要应对多种系统网络接口,另一方面,我们需要同步应用网络代码和埋点代码,维护成本将会居高不下。

为了监控应用在真实网络环境中的性能,码力APM中引入了无痕埋点的网络性能监控,在网络检测中引入三种注入技术,帮助开发者长期监控应用的网络性能,优化产品用户体验。

阿里百川码力APP监控 来了!

第一种是Method Swizzling。每一个NSObject类都包含一个isa指针,指向objc_class结构体,而每一个objc_class结构体又包含一个methodLists指针,指向objc_method_list结构体数组,在objc_method_list里又包含一个objc_method结构体成员,且每一个objc_method包含一个method_imp指针,指向方法实现。

因此,只要能修改method_imp的值,我们就能替换原有的实现。在<objc/runtime>中,通过class_getClassMethod和class_getInstanceMethod取得objc_method结构体指针,而后通过method_getImplementation取得方法的原始实现地址originIMP,之后在imp_implementationWithBlock生成新实现imp的参数block里,调用原始实现,就可以原有行为前后加入网络性能埋点行为。最后调用method_setImplementation替换方法实现。这样,任何调用都将使用新的实现。

阿里百川码力APP监控 来了!

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!