Elasticsearch:使用 Elastic APM 监控 Android 应用程序

一、前言

人们通过私人和专业的移动应用程序在智能手机上处理越来越多的事情。 拥有成千上万甚至数百万的用户,确保出色的性能和可靠性是移动应用程序和相关后端服务的提供商和运营商面临的主要挑战。 了解移动应用程序的行为、崩溃的发生和类型、响应时间慢的根本原因以及后端问题对用户的实际影响是管理移动应用程序和相关后端服务性能的关键。

Elastic 推出了适用于 Android 应用程序的应用程序性能监控 (APM) 代理,允许开发人员跟踪其应用程序的关键方面,从崩溃和 HTTP 请求到屏幕渲染时间和端到端分布式跟踪。 所有这些都有助于解决移动应用程序、相应后端服务及其交互的问题和性能缺陷。 Elastic APM Android 代理会自动检测你的应用程序及其依赖项,因此你可以简单地将代理 “即插即用” 到你的应用程序中,而不必担心对代码库进行太多更改。

Elastic APM Android 代理是在 OpenTelemetry 之上从头开发的,OpenTelemetry 是一种开放标准和可观察性框架。 开发人员将能够充分利用其功能,以及庞大而活跃的社区提供的支持。 如果你熟悉 OpenTelemetry 并且你的应用程序已经使用 OpenTelemetry 进行检测,那么你可以在切换到 Elastic APM Android Agent 时简单地重用它。 但如果情况并非如此,请不要担心 —— 代理被配置为自动处理常见的可追踪场景,而无需深入研究 OpenTelemetry API 的细节。

二、怎么运行的

Elastic APM Android Agent 是 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 的 Cloud 产品。免费试用。)

Java 11+
Android Studio
Android 模拟器、AVD 设备

你还需要一种方法将应用程序的信号推送到 Elastic。 因此,你将需要 Elastic APM 的秘密令牌(secret token),稍后你将在我们的示例应用程序中配置该令牌。

我们示例的测试项目

为了展示包括分布式跟踪在内的端到端场景,在此示例中,我们将检测一个简单的天气应用程序,该应用程序包含两个 Android UI 片段和一个基于 Spring Boot 的简单本地后端服务。

第一个片段将有一个包含一些城市名称的下拉列表以及一个将你带到第二个片段的按钮,你将在其中看到所选城市的当前温度。 如果你在第一个屏幕上选择了一个非欧洲城市,那么当你前往第二个屏幕时,你会从(本地)后端收到一个错误。 这是为了演示如何在 Elastic APM 中捕获和关联网络和后端错误。

应用 Elastic APM 代理插件
在下文中,我们将解释从头开始为 Android 应用程序设置 Elastic APM Android 代理所需的所有步骤。 如果你想跳过这些说明并立即查看代理的运行情况,请使用该存储库的主分支并仅应用步骤 (3.b),然后再继续下一节(“设置本地后端服务”)。

1.克隆示例应用程序库并在 Android Studio 中打开它。
2.切换到 uninstrumented 的 repo 分支,从一个空白的、未检测的 Android 应用程序开始。 你可以运行此命令切换到未检测的分支:

git checkout uninstrumented

3.按照 Elastic APM Android Agent 的设置指南进行操作:

将 co.elastic.apm.android 插件添加到 app/build.gradle 文件(请确保使用该插件的最新版本,你可以在此处找到该插件)。
通过在 app/build.gradle 文件的 “elasticAPM” 部分中提供 “serverUrl” 和 “secretToken” 来配置代理与 Elastic APM 后端的连接。

1.  // Android app's build.gradle file
2.  plugins {
3.      //...
4.      id "co.elastic.apm.android" version "[latest_version]"
5.  }

7.  //...

9.  elasticApm {
10.      // Minimal configuration
11.      serverUrl = "https://your.elastic.apm.endpoint"

13.      // Optional
14.      serviceName = "weather-sample-app" 
15.      serviceVersion = "0.0.1" 
16.      secretToken = "your Elastic APM secret token" 
17.  }

4.唯一实际需要更改的代码是一行代码,用于在 Application.onCreate 方法中初始化 Elastic APM Android 代理。 此示例应用程序的应用程序类位于 app/src/main/java/co/elastic/apm/android/sample/MyApp.kt。

package co.elastic.apm.android.sample

3.  import android.app.Application
4.  import co.elastic.apm.android.sdk.ElasticApmAgent

6.  class MyApp : Application() {

8.      override fun onCreate() {
9.          super.onCreate()
10.          ElasticApmAgent.initialize(this)
11.      }
12.  }

请记住,对于此示例,我们不会更改代理的默认配置 —— 如果你想了解有关如何更改的更多信息,请查看代理的运行时配置指南。
在启动我们的 Android 天气应用程序之前,我们需要配置并启动本地天气后端服务,如下一节所述。

设置本地后端服务
代理提供的关键功能之一是分布式跟踪,它允许你查看 HTTP 事务的完整端到端故事,从我们的移动应用程序开始并遍历应用程序使用的检测后端服务。 Elastic APM 将以一个分布式跟踪的形式向你展示全貌,这对于解决问题非常方便,尤其是与高延迟和后端错误相关的问题。

作为示例应用程序的一部分,我们将启动一个简单的本地后端服务来处理我们应用程序的 HTTP 请求。 后端服务使用 Elastic APM Java 代理进行检测,以收集自己的 APM 数据并将其发送到 Elastic APM,使其能够将移动交互与后端请求的处理相关联。

为了配置本地服务器,我们需要在 backend/src/main/resources/elasticapm.properties 文件中设置我们的 Elastic APM 端点和秘密令牌(与上一步中我们的 Android 应用程序使用的相同):

1.  service_name=weather-backend
2.  application_packages=co.elastic.apm.android.sample
3.  server_url=YOUR_ELASTIC_APM_URL
4.  secret_token=YOUR_ELASTIC_APM_SECRET_TOKEN

启动演示
我们的示例应用程序将为代理当前支持的框架获得自动检测,这意味着我们将看到屏幕渲染跨度以及开箱即用的 OkHttp 请求。 对于当前不支持的框架,你可以应用手动检测来丰富你的 APM 数据(请参阅下面的 “手动检测”)。
我们准备启动演示。 (该demo旨在使用Android模拟器在本地环境中执行。)因此,我们需要:

在位于示例项目根目录的终端中使用此命令启动后端服务:./gradlew bootRun(如果你使用的是 Windows,则为 gradlew.bat bootRun)。 或者,你可以从 Android Studio 启动后端服务。
在 Android 模拟器(来自 Android Studio)中启动天气示例应用程序。

一切运行后,我们需要在应用程序中四处导航以生成一些我们希望在 Elastic APM 中观察到的负载。 因此,选择一个城市,单击 “Next” 并重复多次。 请确保至少选择 New York 一次。 你会看到天气预报对纽约这个城市不起作用。 下面,我们将使用 Elastic APM 来找出选择纽约时出现的问题。

在这里插入图片描述
初看 APM 结果
让我们打开 Kibana 并导航到 Observability 解决方案。
在 Services 导航项下,你应该看到两个服务的列表:我们的 Android 应用 weather-sample-app 和相应的后端服务 weather-backend。 单击 Service map 选项卡以查看这些服务与任何外部服务之间依赖关系的可视化。
在这里插入图片描述

单击 weather-sample-app 以深入了解 Android 应用程序的仪表板。 移动应用程序的服务视图在发布此博文时处于技术预览(technical preview)阶段,但你已经可以在该屏幕上看到有关该应用程序的深入信息。 你会看到所选时间范围内的活动会话数量、weather-sample-app 发出的 HTTP 请求数量、请求的地理分布以及设备型号、操作系统版本、网络连接类型和应用程序的细分等信息 版本。 (有关崩溃和应用程序加载时间的信息正在开发中。)
为了演示的目的,我们保持这个演示简单,所以数据不那么多样化,也相当有限。 但是,当你监控使用次数较多且设备型号、操作系统版本等方面更加多样化的移动应用程序时,此类数据特别有用。当你可以使用这些属性进行过滤和分组你的 APM 数据时,故障排除和性能问题变得更加容易 。 你可以使用顶部的快速过滤器来执行此操作,并查看指标如何根据你的选择被采用。
在这里插入图片描述

现在,让我们看看如何处理单个用户交互,包括对后端服务的下游调用。 在 Transactions 选项卡(顶部)下,我们看到不同的端到端 transaction 组,包括 FirstFragment 和 SecondFragment 的两个 transactions。
在这里插入图片描述

让我们深入研究 SecondFragment - 查看出现的 transaction,以查看此 transaction 组的指标(例如,延迟、吞吐量)以及单个用户交互的调用瀑布视图。 正如我们在下面的屏幕截图中看到的,在视图创建之后,该片段向 10.0.2.2 执行 HTTP GET 请求,这需要大约 130 毫秒。 在同一个瀑布中,我们看到 HTTP 调用由 weather-backend 服务处理,它本身对 api.open-meteo.com 进行 HTTP 调用。
在这里插入图片描述

现在,当查看纽约被选为城市的请求的瀑布视图时,我们看到后端服务发生错误,这解释了为什么预测对 New York 不起作用。 通过单击红色的查看相关错误标记,你将获得错误的详细信息和问题的实际根本原因。
天气后端的异常消息指出 “This service can only retrieve geo locations for European cities!” 这就是选择 New York 作为城市的问题。
在这里插入图片描述

手动检测
如前所述,Elastic APM Android Agent 代表你为受支持的框架执行一系列自动检测; 但是,在某些情况下,你可能希望根据应用的用例获得额外的检测。 对于这些情况,你已经了解了 OpenTelemetry API,它是 Elastic APM Android 代理的基础。 OpenTelemetry Java SDK 包含用于创建自定义 spans、 metrics 和 logs 的工具,并且由于它是 Elastic APM Android 代理的基础,因此你无需在项目中添加任何额外依赖项也无需配置任何内容即可使用它及将你的自定义信号连接到你自己的 Elastic 环境,就像代理为你做的那样。
开始的方法是像这样获取 OpenTelemetry 的实例:

OpenTelemetry openTelemetry = GlobalOpenTelemetry.get();

然后你可以按照 OpenTelemetry Java 文档中的说明创建自定义信号。 有关创建自定义 span 的示例,请参见以下示例:
ini 代码解读复制代码

1.  OpenTelemetry openTelemetry = GlobalOpenTelemetry.get();
2.  Tracer tracer = openTelemetry.getTracer("instrumentation-library-name", "1.0.0");
3.  Span span = tracer.spanBuilder("my span").startSpan();

5.  // Make the span the current span
6.  try (Scope ss = span.makeCurrent()) {
7.    // In this scope, the span is the current/active span
8.  } finally {
9.      span.end();
10.  }

四、结论

在这篇博文中,我们演示了如何使用 Elastic APM Android 代理在基于 Android 的移动应用程序中实现端到端的可观察性。 设置代理只需几分钟,所提供的见解可让你分析应用的性能及其对后端服务的依赖性。 有了 Elastic APM Android Agent,你可以利用 Elastic 丰富的 APM 功能以及各种可能性,通过自定义检测和自定义仪表板来自定义你的分析工作流程。
你好奇吗? 然后自己试试。 在 Elastic Cloud 上注册免费试用,使用本博客中所述的 Elastic APM Android 代理丰富你的 Android 应用程序,并探索 Elastic 的可观察性解决方案中的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/930830.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DataSophon集成CMAK KafkaManager

本次集成基于DDP1.2.1 集成CMAK-3.0.0.6 设计的json和tar包我放网盘了. 通过网盘分享的文件:DDP集成CMAK 链接: https://pan.baidu.com/s/1BR70Ajj9FxvjBlsOX4Ivhw?pwdcpmc 提取码: cpmc CMAK github上提供了zip压缩包.将压缩包解压之后 在根目录下加入启动脚本…

Java——异常机制(上)

1 异常机制本质 (异常在Java里面是对象) (抛出异常:执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE) 工作中,程序遇到的情况不可能完美。比如…

vue3 vite ts day2

虚拟dom diff 算法的了解 diff 算法 源码的了解 简单易懂的图 参考文章 学习Vue3 第五章(Vue核心虚拟Dom和 diff 算法)_学习vue3 第五章 (vue核心虚拟dom-CSDN博客 如需了解更多请去原作者下看,讲的真的很细。 ref reactive vue2 …

动态计算加载图片

学习啦 别名路径:①npm install path --save-dev②配置 // vite.config,js import { defineConfig } from vite import vue from vitejs/plugin-vueimport { viteStaticCopy } from vite-plugin-static-copy import path from path export default defineConfig({re…

Postgresql 格式转换笔记整理

1、数据类型有哪些 1.1 数值类型 DECIMAL/NUMERIC 使用方法 DECIMAL是PostgreSQL中的一种数值数据类型,用于存储固定精度和小数位数的数值。DECIMAL的精度是由用户指定的,可以存储任何位数的数值,而小数位数则由用户自行定义。DECIMAL类型的…

爬虫运行后数据如何存储?

爬虫运行后获取的数据可以存储在多种不同的存储系统中,具体选择取决于数据的规模、查询需求以及应用场景。以下是一些常见的数据存储方法: 1. 文件系统 对于小型项目或临时数据存储,可以直接将数据保存到本地文件中。常见的文件格式包括&…

吉林大学23级数据结构上机实验(第7周)

A 去火车站 寒假到了,小明准备坐火车回老家,现在他从学校出发去火车站,CC市去火车站有两种方式:轻轨和公交车。小明为了省钱,准备主要以乘坐公交为主。CC市还有一项优惠政策,持学生证可以免费乘坐一站轻轨&…

谈谈IPD在PLM的落地

关注作者 1 前言 全球化市场竞争形势下,越来越多企业不断提升自身的研发创新能力,加大产品的研发创新投入。从整个研发投入来看,2022年至2023年间,研发投入强度由1.54%提升至2.64%,其中中小民营企业增长为3.75%&#…

线程(二)——线程安全

如何理解线程安全: 多线程并发执行的时候,有时候会触发一些“bug”,虽然代码能够执行,线程也在工作,但是过程和结果都不符合我们的开发时的预期,所以我们将此类线程称之为“线程安全问题”。 例如&#xff…

思特奇政·企数智化产品服务平台正式发布,助力运营商政企数智能力跃迁

数字浪潮下,产业数字化进程加速发展,信息服务迎来更广阔的天地,同时也为运营商政企支撑系统提出了更高要求。12月4日,2024数字科技生态大会期间,思特奇正式发布政企数智化产品服务平台,融合应用大数据、AI等新质生产要素,构建集平台服务、精准营销、全周期运营支撑、智慧大脑于…

解决Windows与Ubuntu云服务器无法通过Socket(udp)通信问题

今天在写Socket通信代码的时候,使用云服务器自己与自己通信没有问题,但是当我们把客户端换为Windows系统的时候却无法发送信息到Linux当中,耗时一上午终于搞定了😒。 问题: 如上图,当我在windows的客户端…

面向金融场景的大模型 RAG 检索增强解决方案

概述 在现代信息检索领域,检索增强生成(Retrieval-Augmented Generation, RAG)模型结合了信息检索与生成式人工智能的优点,从而在特定场景下提供更为精准和相关的答案。在特定场景下,例如金融等领域,用户通…

【pyspark学习从入门到精通24】机器学习库_7

目录 聚类 在出生数据集中寻找簇 主题挖掘 回归 聚类 聚类是机器学习中另一个重要的部分:在现实世界中,我们并不总是有目标特征的奢侈条件,因此我们需要回归到无监督学习的范式,在那里我们尝试在数据中发现模式。 在出生数据…

渗透测试---burpsuite(5)web网页端抓包与APP渗透测试

声明:学习素材来自b站up【泷羽Sec】,侵删,若阅读过程中有相关方面的不足,还请指正,本文只做相关技术分享,切莫从事违法等相关行为,本人与泷羽sec团队一律不承担一切后果 视频地址:泷羽---bp&…

[LitCTF 2023]破损的图片(初级)

[LitCTF 2023]破损的图片(初级) 我们下载附件得到一个没有后缀的文件,拖去010看一看,发现本来应该是文件头的那部分不大对劲,结合后面四个点以及IHDR,大致也应该知道是啥了 修改第一行为png 89 50 4E 47 0D 0A 1A 0A 00 00 00 …

docker部署RustDesk自建服务器

客户端: Releases rustdesk/rustdesk GitHub 服务端: 项目官方地址:GitHub - rustdesk/rustdesk-server: RustDesk Server Program 1、拉取RustDesk库 docker pull rustdesk/rustdesk-server:latest 阿里云库: docker pu…

智慧银行反欺诈大数据管控平台方案(八)

智慧银行反欺诈大数据管控平台的核心理念,在于通过整合先进的大数据技术、算法模型和人工智能技术,构建一个全面、智能、动态的反欺诈管理框架,以实现对金融交易的全方位监控、欺诈行为的精准识别和高效处理。这一理念强调数据驱动决策&#…

关闭windows11的“热门搜索”

win10搜索栏热门搜索怎么关闭?win10搜索栏热门搜索关闭方法分享_搜索_onecdll-GitCode 开源社区 注册表地址是:计算机\HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\ 最后效果如下:

14.在 Vue 3 中使用 OpenLayers 自定义地图版权信息

在 WebGIS 开发中,默认的地图服务通常会带有版权信息,但有时候我们需要根据项目需求自定义版权信息或添加额外的版权声明。在本文中,我们将基于 Vue 3 的 Composition API 和 OpenLayers,完成自定义地图版权信息的实现。 最终效果…

Dubbo应用篇

文章目录 一、Dubbo简介二、SSM项目整合Dubbo1.生产者方配置2.消费者方配置 三、Spring Boot 项目整合Dubbo1.生产者方配置2.消费者方配置 四、应用案例五、Dubbo配置的优先级别1. 方法级配置(Highest Priority)2. 接口级配置3. 消费者/提供者级配置4. 全…