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.sample3.  import android.app.Application
4.  import co.elastic.apm.android.sdk.ElasticApmAgent6.  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 的可观察性解决方案中的数据。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

杂发单的单据类型一个参数的逻辑

【核准中可改】被产线滥用了。它们可以这样做,开立一张杂发单,打印出来交领导层签名。单据要交财务做核算的。然后去修改杂发单的材料。以为可以瞒天过海。2个仓库,一个中掉坑里,一个发现了它们的拙劣的手段,上报之后没…

事务的介绍(spring)

什么是事务: 事务是一组操作的集合,是不可分割的操作。比如一系列sql语句在一个操作中执行,要么成功要么失败。 比如在转账的时候,a钱包-100,b钱包100,两个要么同时成功要么同时失败。 (复习&a…

CSS一些小点 —— 12.7

1. box-sizing: border-box box-sizing 属性,默认值为 content-box box-sizing: border-box 使padding和border的值不会再影响元素的宽高;padding和border的值算在指定宽高的内部(但是外边距依然算做外部) 2. overflow: hidden …

51c嵌入式~单片机合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12581900 一、STM32代码远程升级之IAP编程 IAP是什么 有时项目上需要远程升级单片机程序,此时需要接触到IAP编程。 IAP即为In Application Programming,解释为在应用中编程,用户自己的程…

将军令游戏源码(​全套源代码+数据库+全套工具+客户端+服务端)

将军令游戏源码(​全套源代码数据库全套工具客户端服务端) 下载地址: 通过网盘分享的文件:【源码】将军令游戏源码(全套源代码数据库全套工具客户端服务端) 链接: https://pan.baidu.com/s/1A5oOn7NsDU1woH…

渐冻症患者的饮食希望:五种食物带来的可能

渐冻症,一个令人胆寒的医学难题。目前,全球约有 50 万渐冻症患者,这个数字还在不断增长。渐冻症会逐渐剥夺患者的行动能力、语言能力,甚至呼吸能力,给患者及其家庭带来沉重的打击。然而,有传言称 “渐冻症最…

文件IO——01

1. 认识文件 1)文件概念 “文件”是一个广义的概念,可以代表很多东西 操作系统里,会把很多的硬件设备和软件资源抽象成“文件”,统一管理 但是大部分情况下的文件,都是指硬盘的文件(文件相当于是对“硬…

安装 pytorch lighting

1 搜寻配对版本 进入lighting官网,查看配对版本 比如我就选择Python3.11、torch2.4、lightning2.4.0 2 搜寻pytorch安装命令 进入pytorch官网,查看以前版本的下载命令 注意要选择是 gpu版本的pytorch查看自己显卡驱动命令:nvidia-smi查看…

2030. gitLab A仓同步到B仓

文章目录 1 A 仓库备份 到 B 仓库2 B 仓库修改main分支的权限 1 A 仓库备份 到 B 仓库 #!/bin/bash# 定义变量 REPO_DIR"/home/xhome/opt/git_sync/zz_xx_xx" # 替换为你的本地库A的实际路径 REMOTE_ORIGIN"http://192.168.1.66:8181/zzkj_software/zz_xx_xx.…

在GITHUB上传本地文件指南(详细图文版)

这份笔记简述了如何在GITHUB上上传文件夹的详细策略。 既是对自己未来的一个参考,又希望能给各位读者带来帮助。 详细步骤 打开目标文件夹(想要上传的文件夹) 右击点击git bash打开 GitHub创立新的仓库后,点击右上方CODE绿色按…

[每周一更]-(第126期):MQ解耦场景

消息队列(MQ)解耦是一种软件架构设计模式,主要通过中间件将系统中的生产者和消费者模块分离,减少模块之间的直接依赖,使系统具有更高的扩展性和灵活性。这种模式尤其适用于需要处理复杂业务逻辑、频繁请求或异步处理的…

学习Python的笔记--面向对象-继承

1、概念 多个类之间的所属关系,即子类默认继承父类的所有属性和方法。 注:所有类默认继承object类,object类是顶级类或基类; 其他子类叫做派生类。 #父类A class A(object):def __init__(self):self.num1def info_print(self)…

操作系统基本管理

操作系统基本原理 计算机的操作地位 文件系统 若某文件系统的目录结构如下图所示,假设用户要访问文件rw.dll,且当前工作目录为 stools 三态模型 进程管理 位示图 (23)4096/321129 (24)200*1024/1/326400 PV操作&a…

基于框架的逻辑回归:原理、实现与应用

目录 ​编辑 逻辑回归原理 损失函数与优化 正则化 基于框架的实现 1. 数据预处理 2. 模型初始化与训练 3. 模型评估与调优 4. 特征缩放 逻辑回归的应用 信用评分 医疗诊断 垃圾邮件识别 推荐系统 结论 在机器学习领域,逻辑回归是一种基础且强大的分类…

对 JavaScript 说“不”

JavaScript编程语言历史悠久,但它是在 1995 年大约一周内创建的。 它最初被称为 LiveScript,但后来更名为 JavaScript,以赶上 Java 的潮流,尽管它与 Java 毫无关系。 它很快就变得非常流行,推动了 Web 应用程序革命&…

Day7 苍穹外卖项目 缓存菜品、SpringCache框架、缓存套餐、添加购物车、查看购物车、清空购物车

目录 1.缓存菜品 1.1 问题说明 1.2 实现思路 1.3 代码开发 1.3.1 加入缓存 1.3.2 清除缓存 1.3.2.1 新增菜品优化 1.3.2.2 菜品批量删除优化 1.3.2.3 修改菜品优化 1.3.2.4 菜品起售停售优化 1.4 功能测试 1.4.1 加入缓存 1.4.2 菜品修改 1.5 代码提交 2.缓存套餐 2.1 Spring C…

【认证法规】安全隔离变压器

文章目录 定义反激电源变压器 定义 安全隔离变压器(safety isolating transformer),通过至少相当于双重绝缘或加强绝缘的绝缘使输入绕组与输出绕组在电气上分开的变压器。这种变压器是为以安全特低电压向配电电路、电器或其它设备供电而设计…

电子应用设计方案-44:智能电饭锅系统方案设计

智能电饭锅系统方案设计 一、引言 随着科技的不断进步和人们生活水平的提高,对电饭锅的功能和智能化要求也越来越高。智能电饭锅不仅能够实现自动烹饪,还能提供多种烹饪模式和个性化设置,满足用户对美食的多样化需求。 二、系统概述 1. 系统…

a8204 基于微信小程序的音乐播放器微信小程序的研究与实现 服务器端Java+Mysql+Servlet 文档 源码

音乐播放微信小程序 1.项目描述2. 绪论3.项目功能4.界面展示5.源码获取 1.项目描述 随着科技的发展,手机在我们生活中起到了重要的作用。软件作为手机重要的一部分,用户体验显得尤为重要。微信小程序一起操作便捷、用户基数大、分享便利、既用即走等特点…

SpringBoot 开源停车场管理收费系统

一、下载项目文件 下载源码项目文件口令: 【前端小程序地址】(3.0):伏脂火器白泽知洞座/~6f8d356LNL~:/【后台管理地址】(3.0):伏脂火器仇恨篆洞座/~0f4a356Ks2~:/【岗亭端地址】(3.0):动作火器智汇堂多好/~dd69356K6r~:/复制口令…