Slide 1

Slide 1 text

© GO Inc. 2024.07.22 開発本部 ソフトウェア開発統括部 ユーザーシステム開発部 ユーザーシステム1グループ / 髙橋秀宗 GO株式会社 将来の機能拡張を見据えた MetricKitの実装

Slide 2

Slide 2 text

© GO Inc. 2 自己紹介 GO株式会社 iOSエンジニア / 髙橋秀宗 2022年12月に入社後、『GO』のユーザーアプリの開発を担当 直近はiOSアプリ開発に必要なBackend APIの開発も担当し、仕 事の幅を広げている 夏の夜寝る前に、エアコンをMAX下げて朝寒いと思ったのは良 い思い出 @h1d3mun3

Slide 3

Slide 3 text

Index © GO Inc. 1. 導入の背景 2. 『GO』へのMetricKit導入 3. 結果と所感 4. まとめ 3

Slide 4

Slide 4 text

© GO Inc. 導入の背景 01

Slide 5

Slide 5 text

© GO Inc. ● お客様からのお問い合わせで、クラッシュの発生を検知 ○ ケース1: タクシー乗車地の指定中にクラッシュ ○ ケース2: AI予約中にクラッシュ ○ ケース3: 領収書の発行中にクラッシュ ● 操作手順はそれぞれ異なる ● 一定時間操作するとクラッシュする ● Crashlytics上は該当時刻のクラッシュは検知できず問題なし -> 調査が難航 5 『GO』アプリでのクラッシュ急増

Slide 6

Slide 6 text

© GO Inc. 6 GOメンバーの端末でクラッシュが再現 ● GOメンバーの端末でクラッシュが再現 ○ 一定時間放置しているとクラッシュ ○ 調査の結果、特定ライブラリがメモリを使い切ったことによるクラッシュと特定

Slide 7

Slide 7 text

© GO Inc. 7 ● 事象が発生してしまったお客様には暫定対応の手順を共有 ○ WiFiを切断し機内モードにしてアプリを再起動 ○ 再起動後1分くらい経過したら、機内モードの解除 ● 効果は不明なものの、いったん該当ライブラリのダウングレードを実施 し様子を見た ○ ライブラリ提供元にバグ報告と修正依頼も提出 クラッシュへの対応方針

Slide 8

Slide 8 text

© GO Inc. ● 原因は特定できたが、Crashlyticsで該当のクラッシュを捕捉不可 ○ 現在市場でどの程度OOMが発生しているのか不明 ● クラッシュへの対策行った時の効果測定が困難 -> 上記2点を解決できる手段が必要 8 クラッシュを検知する上での課題

Slide 9

Slide 9 text

© GO Inc. 9 MetricKitを利用してOOMエラーを検知する ● OOMエラーを検知するツールにMetricKitを採用 ○ システムはデバイス上のアプリ診断やシステムがキャプチャした電 力およびパフォーマンス情報など通知 ■ 1日分の情報をMXMetricPayload型で表現 ■ システムはMXMetricPayload型の配列で通知するため、複数 の日付分を一括通知 ○ システムは1日に最大1回アプリにメトリックレポートを通知 ● データの収集基盤としてはCrashlyticsを使用 ○ 通常のクラッシュモニタと共存

Slide 10

Slide 10 text

© GO Inc. 『GO』へのMetricKit 導入 02

Slide 11

Slide 11 text

© GO Inc. 11 MetricKitでOOMエラーを検知し、Crashlyticsに保存する仕組み

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

© GO Inc. 1. AppDelegateでMetricKitSubscriberを初期化する 2. AppDelegate.application(_,didFinishLaunchingWithOptions)の可能 な限り早いタイミングでシステムに登録する 16 システムへのMetricKitSubscriberの登録

Slide 17

Slide 17 text

© 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の登録

Slide 18

Slide 18 text

© 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の登録

Slide 19

Slide 19 text

© 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の登録

Slide 20

Slide 20 text

© GO Inc. ● MetricKitから情報を取り出し保存するまでの責務を MetricKitSubscriberChildTopicSubscriberに切り出し 20 この設計のポイント

Slide 21

Slide 21 text

© GO Inc. 21 たとえば OOMエラーとCPUMetricsを検知したい場合 既存の処理に影響を与えず、新機能を最小工数で実装できる OOMエラー情報を Crashlyticsに蓄積する CPU情報を 自社サーバに蓄積する

Slide 22

Slide 22 text

© GO Inc. 結果と所感 03

Slide 23

Slide 23 text

© GO Inc. 23 本番環境でどれぐらいクラッシュが起きているかを知ることができた クラッシュの発生状況を追跡できるようになった ライブラリのダウングレード実行後、OOMによる クラッシュが軽減された

Slide 24

Slide 24 text

© GO Inc. 24 対策の結果、問題が軽減しているのかを知ることができた 1日で10回クラッシュしている

Slide 25

Slide 25 text

© GO Inc. 25 結果 ● 該当のクラッシュが本番環境でどれぐらい起きているかを知ることがで きた ● OOMへの対策を行った結果、本番環境で問題が軽減しているのかを知 ることができた → 上記2つを達成したことにより、クラッシュの及ぼす影響と現状を正確に 確認することができた

Slide 26

Slide 26 text

© GO Inc. ● Crashlyticsでクラッシュ情報はすべて取得できると考えていたがそうでは なかった ● MetricKitの導入は比較的簡単なので、ぜひ皆様のプロダクトでも採用して ほしい ● MetricKitではクラッシュ情報だけでなくパフォーマンス情報も取得できる ので、データを活かして快適な『GO』アプリの開発に役立てたい 26 所感

Slide 27

Slide 27 text

© GO Inc. まとめ 04

Slide 28

Slide 28 text

© GO Inc. ● 特定ライブラリ起因のクラッシュが頻発していた ● Crashlyticsでは捕捉できず、現在市場でどの程度OOMが発生している のかわからなかった ● OOMエラーを特定するツールとしてMetricKitを採用し、データの収集 基盤としてCrashlyticsを使うことにした ● GOにMetricKitを導入した ● 該当のクラッシュがProduction環境でどれぐらい起きているかを知るこ とができた ● OOMへの対策を行った結果、Production環境で問題が軽減しているの かを知ることができた 28 まとめ

Slide 29

Slide 29 text

文章・画像等の内容の無断転載及び複製等の行為はご遠慮ください。 © GO Inc.