监控功能发布期间的表现

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

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

3046f3e1f5fea06f

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

62e79fd18780e320

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

3. 运行应用

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

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

ffbd413a6983b205

几秒钟后,带有默认图片的主页面将显示:

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

  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

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

b0cc91b6e48fb842

9. 查看效果变化

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

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

439adc3ec71805b7

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

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

7fb64d2340410576

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

b1c275c30679062a

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

8fa1a69019bb045e

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

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

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

6f92ce0f23494507

性能发现结果

使用 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

在 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

  1. 点击自定义属性 seasonal_image_url_attribute 可再次查看自定义属性的细分。如果您将鼠标悬停在这些网址上,就会看到与缩小后图片的新网址(即 https://images.unsplash.com/photo-1552691021-7043334e0b51?w=640 末尾的 ?w=640)相匹配的值。与这张图片相关联的时长值明显短于前一张图片的值,因此对您的用户来说更容易接受!

10e30c037a4237a2

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

4bd0a2a1faa14479

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

2bb93639e2218d1

13. 恭喜!

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

所学内容

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

了解详情