调整聚类策略
Bugly是TDS(端服务)产品下专注端质量监控的平台。崩溃聚类不准确?如何快速调整聚类结果?Bugly 一分钟教程告诉你答案。
一、Bugly 是如何聚类堆栈的?
Bugly 通过崩溃上报的堆栈特征及异常类型进行聚类,将相同异常类型下相同的特征的堆栈聚类为同一个 issue 。
因此聚类的关键是如何取得关键堆栈。默认情况下,Bugly 优先从栈顶开始,提取三帧业务帧作为特征堆栈。例如如下堆栈:
1 AudioToolbox 0x00000001d0b18f74 std::__1::unique_ptr<AQClientBuffer, AQ::API::BufferDeleter>::reset[abi:v160006](AQClientBuffer*) + 1452
2 AudioToolbox 0x00000001d0bab294 AQ::API::V2Impl::AudioQueueFreeBuffer(OpaqueAudioQueue*, AudioQueueBuffer*) + 528
3 XX 0x0000000108d2e94c CVoicePlayer::releaseAqBuffer()(VoicePlayer.mm:249)
4 XX 0x0000000108d2e1f0 CVoicePlayer::stop()(VoicePlayer.mm:285)
5 XX 0x0000000108d2e174 CVoicePlayer::MyAudioQueuePropertyListenerProc(void*, OpaqueAudioQueue*, unsigned int)(VoicePlayer.mm:47)
6 AudioToolbox 0x00000001d0bc5868 AQ::API::ClientMessageHandler::PropertyChanged(unsigned int) + 308
7 AudioToolbox 0x00000001d0bc5520 AQClientCallbackMessageReader::DispatchCallbacks(void const*, unsigned long) + 288
8 AudioToolbox 0x00000001d0bc5348 AQ::API::Queue::FetchAndDeliverPendingCallbacks() + 436
9 AudioToolbox 0x00000001d0bc5154 (anonymous namespace)::RunLoopSourcePerform(void*) + 52
10 CoreFoundation 0x00000001b2a6f31c ___CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 28
11 CoreFoundation 0x00000001b2a6e598 ___CFRunLoopDoSource0 + 176
12 CoreFoundation 0x00000001b2a6cd4c ___CFRunLoopDoSources0 + 244
13 CoreFoundation 0x00000001b2a6ba88 ___CFRunLoopRun + 828
14 CoreFoundation 0x00000001b2a6b668 _CFRunLoopRunSpecific + 608
15 CoreFoundation 0x00000001b2a6b3cc _CFRunLoopRun + 64
16 Foundation 0x00000001b1a89184 ___NSThread__start__ + 732
17 libsystem_pthread.dylib 0x000000021c4964d4 __pthread_start + 136
会提取出如下特征:
XX CVoicePlayer::releaseAqBuffer()(VoicePlayer.mm:)
XX CVoicePlayer::stop()(VoicePlayer.mm:)
XX CVoicePlayer::MyAudioQueuePropertyListenerProc(void*, OpaqueAudioQueue*, unsigned int)(VoicePlayer.mm:)
若没有足够的应用帧,则会提取对应的系统帧作为特征。
二、发现错误聚类如何调整?
如上所述,影响聚类结果关键因素为特征帧的提取,因此调整聚类的关键便是调整提取到的关键帧。Bugly 提供 issue 聚类配置允许业务对有问题的聚类进行微调。
具体进入路径:设置 --> issue 聚类配置 --> 当前配置 --> 修改配置
对聚类调整的基本思路便是通过上述配置内容来影响特征提取的结果。目前支持两种匹配方式:
- 正则表达式:标准的正则表达式,可以匹配对应特征的帧;
- 包含匹配:关键字匹配,通过查找,命中包含对应字符串的帧;
找到对应的匹配后,可以执行一下两种过滤方式:
- 过滤此帧:过滤匹配后的对应帧;
- 过滤以上/下所有帧:过滤匹配到帧开始的以上/下的所有帧;
为了更为直观,我们举个例子,例如如下堆栈:
在默认算法下,会提取到前面三帧作为特征进行聚类。但因其属于较为底层的共用模块,导致许多不同调用路径下的问题聚类在一起,因此可以通过上述的配置对其进行调整。
我们希望后续特征提取排除包含通用的日志部分逻辑的调用帧,根据上面的内容,可以配置如下规则:
通过过滤addOneLogWithoutActionconst_Event
以上的帧,迫使特征提取避开此处,从而实现对聚类结果的干预。
需要说明的是,由于配置的调整会对聚类结果造成影响,而 issue 列表的稳定对于业务同学至关重要(也是 Bugly 一直努力达到的目标),因此 issue 配置的调整需要 Bugly 管理员才能操作。
三、调整后数据是怎样变化的?
提交修改后,需要在修改记录中审批对应的修改,方可令其生效。
于配置调整一致,此处审批需要非配置提交者以外的 Bugly 管理员方可操作。
需要特别说明的是,审批通过后,新配置的规则仅对后续上报的数据生效,原有 issue 中以上报入库的数据不会受其影响。
四、调整过程中,有哪些需要注意的点?
通过上面的聚类配置调整和审批后,用户可以实现对聚类结果的调整。关于聚类调整还有几点需要用户注意:
- 因应用后的配置规则是对所有的上报数据生效,因此调整时尽量做到最新匹配规则,即尽量只影响期望的调整,不要将匹配规则配置的范围过大,避免造成对其他 issue 的影响;
- 配置应用规则会按照配置中已有的规则依次应用,命中某条规则后即结束匹配,因此可以将期望的规则放到更前面进行匹配;
- 如需要更复杂的规则调整,需要 Bugly 平台同学介入,可以联系 Bugly 小助手寻求帮助。