一、初识 Vicrab
公司开发的产品是一款几千万级的视频应用,在线上的应用因用户使用的网络环境,用户操作习惯各有差异,以及各种设备的兼容性问题,每次发到线上后总会非常及时(无奈)的收到用户的各种反馈,虽说在公司做过各种测试,也在应用中集成了友盟,Bugly这些异常采集的工具,但这些工具只能对崩溃问题进行排查,但在我们的应用中对应用错误提前预警,运行状态监控还有一些定制化的日志无法收集的问题束手无策,对反馈的问题在排查时无从下手,给我们的开发人员带来很大的挑战,由此集成一个应用运行状态监控,错误提前预警,以及可收集自定义日志的工具势在必然。
知道问题后,然后开始各种google,baidu 搜索,查找能满足当前需求的工具,各种搜索后,找了很多工具,最后找到介绍Vicrab 的 ( https://blog.csdn.net/lifeneedyou/article/details/90052641 )这篇文章,通过文章介绍来看,Vicrab 这个工具跟我们实际的需求比较匹配,即然有了方向那就开始集成测试。
二、集成测试
看了vicrab的官网,对于这个工具的集成比较简单,但对这个工具的稳定性,性能不了解,即然想使用就要做到可控(被线上的各种问题折磨怕了)。我们在后台接口这块加上了对此功能的开关设置,一但出问题可以对关闭此工具的使用。
集成主要有以下几步
1.在Vicrab 官网注册
2.在Vicrab 官网申请项目
3.安卓项目中集成
集成时可以参照官网文档中的集成文档(https://doc.vicrab.com/web/#/2?page_id=3),如果文档懒得看也可以直接下载集成 Demo 把 Demo 里的方法移植到项目中。
在 build.gradle中引入 jar 包
implementation 'com.vicrab:vicrab-all:1.1'
implementation 'com.vicrab:vicrab:1.1'
implementation 'com.vicrab:vicrab-android:1.1'
引入jar包编译通过后,创建一个单例类,引入头文件初始化 Vicrab
//引入头文件
import com.vicrab.Vicrab;
import com.vicrab.android.AndroidVicrabClientFactory;
//初始化方法
try {
Vicrab.init(DSN_URL, new AndroidVicrabClientFactory(mContext));
} catch (NoSuchMethodError e) {
e.printStackTrace();
} catch (IncompatibleClassChangeError error){
error.printStackTrace();
}catch(NoClassDefFoundError error) {
error.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
初始化方法时用到一个 DSN_URL,这个地址在官网创建项目时会自动分配一个地址,把dsn地址拷贝到项目中即可。
在单例类中添加方法
/**
* 采集异常方法
*/
public void collectError(Exception e) {
try {
com.vicrab.context.Context ctx = Vicrab.getContext();
ctx.addTag("mac", "mac 地址");//添加 TAG
Vicrab.capture(e); //上报日志
Vicrab.clearContext();
} catch (Exception e) {
e.printStackTrace();
}
}
此方法中添加的 TAG 可以在项目中搜索此 TAG 的相关信息,可以定义一些终端的标识放在里面,方便出问题时查询用户上报的日志。查询方法如下
在处理一些异常时调用此方法即可:
也可以自定义一些异常上报上去
到此 Vicrab 集成完毕。
三。解决问题的案例
1.终端运行状态监控以及预警
本文开始提到的,终端程序运行状态监控,错误提前预警的功能,可以在官网的警报设置中做如下设置
项目做完此设置后,Vicrab 会根据规则对此项目的所有成员发送邮件,达到对项目的运行状态监控。
2.预埋点上报日志,对线上偶发问题进行错误跟踪。
前几天发现一个问题,发现部分 p2p 厂商 cdn 使用的比例过高,在公司内不能复现,通过 vicrab 在业务处理时,预先埋点
try {
playUrl = TitanSDKCore.getVodUrl(playUrl, Constants.TITAN_OPTION_STR);
ExceptionErrorCollectManager.getInstance().collectError(new InputMismatchException( "Taiwu Exchange P2P address successful"));
} catch (Exception e){
PkLog.d(TAG,e.getMessage());
ExceptionErrorCollectManager.getInstance().collectError(new InputMismatchException( "Taiwu Exchange P2P address error"));
ExceptionErrorCollectManager.getInstance().collectError(e);
}
playUrl = XYLiveSDK.playUrlRewrite(playUrl);
if (!playUrl.contains("127.0.0.1")){
ExceptionErrorCollectManager.getInstance().collectError(new InputMismatchException("Xunlei Exchange P2P address error"));
}else{
ExceptionErrorCollectManager.getInstance().collectError(new InputMismatchException("Xunlei Exchange P2P address successful"));
}
发出版本后,vicrab 自动采集相关数据
通过tag 标签查询某个用户上报的日志跟踪错误原因,解决错误