Upgrade to Pro — share decks privately, control downloads, hide ads and more …

将来の機能拡張を見据えたMetricKitの実装

 将来の機能拡張を見据えたMetricKitの実装

GO TechTalk #28 iOSの潜在能力を引き出せ!リッチプッシュとApple Payの実践活用術 で発表した資料です。

■ YouTube
https://www.youtube.com/live/_DvNB-ZlFTA?feature=shared&t=2089

■ connpass
https://jtx.connpass.com/event/321462/

GO Inc. dev

July 24, 2024
Tweet

More Decks by GO Inc. dev

Other Decks in Programming

Transcript

  1. © GO Inc. 2 自己紹介 GO株式会社 iOSエンジニア / 髙橋秀宗 2022年12月に入社後、『GO』のユーザーアプリの開発を担当

    直近はiOSアプリ開発に必要なBackend APIの開発も担当し、仕 事の幅を広げている 夏の夜寝る前に、エアコンをMAX下げて朝寒いと思ったのは良 い思い出 @h1d3mun3
  2. © GO Inc. • お客様からのお問い合わせで、クラッシュの発生を検知 ◦ ケース1: タクシー乗車地の指定中にクラッシュ ◦ ケース2:

    AI予約中にクラッシュ ◦ ケース3: 領収書の発行中にクラッシュ • 操作手順はそれぞれ異なる • 一定時間操作するとクラッシュする • Crashlytics上は該当時刻のクラッシュは検知できず問題なし -> 調査が難航 5 『GO』アプリでのクラッシュ急増
  3. © GO Inc. 7 • 事象が発生してしまったお客様には暫定対応の手順を共有 ◦ WiFiを切断し機内モードにしてアプリを再起動 ◦ 再起動後1分くらい経過したら、機内モードの解除

    • 効果は不明なものの、いったん該当ライブラリのダウングレードを実施 し様子を見た ◦ ライブラリ提供元にバグ報告と修正依頼も提出 クラッシュへの対応方針
  4. © GO Inc. 9 MetricKitを利用してOOMエラーを検知する • OOMエラーを検知するツールにMetricKitを採用 ◦ システムはデバイス上のアプリ診断やシステムがキャプチャした電 力およびパフォーマンス情報など通知

    ▪ 1日分の情報をMXMetricPayload型で表現 ▪ システムはMXMetricPayload型の配列で通知するため、複数 の日付分を一括通知 ◦ システムは1日に最大1回アプリにメトリックレポートを通知 • データの収集基盤としてはCrashlyticsを使用 ◦ 通常のクラッシュモニタと共存
  5. © GO Inc. 13 システムからの通知を受け取 る責務 任意の数値を取り出してロ グ保存する責務 OOMエラーの数字を取り出す 責務

    Crashlyticsに保存する責務 MetricKitでOOMエラーを検知し、Crashlyticsに保存する仕組み 1:システムから情報を取得
  6. © GO Inc. 14 システムからの通知を受け取 る責務 任意の数値を取り出してロ グ保存する責務 OOMエラーの数字を取り出す 責務

    Crashlyticsに保存する責務 MetricKitでOOMエラーを検知し、Crashlyticsに保存する仕組み 1:システムから情報を取得 2:情報の通知を送信
  7. © GO Inc. 15 システムからの通知を受け取 る責務 任意の数値を取り出してロ グ保存する責務 OOMエラーの数字を取り出す 責務

    Crashlyticsに保存する責務 MetricKitでOOMエラーを検知し、Crashlyticsに保存する仕組み 1:システムから情報を取得 2:情報の通知 3: データの取り出しと保存を実施
  8. © GO Inc. class AppDelegate: UIResponder, UIApplicationDelegate { private let

    metricKitSubscriber = MetricKitSubscriber( childTopicSubscriber: [ CumulativeMemoryResourceLimitExitCountTopicSubscriber(crashlyticsRecorder: CrashlyticsRecorderImpl()) ] ) func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 〜〜〜中略〜〜〜〜 MXMetricManager.shared.add(metricKitSubscriber) 〜〜〜中略〜〜〜〜 } } 17 システムへのMetricKitSubscriberの登録
  9. © GO Inc. class AppDelegate: UIResponder, UIApplicationDelegate { private let

    metricKitSubscriber = MetricKitSubscriber( childTopicSubscriber: [ CumulativeMemoryResourceLimitExitCountTopicSubscriber(crashlyticsRecorder: CrashlyticsRecorderImpl()) ] ) func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 〜〜〜中略〜〜〜〜 MXMetricManager.shared.add(metricKitSubscriber) 〜〜〜中略〜〜〜〜 } } 18 システムへのMetricKitSubscriberの登録
  10. © GO Inc. class AppDelegate: UIResponder, UIApplicationDelegate { private let

    metricKitSubscriber = MetricKitSubscriber( childTopicSubscriber: [ CumulativeMemoryResourceLimitExitCountTopicSubscriber(crashlyticsRecorder: CrashlyticsRecorderImpl()) ] ) func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 〜〜〜中略〜〜〜〜 MXMetricManager.shared.add(metricKitSubscriber) 〜〜〜中略〜〜〜〜 } } 19 システムへのMetricKitSubscriberの登録
  11. © GO Inc. 25 結果 • 該当のクラッシュが本番環境でどれぐらい起きているかを知ることがで きた • OOMへの対策を行った結果、本番環境で問題が軽減しているのかを知

    ることができた → 上記2つを達成したことにより、クラッシュの及ぼす影響と現状を正確に 確認することができた
  12. © GO Inc. • Crashlyticsでクラッシュ情報はすべて取得できると考えていたがそうでは なかった • MetricKitの導入は比較的簡単なので、ぜひ皆様のプロダクトでも採用して ほしい •

    MetricKitではクラッシュ情報だけでなくパフォーマンス情報も取得できる ので、データを活かして快適な『GO』アプリの開発に役立てたい 26 所感
  13. © GO Inc. • 特定ライブラリ起因のクラッシュが頻発していた • Crashlyticsでは捕捉できず、現在市場でどの程度OOMが発生している のかわからなかった • OOMエラーを特定するツールとしてMetricKitを採用し、データの収集

    基盤としてCrashlyticsを使うことにした • GOにMetricKitを導入した • 該当のクラッシュがProduction環境でどれぐらい起きているかを知るこ とができた • OOMへの対策を行った結果、Production環境で問題が軽減しているの かを知ることができた 28 まとめ