EmbraceによるモバイルクライアントのObservability

この記事は[カバー株式会社 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/cover) 8日目の記事になります。
カバー株式会社でSREをしているSです。よろしくお願いします。

前回の記事は [@TP113](https://qiita.com/TP113) による[GUnityでゲームシーン実行中のGC Allocをゼロに保つために気をつけていること](https://qiita.com/TP113/items/6985824fee01bffd0526)でした。こちらの記事もぜひご覧ください。

# この記事について

モバイルクライアントのObservabilityを向上させたいと考えている方に向けて、Unityのデモアプリへの[Embrace](https://embrace.io/)の組み込みと、EmbraceのダッシュボードでのSession Reportingの様子を紹介します。

# モバイルクライアントでのObservability

モバイルクライアントでのObservabilityを検討する目的は、バックエンドやインフラでのSREによるプラクティスをクライアントにも広げることで、end-to-endのObservabilityを向上することです。

モバイルクライアントでのObservabilityやSLOについての詳細は下記のガイドに書かれていますので、興味のある方はご確認ください。

https://get.embrace.io/mobile-slos-guide/

国内ではモバイルクライアントでのObservabilityとして下記のような事例があります。

https://speakerdeck.com/dena_tech/unityfalsetamefalsegao-su-katukuraudoneiteibunagou-zao-hua-roginguji-biteremetorishou-ji-ji-pan-dena-techcon-2022

弊社では運用コストを抑えるためにSaaSのソリューションを検討しており、OpenTelemetryベースのEmbraceを試用したのでその内容をまとめます。

# デモアプリへの組み込み

弊社のアプリへの組み込みを想定して、中規模で環境構築が容易なUnityのデモアプリである[Megacity-Metro](https://unity.com/demos/megacity-competitive-action-sample)をAndroid向けにビルドしてEmbraceを試します。

使用した製品のバージョンは以下です。

| 製品 | バージョン | 
| - | - |
| Unity 6 | 6000.0.28f1 |
| embrace-unity-sdk | 2.1.1 |
| Android | 15.0 |

組み込みのステップとしては基本的に下記のドキュメントの通りですので、ドキュメントにない点のみこちらで言及します。

https://embrace.io/docs/unity/integration/integration-steps/

## StartSDKの呼び出し

Unity上でEmbraceのIntegrationを設定したあとに、コード上で `Embrace.Instance.StartSDK();` を呼び出す必要があります。  
Megacity-MetroではMenu Sceneの起動時に呼び出しました。

https://github.com/Unity-Technologies/megacity-metro/blob/3b551738dbc334226bfb9a834c73c5d20c2ac30e/Assets/Scripts/Gameplay/Client/UI/MonoBehaviours/MainMenu/MainMenu.cs

ドキュメントでは `Embrace.Instance.EndAppStartup();` を呼び出すように書かれていますが、Unity SDKでは削除されているため呼び出していません。

https://github.com/embrace-io/embrace-unity-sdk/blob/2.1.0/io.embrace.sdk/Scripts/Embrace.cs#L282-L291

## Assembly Definition References

Megacity-Metroの[MainMenu.cs](https://github.com/Unity-Technologies/megacity-metro/blob/3b551738dbc334226bfb9a834c73c5d20c2ac30e/Assets/Scripts/Gameplay/Client/UI/MonoBehaviours/MainMenu/MainMenu.cs)で `Embrace.Instance.StartSDK();` を呼び出す場合は、下記のAssembly Definition Referencesで `Embrace.SDK` を追加する必要があります。

https://github.com/Unity-Technologies/megacity-metro/blob/3b551738dbc334226bfb9a834c73c5d20c2ac30e/Assets/Scripts/Gameplay/Client/Unity.MegacityMetro.Client.asmdef

## Minimum API Level

Megacity-MetroではAndroidのMinimum API Levelが23に設定されていますが、24以上でないと以下のビルドエラーが生じます。

```
 To use the Embrace SDK when your minSdk is lower than 24 you must use AGP 8.3.0+ and add android.useFullClasspathForDexingTransform=true to gradle.properties.
  Alternatively you can set your minSdk to 24 or higher.
  This avoids a desugaring bug in old AGP versions that will lead to runtime crashes on old devices.
  For the full context for this workaround, please see the following issue: https://issuetracker.google.com/issues/230454566#comment18
```

Edit → Project Settings → Player → Androidタブ → Other Settings → Minimum API Level で変更することができます。

# Session Reporting

実際にのセッション情報をEmbraceのコンソールで見たものが以下になります。

![スクリーンショット 2024-12-05 20.46.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622257/ce61d845-4230-6032-2ae6-494bec939f6a.png)

Sceneの移動やAPIのコール、エラーなどをタイムラインで見ることができます。また、各スパンの詳細はTimeline Detailsで確認することができます。

![スクリーンショット 2024-12-05 20.51.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622257/55edfc94-44af-d848-d836-8634f9f015b6.png)

手動でスパンを挿入することもできます。

https://embrace.io/docs/unity/features/traces/

そのほかにも様々な機能があります。

https://embrace.io/docs/unity/features/

# OpenTelemetryによるビューの統合

EmbraceはOpenTelemetryをベースとして作られており、メトリクスをGrafanaなどに配信することができます。

https://grafana.com/blog/2024/06/11/mobile-app-observability-with-opentelemetry-embrace-and-grafana-cloud/

これによって、モバイルクライアントからバックエンドまで、end-to-endのUXに関するビューを作れるはずです。

# 所感

Embraceを試用して、モバイルクライアントのObservabilityが考えられていない状態よりは改善する実感が得られました。
一方で、組み込み後の初期状態ではSceneの中で発生するイベントがキャプチャーされないため、自前で自動計装を実装するなどの工夫は必要です。

# まとめ

モバイルクライアントのObservabilityを向上するEmbraceについて紹介しました。これからモバイルクライアントのObservabilityを検討される皆さんの参考になれば幸いです。