👍

モバイルアプリの新バージョンのパフォーマンス劣化に気付くための仕組み

2024/11/11に公開

はじめに

LuupのSREチームに所属している、ぐりもお(@gr1m0h)です。

この記事は、LUUP のTVCM放映に合わせた一足早い「Luup Developers Advent Calendar 2024」の11日目の記事です。

LUUPでは、iOS、Androidのアプリを2週間単位でリリースしています。

つまり、2週間単位で新しいバージョンが利用できるようになるのですが、新しいバージョンが前バージョンよりも著しくパフォーマンスが悪くなっているかを早期に検知する必要があります。

今回は、これを検知するためにDatadogを使ってアラートをPdMと調整しながら作成したので、これについて紹介します。

アラート設定

まず、どのような設定にしているかをお話します。

image1

文にしてみると以下のようになります。

  • 「1週間前の前バージョンの値と新バージョンの値」を「1日1回チェックして150%以上リフトアップしていたらアラート通知を飛ばす」

それぞれ見ていきます。

1週間前の前バージョンの値と新バージョンの値

「前バージョンの値」について、1週間前の値を設定している理由は、アクティブで安定的に動作している期間の値を取得するためです。

また、「前バージョンの値」と「新バージョンの値」のどちらも、1週間前から今現在(評価タイミング)までの平均値(75%ile)を基に設定しています。

前バージョンについては、さらに1週間前(今現在から考えると2週間前)から今現在の1週間前までの値を使って比較していることになります。一方、新バージョンについては、1週間前から今現在までの値を取っていますが、新バージョンは1週間前にはリリースされていないため、実際にはリリースされてから今現在までの値といえます。

何故、平均(75%ile)にしているかというと、モバイルアプリのLatency SLIと同じ理由です。
以下、記載のとおりですが、ユーザー側の都合に左右される状況でパフォーマンスを評価するため、LCPを参考に75%ileを設定しています。
さらに、スパイクの影響やデータ量の問題(評価機関のデータ量が少なすぎるために期待する比較ができない)を受けにくくするために、「平均」を採用し、1週間分の値で評価するようにしています。

ユーザー側の都合に左右される問題については、SLOに関係なくウェブのパフォーマンスを評価する際に考慮すべき問題です。そこで、Googleが提唱するユーザー体験の品質を測定するための指標であるCore Web VitalsのLCPに注目しました。この指標では、良いスコアを「75%ileの2.5秒以下」としています。ここから、ユーザー側の都合に左右される問題を除外するために75%ileの設定が必要と判断しました。

https://zenn.dev/luup_developers/articles/sre-gr1m0h-20240805#2.-sliの設定

1日1回チェックして150%以上リフトアップしていたらアラート通知を飛ばす

常に評価するとノイズが発生する可能性もあり、対応コストの増加につながるため、1日1回の評価にしています。
また、2週間に1回のリリースであるため、2週目は評価しないようにDatadog MonitorのDowntimeを設定し、隔週で評価するようにしています。

Datadogによる実現

以下のDatadog Queryでこの通知を実現しています。

avg(last_1w):p75:trace.${resource_name}{version:${new_version}, env:production} - (calendar_shift(p75:trace.${resource_name}{version:${previous_version}, env:production}, '-1w', 'Asia/Tokyo') * 1.5) > 0

隔週実行するためのDowntimeは以下の設定で行っています。

Details
Monitor Tags: ${monotor_tag}
Scope: *
Recurrence: every 2 weeks on Tuesday, Wednesday, Thursday, Friday beginning at 3:04 AM GMT+9 for 1h

課題と今後

以下の運用上の課題があります。

  • 前バージョン、新バージョンという情報をDatadog側で共通のメトリクスとして設定するのが困難
  • リリースタイミングの変更への追従

前バージョン、新バージョンという情報をDatadog側で共通のメトリクスとして設定するのが困難

現在、どのように回避しているかというと、都度バージョンを変更することで回避しています。
このDatadog MonitorはTerraformで管理しているので、バージョンの更新をPRで行っています。
これを2週間に1回行っており、Toilになっています。

将来的には、iOS、AndroidのRepo側でTagをpushしたタイミングでTerraformを管理しているRepoにバージョン変更のPRを自動で出すようにしたいと思っています。

リリースタイミングの変更への追従

現在、どのように回避しているかというと都度、状況を見て対応しています。
開発都合や祝日などでリリースタイミングがズレると、データ量が少なくなり評価に影響が出ます。これを回避するためにDatadog MonitorのMuteを都度行っています。

将来的には、iOS、Androidのエンジニアに追従を移管したいと思っています。

さいごに

モバイルアプリの新しいバージョンをリリースした際のパフォーマンス劣化に気付くためのDatadog Monitor設定について紹介しました。
なにかの参考になれば幸いです。

最後に、弊社のプロダクト開発やSRE、使用技術に興味を持っていただけた方は、以下のリンクからお気軽にご連絡ください!私のX(Twitter)アカウントでもDMを受け付けています。
副業や転職をお考えの方だけでなく、気軽に話を聞きたいという方も大歓迎です!

https://recruit.luup.sc/

Luup Developers Blog

Discussion