监控功能发布期间的表现

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.png

此外,您还可以按照“(可选)启用调试日志记录”步骤中的说明启用调试日志记录。另外,您也可以在公开文档中找到相关说明。

3. 运行应用

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

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

ffbd413a6983b205

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

d946cab0df319e50

后台发生的情况

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

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

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

4.设置 Remote Config

现在,您的应用正在运行,接下来您可以设置新的功能标志。

  1. Firebase 控制台的左侧面板中,找到吸引部分,然后点击 Remote Config
  2. 点击创建配置按钮以打开配置表单,并添加 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 控制台中,选择包含您的 Relation Eats 应用的项目。

在左侧面板中,找到发布与监控部分,然后点击性能

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

f57e5450b70034c9.png

您可以在该指标板中跟踪应用的关键指标。默认视图包含应用启动时长跟踪记录的时长,但您可以添加自己最关心的指标。由于您正在跟踪添加的新功能,因此您可以定制信息中心,以显示自定义代码跟踪记录 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

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

与之前类似,点击其中一个空白的选择指标框。在对话框窗口中,选择跟踪记录类型 Custom trace 和跟踪记录名称 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

11. 修正性能问题

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

再次发布 Remote Config 值

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

828dd1951a2ec4a4.png

  1. 点击页面顶部的条件标签页。
  2. 点击季节性映像发布,然后将百分位数重新设为 100%。
  3. 点击 Save Condition

1974fa3bb789f36c

  1. 点击发布更改按钮。

12. 测试修正效果并设置提醒

在本地运行应用

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

b0cc91b6e48fb842.png

查看更改的效果

返回 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. 现在,您已经改进了启动画面的性能,接下来可以设置提醒,以便在跟踪记录超出您设置的阈值时收到通知。打开“性能”信息中心,点击 splash_screen_trace 的溢出菜单(三点状)图标,然后点击提醒设置

4bd0a2a1faa14479

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

2bb93639e2218d1.png

13. 恭喜!

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

所学内容

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

了解详情