功能推出的性能监控

1. 概述

在此 Codelab 中,您将了解如何在功能推出期间监控应用的性能。我们的示例应用程序将具有基本功能,并设置为根据 Firebase 远程配置标志显示不同的背景图像。我们将通过检测跟踪来监控应用程序的性能,对应用程序进行配置更改,监控效果并了解我们如何提高性能。

你会学到什么

  • 如何将 Firebase 性能监控添加到您的移动应用程序以获取现成的指标(例如应用程序启动时间和缓慢或冻结的帧)
  • 如何添加自定义跟踪以了解用户旅程的关键代码路径
  • 如何使用性能监控仪表板来监控您的指标并跟踪重要更改,例如功能的推出
  • 如何推出 Firebase 远程配置更改

先决条件

  • Android Studio 4.0 或更高版本
  • 具有 API 级别 16 或更高级别的 Android 模拟器。
  • Java 8 或更高版本
  • 一个基本的了解火力地堡远程配置

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文件。我们将在下一节中更正此问题。

在本程式码实验室中,我们将使用火力地堡助手插件与火力地堡项目注册我们的Android应用程序,并添加必要的火力地堡配置文件,插件和依赖关系到我们的Android项目-在Android Studio中的一切

将您的应用连接到 Firebase

  1. 您可以进入Android工作室/帮助>检查更新,以确保您使用的Android Studio和火力地堡助理的最新版本。
  2. 选择Tools>火力地堡打开助理窗格。

2fe37593d5b76c7.png

  1. 选择性能监控添加到您的应用程序,然后单击开始使用性能监控开始
  2. 单击连接到火力地堡连接你与火力地堡的Android项目(这将打开浏览器中的火力地堡控制台)。
  3. 在火力地堡控制台,单击添加项目,然后输入一个火力地堡项目名称(如果你已经有了一个火力地堡的项目,您可以选择已有的项目,而不是)。点击继续并接受条款创建火力地堡项目和一个新的火力地堡应用。
  1. 下一步,应当看到一个对话框,以新的火力地堡应用程序连接到你的Android Studio项目。

38e2c00493a8d4d4.png

  1. 早在Android Studio中,在助手窗格中,您应该看到确认您的应用程序连接到火力地堡。

dda8bdd9488167a0.png

向您的应用程序添加性能监控

在Android Studio中的助理窗格中,单击添加性能监控应用程式

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

9b58145acc4be030.png

最后,你应该看到在Android Studio中的助理窗格中所有的依赖性都正确设置成功的消息。

378356b65be49df8.png

作为一个附加的步骤中,通过以下在步骤中的说明“(可选)启用调试日志记录”启用调试日志。同样的说明也可用公共文件

3. 运行应用

您现在应该看到google-services.json在您的应用程序的模块(应用程序级)目录下的文件,你的应用程序现在应该编译。在Android Studio中,单击运行>运行“应用”构建和运行在Android模拟器的应用程序。

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

843a786fe3f42d0f.png

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

e4b8dac61e405c61.png

引擎盖下发生了什么?

启动画面是在实施SplashScreenActivity并执行以下操作:

  1. onCreate()我们初始化火力地堡远程配置设置和获取配置值,你会在远程配置仪表板后面的本程式码实验室设置。
  2. executeTasksBasedOnRC()我们读到的配置值seasonal_image_url标志。如果 config 值提供了 URL,我们将同步下载图像。
  3. 一旦下载完成后,应用定位到MainActivity和呼叫finish()来结束SplashScreenActivity

MainActivity ,如果seasonal_image_url通过远程配置定义,该功能将被启用,并且下载的图像将显示为主要页面的背景。否则,将显示默认图像(如上所示)。

4. 设置远程配置

现在我们的应用程序正在运行,我们可以设置新的功能标志。在左侧面板火力地堡控制台,找到卡钳段,然后单击远程配置

添加参数卡:

  1. 添加seasonal_image_url作为参数的关键。
  2. :点击添加说明,然后输入这个描述Shows a seasonal image (replaces default) in the main page when the restaurant list is empty.
  3. 点击添加值的条件- >定义一个新的条件
  4. 对于条件名称,进入Seasonal image rollout
  5. 对于Applies if...部分,选择User in random percentile <= 0%(我们希望在我们准备好在稍后的步骤中推出之前禁用该功能。)
  6. 单击创建条件。我们稍后将使用此条件向我们的用户推出新功能。

11547904ae42262d.png

  1. 早在添加参数卡,在价值季节性图像推出字段中输入从哪里下载季节性图像的URL: https://images.unsplash.com/photo-1552691021-7043334e0b51
  2. 将默认值保留为空字符串。这意味着将显示代码库中的默认图像,而不是从 URL 下载的图像。
  3. 点击添加参数45933b3f09e69849.png
  4. 我们可以看到新配置是作为草稿创建的。点击发布更改,并确认在顶部的变化来更新我们的应用程序。

38aa4cbe87bc58d3.png

5.增加数据加载时间监控

我们的应用程序预加载之前示出的一些数据MainActivity并显示初始屏幕隐藏此过程。我们不希望我们的用户在这个屏幕上等待太久,所以通常监控启动屏幕的显示时间是有益的。

Firebase 性能监控提供了一种方法来做到这一点。您可以仪器自定义代码跟踪监视的特定代码在您的应用程序的性能-如加载时间数据和我们的新功能的处理时间。

要跟踪启动画面的显示时间,我们将添加一个自定义代码一丝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. 结束该轨迹onDestroy()的方法SplashScreenActivity

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. 结束在两个迹线onLoadFailed()onResourceReady()的方法RequestListener

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.为trace添加自定义属性

对于自定义代码的痕迹,性能自动监控日志默认属性,以便您可以过滤数据在跟踪(如应用程序版本,国家,设备等常见的元数据)火力地堡控制台。您还可以添加和显示器自定义属性

在我们的应用程序中,我们刚刚添加了两个自定义代码跟踪来监控启动画面持续时间和新功能的处理时间。可能影响这些持续时间的一个因素是显示的图像是默认图像还是必须从 URL 下载图像。谁知道呢——我们最终可能会有不同的 URL 来下载图像。

因此,让我们向这些自定义代码跟踪添加一个表示季节性图像 URL 的自定义属性。这样,我们可以稍后通过这些值过滤持续时间数据。

  1. 添加自定义属性( seasonal_image_url_attribute )为splash_screen_trace在年初executeTasksBasedOnRC方法:

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. 添加相同的自定义属性splash_seasonal_image_processing后右startTrace("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);

    // ...
}

现在你已经添加了自定义属性( seasonal_image_url_attribute )为您的自定义的痕迹(的splash_screen_tracesplash_seasonal_image_processing ),再次运行Android Studio中的应用程序。您应该看到一个包含日志消息Setting attribute 'seasonal_image_url_attribute' to 'unset' on trace 'splash_screen_trace'.我们还没有启用远程配置参数seasonalImageUrl这就是为什么该属性值是unset

性能监控 SDK 将收集跟踪数据并将其发送到 Firebase。您可以在视图中的数据性能仪表板的火力地堡控制台,我们将在详细的代码实验室下一步的解释。

7. 配置您的性能监控仪表板

配置仪表板以监控您的功能

火力地堡控制台,选择有你的友好实惠的应用项目。

在左边的面板中,找到发布暨监视器部分,然后单击性能

你应该可以看到你的绩效仪表盘你的第一个数据点的度量板! Performance Monitoring SDK 从您的应用程序收集性能数据,并在收集后的几分钟内显示出来。

16d8b0db35956361.png

您可以在此指标板中跟踪应用的关键指标。默认视图包括应用启动时间跟踪的持续时间,但您可以添加您最关心的指标。由于我们所跟踪的新功能,我们增加了,我们可以根据我们的仪表板显示自定义代码跟踪的时间splash_screen_trace

  1. 点击空选取指标的一个盒子。
  2. 在对话窗口中,选择自定义痕迹的跟踪类型和跟踪名称splash_screen_trace

f3735b336c8c4b8.png

  1. 单击选择指标,你应该看到的时间splash_screen_trace添加到您的仪表盘!

您可以使用这些相同的步骤添加您关心的其他指标,以便您可以快速查看它们的性能如何随时间甚至不同版本而变化。

e7ac31d452e95dba.png

该指标板是一个强大的工具来跟踪你的用户体验的关键指标的表现。对于此 Codelab,我们有一小部分时间范围内的数据,因此我们将使用其他仪表板视图来帮助我们了解功能推出的性能。

8. 推出你的功能

现在,我们已经建立了我们的监测,我们已经准备好推出的火力地堡远程配置变化( seasonal_image_url)我们建立了前面。

推出的变化,我们将回到远程配置页面中的火力地堡控制台增加用户百分我们的定位条件。通常,我们会向一小部分用户推出新功能,只有在我们确信没有问题时才会增加它。但是,在此 Codelab 中,我们是该应用程序的唯一用户,因此我们可以将百分位数更改为 100%。

  1. 单击Conditions选项卡页面的顶部。
  2. 点击Seasonal image rollout前面添加条件。
  3. 将百分位数更改为 100%。
  4. 单击保存条件
  5. 点击发布更改并确认更改。

83b527dd7918d288.png

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

c4ad503bda164ab6.png

9.检查性能变化

现在,让我们看看使用闪屏装载的性能表现仪表盘的火力地堡控制台。在 codelab 的这一步中,我们将使用仪表板的不同部分来查看性能数据。

  1. 在主仪表板选项卡,向下滚动到的痕迹表,然后单击自定义选项卡的痕迹。在这个表格中,你会看到我们先前添加的自定义代码的痕迹以及一些外的开箱痕迹
  2. 现在,我们已经启用了新的功能,外观自定义代码跟踪splash_seasonal_image_processing ,其中测得它采取下载和处理图像的时间。从跟踪的时间值,我们可以看到,此下载和处理需要的时间显著量。

ccb4e5762dfc4abb.png

  1. 因为我们有一个数据splash_seasonal_image_processing ,我们可以在仪表盘选项卡的顶部添加此跟踪我们的度量板的持续时间。

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

c0768ce8f147336a.png

  1. 为了进一步确认的差异,我们可以采取在对数据的仔细看看splash_screen_trace 。点击上splash_screen_trace在指标板卡,然后单击View指标的详细信息

637c29b428a4b98c.png

  1. 在详细信息页面中,您将在左下方看到一个属性列表,包括我们之前创建的自定义属性。单击自定义属性seasonal_image_url_attribute查看闪屏时间在右边每个季节图片网址:

f809ac2f7fc095fb.png

  1. 闪屏时间值可能会比那些在上面的截图有些不同,但你应该有一个持续时间较长时,图像从一个URL下载与使用默认的图像(以“未设置”表示)。

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

  1. 点击性能在页面顶部返回到仪表盘主选项卡: 103568148fde6aeb.png
  2. 在页面底部的痕迹表中,单击网络请求选项卡。在这个表格中,你会看到你的应用程序中的所有网络请求汇总到URL模式,包括images.unsplash.com/** URL模式。如果你的这个响应时间的值进行比较,以花费图像下载和处理的总时间(即,持续时间splash_seasonal_image_processing跟踪),我们可以看到,大量的时间都花在下载图像。

d629934fc7ad4903.png

性能发现

使用 Firebase 性能监控,我们发现启用新功能后对最终用户的影响如下:

  1. 花费的时间SplashScreenActivity有所增加。
  2. 在这段时间里splash_seasonal_image_processing是非常大的。
  3. 延迟是由于图像下载的响应时间和图像所需的相应处理时间造成的。

在下一步中,我们将通过回滚该功能并确定如何改进该功能的实现来减轻对性能的影响。

10.回滚功能

在启动画面期间增加用户的等待时间是不可取的。远程配置的主要优势之一是能够暂停和撤消我们的部署,而无需向我们的用户发布另一个版本。这使我们能够快速对问题做出反应(例如我们在上一步中发现的性能问题)并最大限度地减少不满意用户的数量。

作为一个快速的缓解,我们将重置推出百分回0 ,让所有我们的用户将再次看到默认的图像:

  1. 返回到远程配置页面中的火力地堡控制台。
  2. 点击条件在页面的顶部。
  3. 点击Seasonal image rollout之前添加的条件。
  4. 百分位更改为0%。
  5. 单击保存条件
  6. 点击发布更改并确认更改。

9ed5808f15d2432.png

在 Android Studio 中重新启动应用程序,您应该看到原始空状态主屏幕:

e4b8dac61e405c61.png

11.修复性能问题

我们早些时候在 codelab 中发现,为我们的启动画面下载图像会导致我们的应用程序变慢。在下载的图像左看右看,我们可以看到,我们正在使用的图像,这是超过2MB的原始分辨率!解决我们的性能问题的一个快速方法是将质量降低到更合适的分辨率,以便下载图像所需的时间更少。

再次推出远程配置值

  1. 返回到远程配置页面中的火力地堡控制台。
  2. 点击该编辑图标seasonal_image_url参数。
  3. 更新季节性图像部署价值https://images.unsplash.com/photo-1552691021-7043334e0b51?w=640 ,然后单击更新

79ff14f179636316.png

  1. 单击Conditions选项卡页面的顶部。
  2. 点击图片季节推出,然后设置百分恢复到100%。
  3. 单击保存条件

4578d491f02708a5.png

  1. 点击发布更改按钮。

12. 使用监控测试应用程序

在本地运行应用程序

将新的配置值设置为使用不同的下载图像 URL,再次运行应用程序。这一次,您应该注意到在启动画面上花费的时间比以前更短。

c4ad503bda164ab6.png

查看更改的性能

我们可以回去的性能仪表板在火力地堡控制台看到我们的指标怎么看。

  1. 这次我们将使用跟踪表导航到详细信息页面。相传在痕迹表,在自定义的痕迹选项卡,单击自定义跟踪splash_seasonal_image_processing再次看到它的持续时间度量的更详细视图。

71f13ad560bbddba.png

  1. 单击自定义属性seasonal_image_url_attribute再次看到自定义属性的细分。如果你将鼠标悬停在网址,你会看到一个相匹配的尺寸缩小图像的新网址: https://images.unsplash.com/photo-1552691021-7043334e0b51?w=640 (用?w=640在结束)。与此图像关联的持续时间值比前一个图像的值要短得多,并且更容易为我们的用户所接受。

e522b4f0f315ce3f.png

13. 恭喜!

恭喜!您已启用 Firebase 性能监控 SDK 并收集了跟踪来衡量新功能的性能!您能够监控新功能推出的关键性能指标,并在发现性能问题时迅速做出反应。通过远程配置更改配置并实时监控性能问题,这一切都成为可能。

我们涵盖了什么?

  • 将 Firebase Performance Monitoring SDK 添加到您的应用
  • 向您的代码添加自定义代码跟踪以衡量特定功能
  • 设置远程配置参数和条件值以控制/推出新功能
  • 了解如何使用性能监控仪表板来识别部署期间的问题

了解更多