SuperAPI AI 工具集

metrickit

测试与质量

查看项目

更新于 10-16 09:12

技能介绍

用途

MetricKit 用于从生产设备收集聚合的性能指标与崩溃诊断数据。框架会投递每日指标负载(CPU、内存、启动时间、卡顿率、动画掉帧、网络用量)以及即时诊断负载(崩溃、卡顿、磁盘写入异常),并附带完整调用栈树用于排查。

主要能力

  • 订阅者设置:注册 MXMetricManagerSubscriber,应尽早注册,最好在 application(_:didFinishLaunchingWithOptions:) 或 App.init 中完成。MetricKit 在首次访问 MXMetricManager.shared 后开始累积报告。
  • 接收指标负载:MXMetricPayload 约每 24 小时到达一次,包含聚合指标;若之前投递被错过,数组可能包含多个负载。可用 payload.jsonRepresentation() 获取原始 JSON。可用性:iOS 13.0+、macOS 10.15+、visionOS 1.0+。
  • 接收诊断负载:MXDiagnosticPayload 提供崩溃、卡顿、CPU 异常、磁盘写入和应用启动诊断。在 iOS 15+ 和 macOS 12+ 上,诊断会立即到达,而非随每日报告打包。可用性:iOS 14.0+、macOS 12.0+、visionOS 1.0+。
  • 关键指标:包括启动时间(MXAppLaunchMetric,含 histogrammedTimeToFirstDraw、histogrammedOptimizedTimeToFirstDraw、histogrammedApplicationResumeTime、histogrammedExtendedLaunch)、运行时间(MXAppRunTimeMetric,含前台、后台、后台音频、后台定位累计时间)、CPU 与内存(cumulativeCPUTime、peakMemoryUsage)、响应性(histogrammedApplicationHangTime)、动画(scrollHitchTimeRatio)、网络与蜂窝(WiFi 与蜂窝的上传下载累计量)、应用退出指标(前台与后台退出数据,可检查正常、异常、看门狗、内存等)。
  • 调用栈树:MXCallStackTree 附加在每个诊断上,可用 jsonRepresentation() 提取帧数据,再用 atos 符号化或上传 dSYM 到分析服务。可用性:iOS 14.0+、macOS 12.0+、visionOS 1.0+。
  • 自定义 signpost 指标:使用 mxSignpost 配合 MetricKit 日志句柄捕获自定义性能区间,这些会出现在每日 MXMetricPayload 的 signpostMetrics 下。示例:let metricLog = MXMetricManager.makeLogHandle(category: "Networking")。
  • 导出与上传负载:两种负载都提供 jsonRepresentation() 用于序列化。处理前应始终将原始 JSON 持久化到磁盘,因为系统只投递一次。启动时可用 pastPayloads 和 pastDiagnosticPayloads 恢复错过的投递。
  • 扩展启动测量:将首次绘制后的设置工作纳入启动指标。使用 MXLaunchTaskID 创建任务 ID,调用 extendLaunchMeasurement(forTaskID:) 与 finishExtendedLaunchMeasurement(forTaskID:)。扩展启动时间会出现在 MXAppLaunchMetric 的 histogrammedExtendedLaunch 下。
  • Xcode Organizer 集成:Xcode Organizer 显示已选择加入用户的聚合 MetricKit 数据,可用于趋势分析,与路由到自有后端的设备端收集并行使用。

使用方式

注册订阅者:创建继承 NSObject 并遵循 MXMetricManagerSubscriber 的类,在 subscribe() 中调用 MXMetricManager.shared.add(self),在 unsubscribe() 中调用 remove(self)。在 UIKit 中于 application(_:didFinishLaunchingWithOptions:) 调用订阅;在 SwiftUI 中于 App.init 调用。

实现两个回调:didReceive(_ payloads: [MXMetricPayload]) 处理每日指标,didReceive(_ payloads: [MXDiagnosticPayload]) 处理诊断。诊断回调中可分别检查 crashDiagnostics、hangDiagnostics、diskWriteExceptionDiagnostics、cpuExceptionDiagnostics、appLaunchDiagnostics。

处理负载时,先持久化原始 JSON,再异步处理,避免阻塞回调线程。

适用场景

  • 从生产设备收集性能与稳定性数据,用于监控与回归分析。
  • 排查崩溃、卡顿、磁盘写入异常、CPU 异常和启动缓慢问题。
  • 通过自定义 signpost 指标跟踪关键代码路径的性能。
  • 结合 Xcode Organizer 进行趋势分析。

限制与注意事项

  • 订阅过晚可能完全错过待投递负载,应在启动早期订阅。
  • 只处理 MXMetricPayload 会错过崩溃、卡顿和磁盘写入诊断等最有价值的数据。
  • 系统只投递一次负载,处理前不持久化会导致数据永久丢失。
  • 回调运行在任意线程,同步执行重活或同步网络请求会延迟后续负载投递。
  • 开发环境中不要期望立即获得数据,MetricKit 按 24 小时窗口聚合,负载不会在埋点后立即到达;开发迭代可使用 Xcode Organizer 或模拟负载。
  • 调用栈树需要配合 dSYM 符号化。
  • 自定义 signpost 指标应限制在关键代码路径。
  • 启动时应检查 pastPayloads 和 pastDiagnosticPayloads 以恢复错过的投递。
  • 扩展启动任务需同时调用 extendLaunchMeasurement 和 finishExtendedLaunchMeasurement。
  • 分析后端需接受并存储 MetricKit JSON 格式。

审查清单

  • 在 application(_:didFinishLaunchingWithOptions:) 或 App.init 中调用 MXMetricManager.shared.add(subscriber)。
  • 订阅者遵循 MXMetricManagerSubscriber 并继承 NSObject。
  • 同时实现 didReceive(: [MXMetricPayload]) 和 didReceive(: [MXDiagnosticPayload])。
  • 处理前将原始 jsonRepresentation() 持久化到磁盘。
  • 重处理异步派发,脱离回调线程。
  • 上传 MXCallStackTree JSON 并附带 dSYM 以符号化。
  • 自定义 signpost 指标限制在关键代码路径。
  • 启动时检查 pastPayloads 和 pastDiagnosticPayloads 以恢复错过的投递。
  • 扩展启动任务同时调用 extendLaunchMeasurement 和 finishExtendedLaunchMeasurement。
  • 分析后端接受并存储 MetricKit JSON 格式。
  • 结合 Xcode Organizer 审查回归趋势与设备端数据。