目次
概要
MetricKitを導入して、電力とパフォーマンス低下を素早く検知し、Appに起きた問題のトラブルシュートをする方法及び、CPUインストラクション、アニメーションヒッチ、終了(Crash)理由といったAppで追跡することが可能な最新のメトリクスについて。
またハング、クラッシュ、ディスクの書き込みのトラブルシュートの助けとなる、MetricKitで出来る診断について。 前提として、アプリのパフォーマンス(バッテリーなど)が良ければユーザは喜び、全体としてアプリの体験の向上にも繋がります。
MetricKitとは
デバイス上でバッテリー持ちと性能に関するメトリクスを収集するフレームワークアプリを実行するユーザやデバイスに直接アクセス出来ないことが多い、開発サイクル段階におけるデータを提供するために作られた 例えば、TestFlightのような外部ベータテストやApp Storeへのリリース後があります
性能上の不具合に関する傾向やパターンの発見を早期に出来ることを支援する
MetricKitの使い方
3 steps- Link MetricKit: MetricKitフレームワークをプログラムにリンクしてimportする
- Instantiate MXMetricManager: Implement MXMetricManagerSubscriber delegate protocol
- メトリクス用の共有インスタンスの作成: MXMetricManagerSubscriberプロトコルの準拠し、フレームワークからメトリクスを受け取れるようにする
import MetricKit
class MySubscriber: NSObject, MXMetricManagerSubscriber {
var metricManager: MXMetricManager?
override init() {
super.init()
metricManager = MXMetricManager.shared
metricManager?.add(self)
}
override deinit() {
// カスタムクラスへの参照を削除することを推奨
metricManager?.remove(self)
}
func didReceive(_ payload: [MXMetricPayload]) {
for metricPayload in payload {
// Do something with metricPayload.
}
}
}
func didReceive(_ payload: [MXDiagnosticPayload]) {
for diagnosticPayload in payload {
// Consume diagnosticPayload.
}
}
1日のうちでAppのメトリクスを収集し、1日の終わりに収集したデータを24時間分のペイロードとしてまとめられる
MetricKitのペイロードに含まれるデータ

- 起動回数
- コールドlaunch(メモリ内に何もリソースがないゼロの状態から起動)回数
- Resume起動回数
- CPU時間
- 累計CPU時間
- Foreground/Backgroundでの時間
- BackgroundでのAudio, Location実行時間
- メモリ
- Application Hang Histogram
- ハングした時間
- 不具合の解消にはハングした時点より前に実行していた処理や、追加の診断データが必要となる
MetricKit 2.0の機能
アプリケーションの負荷、性能、安定性についてより明快なデータとするためにサブセットの強化が行われた
- CPU命令数
- アプリから実行された1日の累計命令数を収集
- これによりどれぐらい負荷がかかっているのかを数値化して把握することが出来る
- スクロールヒッチ
- スクロールにおけるグラフィカル性能の洞察を支援
- スクロールヒッチを起こして消費した時間を提供
- スクロールヒッチについての詳細はXCTextを使ってアニメーションヒッチを除去するを参照
- アプリケーションからの終了(Crash)回数, 及び理由
- Foreground/Backgroud両方でCrashした際の理由と回数について1日のまとめを受け取れる
- 詳細はアプリが強制終了される理由を参照
MetricKit Diagnostic
- 診断情報は様々なタイプの不具合について対処可能
- ハング
- クラッシュ
- ディスク書き込み例外処理
- CPU例外処理
MetricKitで診断を受け取る方法
MXMetricManagerSubscriberプロトコルを実装することだけで済み、診断ペイロードはメトリクスペイロードと同時に受け取れ、診断ペイロードとメトリクスペイロードは1:1で対応出来るようになっている
MXDiagnostic APIについて
- MXDiagnosticは様々なメタデータを保持する
- App Version
- MXMetaData
- MXCallStackTree
- 新しいデータクラスで不具合が発生した時に後方追跡をデバイス外で使えるようカプセル化している
- MXDiagnosticPayloadはMXDiagnosticオブジェクトを1日の終わりに送信する搬送用クラス

- MXDiagnosticのsub class
- MXHangDiagnostic
- MXCPUExceptionDiagnostic
- MXDiskWriteExceptionDiagnostic
- MXCrashDiagnostic

MXHangDiagnostic
ハングとはアプリケーションからの反応が長期間に渡ってなくなる不具合で、アプリケーションのmain threadがブロックされるかbusy状態になるのが原因
- main threadが無反応になった時間及び後方追跡を提供
MXCPUExceptionDiagnostic
Xcode Organizerでエネルギーログと呼ばれるもの- CPU使用時間
- 高いCPU使用率がサンプリングされた合計時間
- CPUを使用したthreadの後方追跡
MXDiskWriteExceptionDiagnostic
- 例外処理の原因となった書き込みの総合計数
- 過度の書き込みの原因となっているthreadの後方追跡
MXCrashDiagnostic
- 例外の種類, コード
- クラッシュ理由
- VM領域情報in (for bad access crashed)