监控功能发布期间的表现

1. 概览

在此 Codelab 中,您将学习如何在功能发布期间监控应用的性能。我们的示例应用将具有基本功能,并且已设置为根据 Firebase Remote Config 标志显示不同的背景图片。我们将介绍如何插桩跟踪以监控应用的性能、向应用发布配置变更、监控影响,以及如何提升性能。

学习内容

  • 如何将 Firebase Performance Monitoring 添加到移动应用以获取开箱即用的指标(例如应用启动时间和帧缓慢或卡顿)
  • 如何添加自定义轨迹以了解用户体验历程的关键代码路径
  • 如何使用 Performance Monitoring 信息中心了解您的指标并跟踪重要更改(例如功能发布)
  • 如何设置效果提醒来监控关键指标
  • 如何发布 Firebase Remote Config 更改

前提条件

  • Android Studio 4.0 或更高版本
  • 搭载 API 级别 16 或更高级别的 Android 模拟器。
  • Java 8 或更高版本
  • Firebase Remote Config 有基本的了解

2. 设置示例项目

下载代码

运行以下命令以克隆此 Codelab 的示例代码。这将在您的机器上创建一个名为 codelab-perf-rc-android 的文件夹:

$ git clone https://github.com/FirebaseExtended/codelab-feature-rollout-performance.git

如果您的机器上没有 Git,您也可以直接从 GitHub 下载代码。

firebase-perf-rc-android-start 文件夹下的项目导入 Android Studio。您可能会看到一些运行时异常,或者看到有关缺少 google-services.json 文件的警告。我们将在下一部分中更正此问题。

在此 Codelab 中,您将使用 Firebase Assistant 插件在 Firebase 项目中注册 Android 应用,并将必要的 Firebase 配置文件、插件和依赖项添加到您的 Android 项目中 - 这一切都可以在 Android Studio 中完成

将您的应用与 Firebase 相关联

  1. 依次前往 Android Studio/Help > Check for updates,确保您使用的是最新版 Android Studio 和 Firebase Assistant。
  2. 依次选择 Tools > Firebase 以打开 Assistant 窗格。

c0e42ef063d21eab

  1. 选择要添加到应用的 Performance Monitoring,然后点击 Performance Monitoring 使用入门
  2. 点击 Connect to Firebase,将您的 Android 项目与 Firebase 关联(此操作会在浏览器中打开 Firebase 控制台)
  3. 在 Firebase 控制台中,点击添加项目,然后输入 Firebase 项目名称(如果您已经有 Firebase 项目,可以改为选择现有的项目)。点击继续并接受条款,以创建 Firebase 项目和新的 Firebase 应用。

接下来,您应该会看到一个对话框,用于将新的 Firebase 应用关联到您的 Android Studio 项目。

51a549ebde2fe57a

  1. 点击连接
  2. 打开 Android Studio。在 Assistant 窗格中,您会看到一条确认您的应用已关联到 Firebase 的消息。

40c24c4a56a45990

将 Performance Monitoring 添加到您的应用

在 Android Studio 的 Assistant 窗格中,点击 Add Performance Monitoring to your app(将 Performance Monitoring 添加到您的应用)。

您应该会看到一个用于接受更改的对话框,之后 Android Studio 应会同步您的应用,以确保已添加所有必要的依赖项。

3046f3e1f5fea06f.png

最后,您应该会在 Android Studio 的 Assistant 窗格中看到一条成功消息,表示所有依赖项均已正确设置。

62e79fd18780e320

此外,还需要按照“(可选)启用调试日志记录”步骤中的说明启用调试日志记录公开文档中也提供了相同的说明。

3. 运行应用

现在,您应该会在应用的模块(应用级)目录中看到 google-services.json 文件,并且您的应用现在应该可以编译了。在 Android Studio 中,依次点击 Run > Run ‘app',以在 Android 模拟器上构建和运行应用。

应用运行时,您应该会先看到如下所示的启动画面:

ffbd413a6983b205.png

然后,几秒钟后,系统会显示包含默认图片的主页:

d946cab0df319e50.png

后台发生了什么?

启动画面在 SplashScreenActivity 中实现,并执行以下操作:

  1. onCreate() 中,我们会初始化 Firebase Remote Config 设置,并提取您将在此 Codelab 后面的 Remote Config 信息中心内设置的配置值。
  2. executeTasksBasedOnRC() 中,我们会读取 seasonal_image_url 标志的配置值。如果配置值提供了网址,我们会同步下载图片。
  3. 下载完成后,应用会转到 MainActivity,并调用 finish() 以结束 SplashScreenActivity

MainActivity 中,如果 seasonal_image_url 是通过 Remote Config 定义的,则系统会启用此功能,并将下载的图片显示为主页面的背景。否则,系统会显示默认图片(如上所示)。

4. 设置 Remote Config

现在,您的应用已在运行,您可以设置新功能标志了。

  1. Firebase 控制台的左侧面板中,找到互动部分,然后点击 Remote Config
  2. 点击 Create configuration 按钮以打开配置表单,然后将 seasonal_image_url 添加为参数键。
  3. 点击添加说明,然后输入说明:Shows a seasonal image (replaces default) in the main page when the restaurant list is empty.
  4. 点击新增 ->条件值 ->创建新条件
  5. 对于条件名称,请输入 Seasonal image rollout
  6. 对于 Applies if... 部分,请选择 User in random percentile <= 0%(在准备在后续步骤中推出之前,最好让该功能保持停用状态。)
  7. 点击创建条件。您稍后将根据此条件向用户发布新功能。

7a07526eb9e81623.png

  1. 打开创建您的首个参数表单,然后找到季节性图片投放的值字段。输入用于下载季节性图片的网址:https://images.unsplash.com/photo-1552691021-7043334e0b51
  2. 将默认值保留为空字符串。这意味着,系统将显示代码库中的默认图片,而不是从网址下载的图片。
  3. 点击保存

99e6cd2ebcdced.png

您可以看到,新配置是作为草稿创建的。

  1. 点击发布更改,然后在顶部确认更改以更新您的应用。

39cd3e96d370c7ce

5. 为数据加载时间添加监控功能

您的应用会在显示 MainActivity 之前预加载一些数据,并显示启动画面以隐藏此过程。您不希望用户在此屏幕上等待太长时间,因此通常有必要监控启动画面的显示时长。

Firebase Performance Monitoring 恰好可以满足您的需要。您可以对自定义代码跟踪记录进行插桩,以监控应用中特定代码的性能,例如数据的加载时间和新功能的处理时间。

如需跟踪启动画面的显示时长,您需要向 SplashScreenActivity 添加自定义代码轨迹,即实现启动画面的 Activity

  1. 初始化、创建并启动名为 splash_screen_trace 的自定义代码跟踪记录:

SplashScreenActivity.java

// ...
import com.google.firebase.perf.FirebasePerformance;
import com.google.firebase.perf.metrics.Trace;
// ...

public class SplashScreenActivity extends AppCompatActivity {

    private static final String TAG = "SplashScreenActivity";
    private static final String SEASONAL_IMAGE_URL_RC_FLAG = "seasonal_image_url";

    // TODO: Initialize splash_screen_trace
    private final Trace splashScreenTrace = FirebasePerformance.startTrace("splash_screen_trace");
    
    // ...
}
  1. SplashScreenActivityonDestroy() 方法中结束跟踪记录:

SplashScreenActivity.java

@Override
protected void onDestroy() {
    super.onDestroy();

    // TODO: Stop the splash_screen_trace here
    splashScreenTrace.stop();
}

由于新功能会下载并处理图片,因此您将添加第二个自定义代码轨迹,用于跟踪该功能为 SplashScreenActivity 增加的额外时间。

  1. 初始化、创建并启动名为 splash_seasonal_image_processing 的自定义代码跟踪记录:

SplashScreenActivity.java

private void executeTasksBasedOnRC(FirebaseRemoteConfig rcConfig) {
    String seasonalImageUrl = rcConfig.getString(SEASONAL_IMAGE_URL_RC_FLAG);
    Log.d(TAG, SEASONAL_IMAGE_URL_RC_FLAG + ": " + seasonalImageUrl);

    if (!seasonalImageUrl.isEmpty()) {
        // TODO: Start the splash_seasonal_image_processing here
        final Trace seasonalImageProcessingTrace = FirebasePerformance
            .startTrace("splash_seasonal_image_processing");

        // ...
    }
}
  1. RequestListeneronLoadFailed()onResourceReady() 方法中结束跟踪记录:

SplashScreenActivity.java

Glide.with(SplashScreenActivity.this.getApplicationContext())
    .asBitmap()
    .load(seasonalImageUrl)
    .signature(new ObjectKey(Utils.getCacheUUID()))
    .listener(new RequestListener<Bitmap>() {
        @Override
        public boolean onLoadFailed(
            @Nullable GlideException e,
            Object model, Target<Bitmap> target,
            boolean isFirstResource) {

            // TODO: Stop the splash_seasonal_image_processing here
            seasonalImageProcessingTrace.stop();

            launchMainActivity();
            return true;
        }

        @Override
        public boolean onResourceReady(Bitmap resource, Object model,
            Target<Bitmap> target, DataSource dataSource,
            boolean isFirstResource) {

            // TODO: Stop the splash_seasonal_image_processing here
            seasonalImageProcessingTrace.stop();

            launchMainActivity();
            return true;
        }
     })
     .preload();

现在,您已添加了自定义代码跟踪记录来跟踪启动画面时长(splash_screen_trace) 和新功能 (splash_seasonal_image_processing) 的处理时间),请再次在 Android Studio 中运行应用。您应该会看到一条包含 Logging trace metric: splash_screen_trace 的日志记录消息,后跟跟踪记录的时长。由于您尚未启用新功能,因此不会看到 splash_seasonal_image_processing 的日志消息。

6. 向轨迹添加自定义属性

对于自定义代码跟踪记录,Performance Monitoring 会自动记录默认属性(应用版本、国家/地区、设备等常见元数据),使您可以在 Firebase 控制台中过滤跟踪记录的数据。您还可以添加和监控自定义属性

您刚刚在应用中添加了两个自定义代码跟踪记录,用于监控启动画面时长和新功能的处理时间。可能会影响这些时长的因素包括显示的图片是默认图片还是必须从网址下载的图片。谁知道呢,您最终可能会使用不同的网址来下载图片。

因此,我们要将表示季节性图片网址的自定义属性添加到这些自定义代码跟踪记录中。这样,您稍后便可以按这些值过滤时长数据。

  1. executeTasksBasedOnRC 方法的开头为 splash_screen_trace 添加自定义属性 (seasonal_image_url_attribute):

SplashScreenActivity.java

private void executeTasksBasedOnRC(FirebaseRemoteConfig rcConfig) {
    String seasonalImageUrl = rcConfig.getString(SEASONAL_IMAGE_URL_RC_FLAG);
    Log.d(TAG, SEASONAL_IMAGE_URL_RC_FLAG + ": " + seasonalImageUrl);

    // TODO: Add a custom attribute "seasonal_image_url_attribute" to splash_screen_trace
    if (seasonalImageUrl.isEmpty()) {
        splashScreenTrace.putAttribute("seasonal_image_url_attribute", "unset");
    } else {
        splashScreenTrace.putAttribute("seasonal_image_url_attribute", seasonalImageUrl);
    }

    // ...
}
  1. 在调用 startTrace("splash_seasonal_image_processing") 之后立即为 splash_seasonal_image_processing 添加相同的自定义属性:

SplashScreenActivity.java

if (!seasonalImageUrl.isEmpty()) {
    // TODO: Start the splash_seasonal_image_processing here
    final Trace seasonalImageProcessingTrace = FirebasePerformance
        .startTrace("splash_seasonal_image_processing");

    // TODO: Add a custom attribute "seasonal_image_url_attribute" to splash_seasonal_image_processing
    seasonalImageProcessingTrace
        .putAttribute("seasonal_image_url_attribute", seasonalImageUrl);

    // ...
}

现在,您已经为两个自定义跟踪记录(splash_screen_tracesplash_seasonal_image_processing)添加了自定义属性 (seasonal_image_url_attribute),请再次在 Android Studio 中运行应用。您应该会看到一条包含 Setting attribute 'seasonal_image_url_attribute' to 'unset' on trace 'splash_screen_trace'. 的日志记录消息。您尚未启用 Remote Config 参数 seasonalImageUrl,因此该属性值为 unset

Performance Monitoring SDK 会收集轨迹数据并将其发送到 Firebase。您可以在 Firebase 控制台的“性能”信息中心查看这些数据,我们将在此 Codelab 的下一步中对此进行详细介绍。

7. 配置 Performance Monitoring 信息中心

配置信息中心以监控您的功能

Firebase 控制台中,选择包含您的 Friendly Eats 应用的项目。

在左侧面板中,找到发布和监控部分,然后点击效果

您应该会看到效果信息中心,其中显示了指标板中的首个数据点!Performance Monitoring SDK 会从您的应用收集性能数据,并在收集后几分钟内显示这些数据。

f57e5450b70034c9

您可以在该指标板中跟踪应用的关键指标。默认视图包含应用启动时间跟踪记录的时长,但您也可以添加自己最关注的指标。由于您要跟踪添加的新功能,因此可以自定义信息中心,以显示自定义代码轨迹 splash_screen_trace 的持续时间。

  1. 点击其中一个空白的选择指标框。
  2. 在对话框窗口中,选择自定义跟踪记录的跟踪记录类型,选择跟踪记录名称 splash_screen_trace

1fb81f4dba3220e0.png

  1. 点击选择指标,您应该会看到 splash_screen_trace 的时长已添加至信息中心!

您可以按照相同的步骤添加您关注的其他指标,以便快速了解这些指标的效果随时间的推移(甚至在不同版本中)而发生的变化。

1d465c021e58da3b

指标板是一款强大的工具,可用于跟踪用户体验的关键指标的效果。对于此 Codelab,您在很短的时间范围内仅获得了一小组数据,因此您将使用其他信息中心视图来帮助了解功能发布的效果。

8. 发布您的功能

现在,您已设置好监控功能,可以发布 Firebase Remote Config 更改(即您之前设置的 seasonal_image_url))。

如需发布更改,您需要返回 Firebase 控制台中的 Remote Config 页面,提高定位条件的用户百分比。通常,您会向一小部分用户推出新功能,并仅在您确信新功能没有问题的情况下增加新功能。不过,在此 Codelab 中,您是该应用的唯一用户,因此您可以将百分位更改为 100%。

  1. 点击页面顶部的条件标签页。
  2. 点击您之前添加的 Seasonal image rollout 条件。
  3. 将百分位数更改为 100%。
  4. 点击 Save Condition
  5. 点击发布更改,然后确认更改。

70f993502b27e7a0.png

返回 Android Studio,在模拟器中重启应用以查看新功能。在启动画面之后,您应该会看到新的空白状态主屏幕!

b0cc91b6e48fb842.png

9. 查看效果变化

现在,我们来使用 Firebase 控制台中的性能信息中心查看启动画面加载性能。在此 Codelab 的这一步中,您将使用信息中心的不同部分来查看性能数据。

  1. 在“信息中心”主标签页中,向下滚动到“轨迹”表,然后点击“自定义轨迹”标签页。在此表中,您将看到之前添加的自定义代码跟踪记录以及一些开箱即用的跟踪记录
  2. 现在,您已经启用了这项新功能,请查找自定义代码跟踪记录 splash_seasonal_image_processing,该跟踪记录衡量的是下载和处理图片所花费的时间。从轨迹的时长值可以看出,此下载和处理过程需要花费大量时间。

439adc3ec71805b7.png

  1. 由于您有splash_seasonal_image_processing的数据,您可以在信息中心标签页顶部的指标面板中添加此跟踪记录的时长。

与之前一样,点击其中一个空白的选择指标框。在对话框窗口中,选择跟踪记录类型自定义跟踪记录和跟踪记录名称 splash_seasonal_image_processing。最后,点击选择指标将此指标添加到指标板。

7fb64d2340410576.png

  1. 如需进一步确认这些差异,您可以仔细查看“splash_screen_trace”的数据。点击指标面板中的 splash_screen_trace 卡片,然后点击查看指标详情

b1c275c30679062a

  1. 在详情页面左下角,您会看到一个属性列表,其中包括您之前创建的自定义属性。点击自定义属性 seasonal_image_url_attribute,即可在右侧查看每个季节性图片网址的启动画面时长:

8fa1a69019bb045e

  1. 您的启动画面时长值可能会与上方屏幕截图中的时长值略有不同,但与使用默认图片(用“未设置”表示)相比,通过网址下载图片时,您应该设置更长的时长

在此 Codelab 中,这个持续时间较长的原因可能很简单,但在真实应用中,可能并不那么明显。收集的时长数据将来自在各种网络连接条件下运行应用的不同设备,这些条件可能比您的预期更糟糕。我们来看看如果这是实际情况,您会如何调查此问题。

  1. 点击页面顶部的效果,返回到信息中心主标签页:640b696b79d90103.png
  2. 在页面底部的跟踪记录表中,点击网络请求标签页。在此表格中,您会看到来自您的应用的所有网络请求汇总到网址格式中,包括 images.unsplash.com/** 网址格式。如果将此响应时间的值与图片下载和处理所需的总时间(即 splash_seasonal_image_processing 跟踪记录的时长)进行比较,您会发现图片消耗了大部分时间。

6f92ce0f23494507.png

效果数据

使用 Firebase Performance Monitoring 时,您发现该新功能对最终用户产生了以下影响:

  1. SplashScreenActivity 上花费的时间增加了。
  2. splash_seasonal_image_processing的时长非常长。
  3. 延迟是由于图片下载响应时间和图片所需的相应处理时间所致。

在下一步中,您将回滚该功能并确定改进该功能的实现方式,从而降低对效果的影响。

10. 回滚功能

增加用户的在启动画面期间的等待时间不理想。Remote Config 的一项关键优势是,您可以暂停和撤消发布,而无需向用户发布其他版本。这样,您就可以快速响应问题(例如您在上一步中发现的性能问题),并最大限度地减少不满意的用户数量。

为了快速缓解问题,您将发布百分比重置为 0,以便所有用户都再次看到默认图片:

  1. 返回 Firebase 控制台中的 Remote Config 页面
  2. 点击页面顶部的条件
  3. 点击您之前添加的 Seasonal image rollout 条件。
  4. 将百分位数更改为 0%。
  5. 点击 Save Condition
  6. 点击发布更改并确认更改。

18c4f1cbac955a04.png

在 Android Studio 中重启应用,您应该会看到原始的空状态主屏幕:

d946cab0df319e50.png

11. 解决性能问题

您在本 Codelab 的早些部分发现,下载启动画面图片会导致应用运行缓慢。仔细查看下载的图片后,您发现自己使用的是图片的原始分辨率,该分辨率超过 2MB!要快速解决性能问题,您可以将画质降低到更合适的分辨率,以缩短图片的下载时间。

再次发布 Remote Config 值

  1. 返回 Firebase 控制台中的 Remote Config 页面
  2. 点击 seasonal_image_url 参数的修改图标。
  3. 季节性映像发布的值更新为 https://images.unsplash.com/photo-1552691021-7043334e0b51?w=640,然后点击保存

828dd1951a2ec4a4

  1. 点击页面顶部的条件标签页。
  2. 点击季节性图片发布,然后将百分比设回 100%。
  3. 点击 Save Condition

1974fa3bb789f36c

  1. 点击发布更改按钮。

12. 测试修复程序并设置提醒

在本地运行应用

将新配置值设置为使用其他下载图片网址,再次运行应用。这次,您应该会发现在启动画面上花费的时间比之前短。

b0cc91b6e48fb842

查看更改的效果

返回 Firebase 控制台中的性能信息中心,查看指标的显示情况。

  1. 这次,您将使用跟踪记录表导航到详情页面。在跟踪记录表的自定义跟踪记录标签页中,点击自定义跟踪记录 splash_seasonal_image_processing,再次详细查看其时长指标。

2d7aaca03112c062.png

  1. 点击自定义属性 seasonal_image_url_attribute 可再次查看自定义属性的细分。如果您将鼠标悬停在这些网址上,就会看到与缩小后图片的新网址(即 https://images.unsplash.com/photo-1552691021-7043334e0b51?w=640 末尾的 ?w=640)相匹配的值。与上一个图片相关联的持续时间值比上一个图片的值短得多,更适合用户!

10e30c037a4237a2

  1. 现在,您已改进了启动画面的性能,您可以设置提醒,以便在跟踪记录超出您设置的阈值时收到通知。打开“性能”信息中心,点击 capture_screen_trace 的溢出菜单(三点状)图标,然后点击提醒设置

4bd0a2a1faa14479

  1. 点击切换开关以启用时长提醒。将阈值设置为略高于您看到的值,以便在 splash_screen_trace 超出阈值时,您会收到电子邮件。
  1. 点击保存以创建提醒。向下滚动到跟踪记录表,然后点击自定义跟踪记录标签页以查看提醒是否已启用!

2bb93639e2218d1.png

13. 恭喜!

恭喜!您已启用了 Firebase Performance Monitoring SDK 并收集了跟踪记录,以衡量新功能的性能!您监控了新功能发布的关键效果指标,并在发现效果问题时快速做出响应。通过使用 Remote Config 更改配置并实时监控性能问题,这一切都是可能的。

所学内容

  • 将 Firebase Performance Monitoring SDK 添加到您的应用
  • 向代码添加自定义代码跟踪记录以衡量特定功能
  • 设置 Remote Config 参数和条件值以控制/发布新功能
  • 了解如何使用 Performance Monitoring 信息中心在发布期间发现问题
  • 设置性能提醒,以便在应用性能超出您设置的阈值时通知您

了解详情