人们在智能手机上通过移动应用程序处理越来越多的私人和工作事务。对于成千上万甚至数百万的用户,确保出色的监控应用程序性能和可靠性是移动应用程序和相关后端服务的提供商和运营商面临的关键挑战。了解移动应用程序的行为、崩溃的发生和类型、响应时间慢的根本原因以及后端问题对真实用户的影响是管理移动应用程序和相关后端服务性能的关键。
Elastic 推出了适用于 Android 应用程序的应用程序性能监控 ( APM ) 代理,使开发人员能够跟踪其应用程序的关键方面,从崩溃和 HTTP 请求到屏幕渲染时间和端到端分布式跟踪。所有这些都有助于解决移动应用程序、相应的后端服务及其交互的问题和性能缺陷。Elastic APM Android 代理会自动检测您的应用程序及其依赖项,以便您可以简单地将该代理“即插即用”到您的应用程序中,而无需担心过多地更改代码库。
Elastic APM Android 代理是基于 OpenTelemetry 从头开始开发的,OpenTelemetry 是一个开放的用于可观测性的标准和框架。开发人员将能够充分利用其功能,以及庞大而活跃的社区提供的支持。如果您熟悉 OpenTelemetry 并且您的应用程序已经使用 OpenTelemetry 进行了检测,那么在切换到 Elastic APM Android 代理时,您可以简单地重用所有这些。但如果情况并非如此,也不用担心 — 该代理配置为自动处理常见的可跟踪场景,而无需深入研究 OpenTelemetry API 的具体细节。
[相关文章:将免费和开放的 Elastic APM 作为 Elastic Observability 部署的一部分添加]
工作原理
Elastic APM Android 代理是 SDK 和 Gradle 插件的组合。SDK 包含实用程序,可用于初始化和配置代理的行为,以及准备和初始化 OpenTelemetry SDK。您可以将 SDK 用于代理的编程配置和初始化,特别是对于高级和特殊用例。
在大多数情况下,不需要进行编程配置和初始化。相反,您可以使用提供的 Gradle 插件来配置代理并自动检测您的应用程序。Gradle 插件在后台使用 Byte Buddy 和官方 Android Gradle 插件 API,通过在编译时转换应用程序及其依赖项的类,自动将检测代码注入到您的应用程序中。
使用配置和启用的 Elastic Android APM 代理 Gradle 插件编译您的应用程序,将使您的 Android 应用程序在运行时报告跟踪数据、指标以及不同的事件和日志。
在 Android 应用程序中使用 Elastic APM 代理
通过一个简单演示应用程序,我们将逐步执行“设置代理”指南中提到的步骤来设置 Elastic Android APM 代理。
先决条件
对于此示例,您将需要以下内容
- 启用了 APM 的 Elastic Stack(我们建议使用 Elastic 的云产品。免费试用。)
- Java 11+
- Android Studio
- Android 模拟器,AVD 设备
您还需要一种将应用程序的信号推送到 Elastic 的方法。因此,您需要 Elastic APM 的密钥令牌,稍后您将在我们的示例应用程序中配置该令牌。
我们的示例测试项目
为了展示包括分布式跟踪在内的端到端场景,在本示例中,我们将检测一个简单的天气应用程序,该应用程序包含两个 Android UI 片段和一个基于 Spring Boot 的简单本地后端服务。
第一个片段将有一个包含一些城市名称的下拉列表,以及一个将您带到第二个片段的按钮,您将在第二个片段中看到所选城市的当前温度。如果您在第一个屏幕上选择非欧洲城市,当您前往第二个屏幕时,您将从(本地)后端收到错误。这是为了演示如何在 Elastic APM 中捕获和关联网络和后端错误。
应用 Elastic APM 代理插件
在下文中,我们将解释从头开始为 Android 应用程序设置 Elastic APM Android 代理所需的所有步骤。如果您想跳过这些说明并立即查看代理的实际效果,请使用该存储库的 main 分支,并在继续下一部分(“设置本地后端服务”)之前仅应用步骤 (3.b)。
- 克隆示例应用程序存储库并在 Android Studio 中打开它。
- 切换到未检测的存储库分支,以从空白的未检测 Android 应用程序开始。您可以运行此命令以切换到未检测的分支
git checkout uninstrumented
- 按照 Elastic APM Android 代理的设置指南进行操作
将 co.elastic.apm.android 插件添加到 app/build.gradle 文件中(请确保使用该插件的最新可用版本,您可以在此处找到)。
通过在 app/build.gradle 文件的“elasticAPM”部分中提供“serverUrl”和“secretToken”,配置代理与 Elastic APM 后端的连接。
// Android app's build.gradle file
plugins {
//...
id "co.elastic.apm.android" version "[latest_version]"
}
//...
elasticApm {
// Minimal configuration
serverUrl = "https://your.elastic.apm.endpoint"
// Optional
serviceName = "weather-sample-app"
serviceVersion = "0.0.1"
secretToken = "your Elastic APM secret token"
}
- 唯一需要修改的实际代码是在 Application.onCreate 方法中初始化 Elastic APM Android 代理的一行代码。此示例应用的应用程序类位于 app/src/main/java/co/elastic/apm/android/sample/MyApp.kt。
package co.elastic.apm.android.sample
import android.app.Application
import co.elastic.apm.android.sdk.ElasticApmAgent
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
ElasticApmAgent.initialize(this)
}
}
请记住,对于此示例,我们没有更改代理的默认配置 — 如果您想了解如何操作的更多信息,请查看代理的运行时配置指南。
在启动我们的 Android 天气应用程序之前,我们需要按照下一节中的描述配置并启动本地天气后端服务。
设置本地后端服务
代理提供的关键功能之一是分布式追踪,它可以让您看到 HTTP 事务的完整端到端流程,从我们的移动应用程序开始,并遍历该应用程序使用的已检测后端服务。Elastic APM 会将完整流程显示为一个分布式追踪,这对于排除故障(尤其是与高延迟和后端错误相关的问题)非常方便。
作为我们示例应用程序的一部分,我们将启动一个简单的本地后端服务,该服务将处理我们应用程序的 HTTP 请求。该后端服务使用 Elastic APM Java 代理进行检测,以收集其自身的 APM 数据并将其发送到 Elastic APM,从而使其能够将移动交互与后端请求的处理关联起来。
为了配置本地服务器,我们需要将我们的 Elastic APM 端点和密钥令牌(与之前步骤中用于我们的 Android 应用程序的相同)设置到 backend/src/main/resources/elasticapm.properties 文件中
service_name=weather-backend
application_packages=co.elastic.apm.android.sample
server_url=YOUR_ELASTIC_APM_URL
secret_token=YOUR_ELASTIC_APM_SECRET_TOKEN
启动演示
我们的示例应用程序将自动检测代理当前支持的框架,这意味着我们将获得开箱即用的屏幕渲染 span 以及 OkHttp 请求。对于当前不支持的框架,您可以应用手动检测来丰富您的 APM 数据(请参阅下面的“手动检测”)。
我们准备启动演示。(演示旨在本地环境中使用 Android 模拟器执行。)因此,我们需要
- 使用以下命令在示例项目根目录下的终端中启动后端服务:./gradlew bootRun(如果在 Windows 上,则使用 gradlew.bat bootRun)。或者,您可以从 Android Studio 启动后端服务。
- 在 Android 模拟器中(从 Android Studio)启动天气示例应用程序。
一切运行后,我们需要在应用程序中导航,以生成一些我们希望在 Elastic APM 中观察的负载。因此,请选择一个城市,单击“下一步”并多次重复此操作。另外,请确保至少选择一次纽约。您将看到纽约的天气预报无法使用。下面,我们将使用 Elastic APM 来找出选择纽约时出现的问题。
首次查看 APM 结果
让我们打开 Kibana 并导航到“可观测性”解决方案。
在“服务”导航项下,您应该看到两个服务列表:我们的 Android 应用程序 weather-sample-app 和相应的后端服务 weather-backend。单击“服务地图”选项卡以查看这些服务与任何外部服务之间的依赖关系的可视化表示。
单击 weather-sample-app 以深入查看 Android 应用程序的仪表板。移动应用程序的服务视图在此博客文章发布时处于技术预览阶段,但您已经可以在该屏幕上看到有关该应用程序的富有洞察力的信息。您可以看到诸如在选定时间范围内的活跃会话数、weather-sample-app 发出的 HTTP 请求数、请求的地理分布以及设备型号、操作系统版本、网络连接类型和应用程序版本的细分等信息。(崩溃和应用程序加载时间的信息正在开发中。)
为了演示的目的,我们使此演示保持简单,因此数据多样性较低且相当有限。但是,当您正在监视具有较高使用率和设备型号、操作系统版本等较高多样性的移动应用程序时,此类数据特别有用。当您可以使用这些属性来过滤和分组您的 APM 数据时,排除故障和性能问题变得更加容易。您可以使用顶部的快速过滤器来执行此操作,并查看指标如何根据您的选择进行调整。
现在,让我们看看如何处理单个用户交互,包括对后端服务的下游调用。在“事务”选项卡(顶部)下,我们看到了不同的端到端事务组,包括 FirstFragment 和 SecondFragment 的两个事务。
让我们深入了解 SecondFragment - View appearing 事务,以查看此事务组的指标(例如,延迟、吞吐量)以及单个用户交互的调用瀑布视图。正如我们在以下屏幕截图中所看到的,在视图创建后,该片段向 10.0.2.2 执行 HTTP GET 请求,这大约需要 130 毫秒。在相同的瀑布中,我们看到 HTTP 调用由 weather-backend 服务处理,该服务本身对 api.open-meteo.com 进行 HTTP 调用。
现在,当查看选择了纽约作为城市的请求的瀑布视图时,我们看到后端服务上发生了一个错误,这解释了为什么纽约的天气预报无法使用。通过单击红色的“查看相关错误”徽章,您将获得有关错误和问题的实际根本原因的详细信息。
weather-backend 上的异常消息指出:“此服务只能检索欧洲城市的地理位置!” 这就是选择纽约作为城市的问题所在。
手动检测
如前所述,Elastic APM Android 代理会为您对支持的框架进行大量自动检测;但是,在某些情况下,您可能希望根据应用程序的用例进行额外的检测。对于这些情况,您可以通过 OpenTelemetry API 来覆盖,这正是 Elastic APM Android 代理所基于的。OpenTelemetry Java SDK 包含用于创建自定义 span、指标和日志的工具,并且由于它是 Elastic APM Android 代理的基础,因此您可以使用它,而无需向项目中添加任何额外的依赖项,也无需配置任何内容以将您的自定义信号连接到您自己的 Elastic 环境,因为代理会为您执行此操作。
开始的方法是像这样获取 OpenTelemetry 的实例
OpenTelemetry openTelemetry = GlobalOpenTelemetry.get();
然后,您可以按照OpenTelemetry Java 文档中的说明创建自定义信号。请参阅以下示例,了解如何创建自定义 span
OpenTelemetry openTelemetry = GlobalOpenTelemetry.get();
Tracer tracer = openTelemetry.getTracer("instrumentation-library-name", "1.0.0");
Span span = tracer.spanBuilder("my span").startSpan();
// Make the span the current span
try (Scope ss = span.makeCurrent()) {
// In this scope, the span is the current/active span
} finally {
span.end();
}
结论
在这篇博客文章中,我们演示了如何使用 Elastic APM Android 代理来实现对基于 Android 的移动应用程序的端到端可观测性。设置代理只需几分钟,所提供的见解使您可以分析应用程序的性能及其对后端服务的依赖性。通过安装 Elastic APM Android 代理,您可以利用 Elastic 丰富的 APM 功能以及通过自定义检测和自定义仪表板自定义分析工作流程的各种可能性。
您好奇吗?那就自己尝试一下。注册Elastic Cloud 的免费试用版,使用本博客中描述的 Elastic APM Android 代理来丰富您的 Android 应用程序,并在Elastic 的可观测性解决方案中探索数据。