本文介绍了如何在平台上进行 Issue 配置以及平台 Issue 聚类的规则。
平台 Issue 聚类规则
平台通过崩溃上报的堆栈特征及异常类型进行聚类,将相同异常类型下相同的特征的堆栈聚类为同一个 Issue。因此聚类的关键是如何取得关键堆栈。默认情况下,平台优先从栈顶开始,提取三帧业务帧作为特征堆栈。例如如下堆栈:
1 AudioToolbox 0x00000001d0b18f74 std::__1::unique_ptr<AQClientBuffer, AQ::API::BufferDeleter>::reset[abi:v160006](AQClientBuffer*) + 14522 AudioToolbox 0x00000001d0bab294 AQ::API::V2Impl::AudioQueueFreeBuffer(OpaqueAudioQueue*, AudioQueueBuffer*) + 5283 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) + 3087 AudioToolbox 0x00000001d0bc5520 AQClientCallbackMessageReader::DispatchCallbacks(void const*, unsigned long) + 2888 AudioToolbox 0x00000001d0bc5348 AQ::API::Queue::FetchAndDeliverPendingCallbacks() + 4369 AudioToolbox 0x00000001d0bc5154 (anonymous namespace)::RunLoopSourcePerform(void*) + 5210 CoreFoundation 0x00000001b2a6f31c ___CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 2811 CoreFoundation 0x00000001b2a6e598 ___CFRunLoopDoSource0 + 17612 CoreFoundation 0x00000001b2a6cd4c ___CFRunLoopDoSources0 + 24413 CoreFoundation 0x00000001b2a6ba88 ___CFRunLoopRun + 82814 CoreFoundation 0x00000001b2a6b668 _CFRunLoopRunSpecific + 60815 CoreFoundation 0x00000001b2a6b3cc _CFRunLoopRun + 6416 Foundation 0x00000001b1a89184 ___NSThread__start__ + 73217 libsystem_pthread.dylib 0x000000021c4964d4 __pthread_start + 136
会提取出如下特征:
XX CVoicePlayer::releaseAqBuffer()(VoicePlayer.mm:248)XX CVoicePlayer::stop()(VoicePlayer.mm:285)XX CVoicePlayer::MyAudioQueuePropertyListenerProc(void*, OpaqueAudioQueue*, unsigned int)(VoicePlayer.mm:47)
若没有足够的应用帧,则会提取对应的系统帧作为特征。
聚类配置
如上所述,影响聚类结果关键因素为特征帧的提取,因此调整聚类的关键便是调整提取到的关键帧。平台提供 Issue 聚类配置允许业务对有问题的聚类进行微调。您可进入 应用配置 > Issue 配置 > 当前配置 页面,然后单击修改配置。

对聚类调整的基本思路便是通过上述配置内容来影响特征提取的结果。目前支持两种匹配方式:
正则表达式:标准的正则表达式,可以匹配对应特征的帧;
包含匹配:关键字匹配,通过查找,命中包含对应字符串的帧;
找到对应的匹配后,可以执行以下两种过滤方式:
过滤此帧:过滤匹配后的对应帧;
过滤以上/下所有帧:过滤匹配到帧开始的以上/下的所有帧;
为了更为直观,我们举个例子,例如如下堆栈:

在默认算法下,会提取到前面三帧作为特征进行聚类。但因其属于较为底层的共用模块,导致许多不同调用路径下的问题聚类在一起,因此可以通过上述的配置对其进行调整。
我们希望后续特征提取排除包含通用的日志部分逻辑的调用帧,根据上面的内容,可以配置如下规则:

通过过滤 addOneLogWithoutActionconst_Event 以上的帧,迫使特征提取避开此处,从而实现对聚类结果的干预。
说明:
由于配置的调整会对聚类结果造成影响,而 Issue 列表的稳定对于业务同学至关重要,因此 Issue 配置的调整需要平台管理员才能操作。
聚类调整数据变化
提交修改后,需要在修改记录中审批对应的修改,状态变为已生效的情况下,方可令其生效。

和配置调整一致,此处审批需要非配置提交者以外的平台管理员方可操作。
需要特别说明的是,审批通过后,新配置的规则仅对后续上报的数据生效,原有 Issue 中以上报入库的数据不会受其影响。
注意事项
通过上面的聚类配置调整和审批后,用户可以实现对聚类结果的调整。关于聚类调整还有几点需要用户注意:
因应用后的配置规则是对所有的上报数据生效,因此调整时尽量做到最小匹配规则,即尽量只影响期望的调整,不要将匹配规则配置的范围过大,避免造成对其他 Issue 的影响;
配置应用规则会按照配置中已有的规则依次应用,命中某条规则后即结束匹配,因此可以将期望的规则放到更前面进行匹配;
