MetricKitの新機能

https://developer.apple.com/videos/play/wwdc2020/10081/

概要

MetricKitを導入して、電力とパフォーマンス低下を素早く検知し、Appに起きた問題のトラブルシュートをする方法及び、
CPUインストラクション、アニメーションヒッチ、終了(Crash)理由といったAppで追跡することが可能な最新のメトリクスについて。
またハング、クラッシュ、ディスクの書き込みのトラブルシュートの助けとなる、MetricKitで出来る診断について。 前提として、アプリのパフォーマンス(バッテリーなど)が良ければユーザは喜び、全体としてアプリの体験の向上にも繋がります。

MetricKitとは

デバイス上でバッテリー持ちと性能に関するメトリクスを収集するフレームワーク
アプリを実行するユーザやデバイスに直接アクセス出来ないことが多い、開発サイクル段階におけるデータを提供するために作られた 例えば、TestFlightのような外部ベータテストやApp Storeへのリリース後があります
性能上の不具合に関する傾向やパターンの発見を早期に出来ることを支援する

MetricKitの使い方

3 steps
  1. Link MetricKit: MetricKitフレームワークをプログラムにリンクしてimportする
  2. Instantiate MXMetricManager: Implement MXMetricManagerSubscriber delegate protocol
  3. メトリクス用の共有インスタンスの作成: 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日の累計命令数を収集
    • これによりどれぐらい負荷がかかっているのかを数値化して把握することが出来る
  • スクロールヒッチ
  • アプリケーションからの終了(Crash)回数, 及び理由

MetricKit Diagnostic

  • 診断情報は様々なタイプの不具合について対処可能
    • ハング
    • クラッシュ
    • ディスク書き込み例外処理
    • CPU例外処理

MetricKitで診断を受け取る方法

MXMetricManagerSubscriberプロトコルを実装することだけで済み、
診断ペイロードはメトリクスペイロードと同時に受け取れ、診断ペイロードとメトリクスペイロードは1:1で対応出来るようになっている

MXDiagnostic APIについて

  • MXDiagnosticは様々なメタデータを保持する
    • App Version
    • MXMetaData
    • MXCallStackTree
      • 新しいデータクラスで不具合が発生した時に後方追跡をデバイス外で使えるようカプセル化している
  • MXDiagnosticPayloadはMXDiagnosticオブジェクトを1日の終わりに送信する搬送用クラス
MXCallStackTreeをjsonにした例
  • MXDiagnosticのsub class
    • MXHangDiagnostic
    • MXCPUExceptionDiagnostic
    • MXDiskWriteExceptionDiagnostic
    • MXCrashDiagnostic

MXHangDiagnostic

ハングとはアプリケーションからの反応が長期間に渡ってなくなる不具合で、
アプリケーションのmain threadがブロックされるかbusy状態になるのが原因
  • main threadが無反応になった時間及び後方追跡を提供

MXCPUExceptionDiagnostic

Xcode Organizerでエネルギーログと呼ばれるもの
  • CPU使用時間
  • 高いCPU使用率がサンプリングされた合計時間
  • CPUを使用したthreadの後方追跡

MXDiskWriteExceptionDiagnostic

  • 例外処理の原因となった書き込みの総合計数
  • 過度の書き込みの原因となっているthreadの後方追跡
これらは1日あたり1GBという閾値をアプリケーションが超えた場合に生成される

MXCrashDiagnostic

  • 例外の種類, コード
  • クラッシュ理由
  • VM領域情報in (for bad access crashed)
最新情報をチェックしよう!