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

news2025/3/13 0:13:58

在我之前的文章 “Elasticsearch:使用 Elastic APM 监控 Android 应用程序(一)” 中,我详述了如何使用 Elastic APM 来监控 Android 应用程序。在今天的文章中,我来详述如何部署 Elastic Stack,并使用文章中的示例代码来进行展示。为了展示方便,在今天的展示中,我将所有的组件都安装到同一台机器 macOS 上。它的 private IP 地址为 192.168.0.3。

使用 Elastic APM 监控 Android 应用程序

APM 集成架构

Elastic APM 集成由四个组件组成:APM 代理Elastic APM 集成ElasticsearchKibana。 通常,这四个组件可以通过两种方式协同工作。边缘机器上的 APM 代理将数据发送到集中托管的 APM 集成:

在本演示中,我们的边缘设备也即 macOS。它通过 Elastic APM agent 采集信息,并传输到一个中央的 APM 集成。

在本次的演示中,我将使用最新的 Elastic Stack 8.7.0 来进行展示。

安装

Elastic Stack

 我们先按照我之前的文章:

  • 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch

  • Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana

来安装 Kibana 及 Elasticsearch。不过在安装的时候,我们需要做一些调整。在启动 Elasticsearch 之前,我们还必须针对 Elasticsearch 的配置文件做一项修改:

config/elasticsearch.yml

xpack.security.authc.api_key.enabled: true

我们把上面的配置添加到 config/elasticsearch.yml 文件的最后面。这个是为了能够我们使用 API key 的方式来访问 Elasticsearch。修改完毕后,我们启动 Elasticsearch。

我们还必须为 Kibana 做一项修正。我们首先在 Kibana 的安装目录中使用如下的命令:

xpack.encryptedSavedObjects.encryptionKey: 5834bb75e1e8eaa4794439d228a0fe65
xpack.reporting.encryptionKey: d2a1337320c79c038f279167adc1a9ee
xpack.security.encryptionKey: 7cde0c75b035a99d000ed20b1e84b530

我们把上面的三个 keys 拷贝并粘贴到 config/kibana.yml 文件的最后面:

config/kibana.yml

添加完毕后,我们重新启动 Kibana。

Kibana 需要 Internet 连接才能从 Elastic Package Registry 下载集成包。 确保 Kibana 服务器可以连接到端口 443 上的 https://epr.elastic.co。如果你的环境有网络限制,则有一些方法可以解决此要求。 有关详细信息,请参阅气隙环境。

另外,我们必须注意的一点是 Fleet 在目前只供具有 superuser 角色的用户使用。Fleet 是 Kibana 中的界面。它被用来管理及监控 Elastic Agents。

Android Studio

如果你还没有安装好自己的 Android Studio,请到地址 https://developer.android.com/studio 去下载最新的发布,并进行相应的安装。

配置 Fleet

使用 Kibana 中的 Fleet 来添加对 Elastic agent 的管理。第一次使用 Fleet 时,你可能需要对其进行设置并添加 Fleet Server。要部署自我管理的 Fleet Server,请安装 Elastic Agent 并将其注册到包含 Fleet Server 集成的代理策略中:

​ 

​  

​ 

如上所示,我们在成功地创建 Fleet server policy 之后,然后选择相应的操作系统来安装 Elastic Agent。针对我的架构,我安装 Elastic Agent 到我的 macOS 电脑上:

curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-8.7.0-darwin-x86_64.tar.gz
tar xzvf elastic-agent-8.7.0-darwin-x86_64.tar.gz
cd elastic-agent-8.7.0-darwin-x86_64
sudo ./elastic-agent install \
  --fleet-server-es=https://192.168.0.3:9200 \
  --fleet-server-service-token=AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE2ODE4MjkwODAxMzQ6LVo1OHN0Z2ZSNXlkOE5ZM3k5Tmd3dw \
  --fleet-server-policy=fleet-server-policy \
  --fleet-server-es-ca-trusted-fingerprint=9f268b75e5b9644109a69007310a97e0244fa86e7e80b3a50c55f937e38c7a66

​​

 如果你之前在自己的电脑上已经安装过,你可以去相应的目录中先进行卸载。针对 macOS:

$ su
Password:
$ cd /Library/Elastic/Agent/
$ ./elastic-agent uninstall
Elastic Agent will be uninstalled from your system at /Library/Elastic/Agent. Do you want to continue? [Y/n]:y
Elastic Agent has been uninstalled.

针对 Linux OS:

liuxg@liuxgu:~$ su
Password: 
root@liuxgu:/home/liuxg# cd /opt/Elastic/Agent/
root@liuxgu:/opt/Elastic/Agent# ./elastic-agent uninstall
Elastic Agent will be uninstalled from your system at /opt/Elastic/Agent. Do you want to continue? [Y/n]:y
I0418 10:31:42.996703    3635 leaderelection.go:248] attempting to acquire leader lease default/elastic-agent-cluster-leader...
Elastic Agent has been uninstalled.

稍等一会儿,我们就可以看到 liuxgm.local,也就是我的 macOS 机器上的 Agents 状态显示为 Healthy。我们点击 Fleet Server Policy: 

 ​ 

​  

​  

​ 

​ 

​ 

从上面,我们可以看出我们已经成功地部署了 APM 服务器。

接下来,我们可以开始部署 APM agents 了。

直到这一步,我们可以查看我们已经启动的端口:

$ netstat -an | grep LISTEN | grep 8200
tcp4       0      0  192.168.0.3.8200       *.*                    LISTEN     
$ netstat -an | grep LISTEN | grep 8220
tcp46      0      0  *.8220                 *.*                    LISTEN     
$ netstat -an | grep LISTEN | grep 8080
$ netstat -an | grep LISTEN | grep 8080
tcp46      0      0  *.8080                 *.*                    LISTEN    

配置 APM agents

我们首先去地址 GitHub - elastic/sample-app-android-apm: Sample app to show the Elastic APM implementation on Android apps 下载源码:

git clone https://github.com/elastic/sample-app-android-apm

然后,我们使用如下的命令来 check out uninstrumented 分支:

cd sample-app-android-apm
git checkout uninstrumented

我们需要重新配置这个 backend。在默认的情况下,它不能连接到 Elasticsearch。我们必须修改如下如下的配置文件:

backend/src/main/resources/elasticapm.properties

service_name=weather-backend
application_packages=co.elastic.apm.android.sample
server_url=http://192.168.0.3:8200
secret_token=YOUR_ELASTIC_APM_SECRET_TOKEN

你需要根据自己的 APM server 地址修改上面的地址。

启动应用程序

我们接下来启动应用程序。我们需要在应用程序中进行一些配置。

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

将 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" 
}

在我们的设计中,我们没有使用 token,所以上面的 secretToken 可以不设置或者可以为任意字符串。如果你想设置 secretToken,请参阅我之前的文章 “Obsevability:安全的 APM 服务器访问”。

2)唯一实际需要更改的代码是一行代码,用于在 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)
    }
}

3)我们也同时需要修改如下地址的一个文件:

app/src/main/java/co/elastic/apm/android/sample/network/WeatherRestManager.kt

package co.elastic.apm.android.sample.network

import co.elastic.apm.android.sample.network.data.ForecastResponse
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

object WeatherRestManager {

    private val service: CityWeatherService by lazy {
        val retrofit = Retrofit.Builder()
            .baseUrl("http://192.168.0.3:8080/v1/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
        retrofit.create(CityWeatherService::class.java)
    }

    suspend fun getCurrentCityWeather(city: String): ForecastResponse {
        return service.getCurrentWeather(city)
    }
}

如上所示,我们需要修改上面的 APM server 地址。

我们准备启动演示。 (该 demo 旨在使用 Android 模拟器在本地环境中执行。)因此,我们需要:

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

我们在 Android Studio 里运行 android 应用:

我们可以看到如下的模拟器:

 点击 Next 按钮:

我们尝试其它城市的选择。当我们选择 New York 城市的时候,我们可以看到如下的错误:

我们回到 APM 的界面:

从上面的图中,我们可以看到两个服务。我们点击 Service map:

很显然这个是一个收费的功能。我们需要打开试用功能:

这样就完成了试用的启动。我们再次回到 Service map 界面:

点击上面的 weather-sample-app:

其它的画面可以参考文章 “Elasticsearch:使用 Elastic APM 监控 Android 应用程序(一)”。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《港联证券》新三板股票交易规则是什么?如何进行交易?

新三板分为根底层、创新层和精选层。新三板股票设置了一些规则,既约束了一些新三板挂牌公司的股权进入生意市场,一起也约束了一些投资者进行投资,保证了新三板市场的安全。那么新三板股票生意规则是什么?怎么进行生意?…

【PMP】项目各阶段分别运用什么工具与技术汇总

做项目管理是一条漫漫长路,所有的本事,都是靠一个个项目,一点点积累而来的,并不存在“迅速上手”的方法论。一名普通项目经理的成长,都要经过一定时间的修炼。 数据收集 头脑风暴 在短时间内获得大量创意&#xff0…

「ML 实践篇」模型训练

在训练不同机器学习算法模型时,遇到的各类训练算法大多对用户都是一个黑匣子,而理解它们实际怎么工作,对用户是很有帮助的; 快速定位到合适的模型与正确的训练算法,找到一套适当的超参数等;更高效的执行错…

SSM--mybatis逆向工程生成

SSM学习笔记–mybatis逆向工程生成 文章目录SSM学习笔记--mybatis逆向工程生成1. 创建数据库和表2. Mybatis Generator 逆向工程1. 创建数据库和表 -- 创建 furns_ssm DROP DATABASE IF EXISTS furn_ssm; CREATE DATABASE furn_ssm; USE furn_ssm;-- 创建家居表 CREATE TABLE …

Node.js—fs模块

目录 1、什么是fs2、同步和异步调用3、文件写入3.1 writeFile 异步写入3.2 writeFileSync 同步写入3.3 appendFile / appendFileSync 追加写入3.4 createWriteStream 流式写入3.5 写入文件的场景 4、文件读取4.1 readFile 异步读取4.2 readFileSync 同步读取4.3 createReadStre…

C++基础知识总结(详解)

前言 文章篇幅较大,内容充实 请在阅读的过程中保持一个批判的态度 C基础 C头文件 C有自己的头文件,例如iostream 没有.h 也可以用C的头文件 例如stdio.h 有.h 或者将C文件C化 例如cstdio 前面加c没有.h 名字空间 划分逻辑单元。避免名字冲突 创建…

JWT 实现登录认证 + Token 自动续期方案

前言 过去这段时间主要负责了项目中的用户管理模块,用户管理模块会涉及到加密及认证流程。今天就来讲讲认证功能的技术选型及实现。技术上没啥难度当然也没啥挑战,但是对一个原先没写过认证功能的菜鸡来说也是一种锻炼吧。 技术选型 要实现认证功能&a…

【短篇】函数重载

函数重载 重载使用规则 重载 函数重载也是CPP相较于C的一个优化内容。 在C中我们都知道函数名不能重名 当然这个错误对于我还有类似我这种只学过C的人来说,这个错误是显得多么理所当然。 但是在Cpp中,则对这个功能进行了优化 看到这就有人问了&#x…

我去蔚来试驾了

前面写了比亚迪汉、小鹏P7i的试驾体验,链接如下: 小鹏P7I试驾体验! 今天接着分享蔚来ET5的试驾体验,实话实说,我是蔚来ET5的颜粉,颜值也是ET5最大的卖点之一。 我身边不少朋友,不管是男生还是女…

windows下使用vite搭建vue开发环境

windows下使用vite搭建vue开发环境 1 下载安装配置NodeJS1.1 下载1.2 安装1.3 配置1.4 npm镜像加速配置1.6 设置环境变量 2 Vite安装 1 下载安装配置NodeJS 1.1 下载 下载地址:https://nodejs.cn/download 到NodeJS官网,选择Windows安装包即可。 1.2…

网络协议-UDP vs TCP, HTTP2.0和3.0

目录 TCP vs UDP Internet协议群(TCP/IP协议群) 传输层和网络层 User Data Diagram(UDP) 连接 重发(校验) UDP不保证顺序 思考:看了上面的几点,UDP没有虚拟连接、不校验数据、…

Vue ElementUI Axios 前后端案例(day01) 之Vue

前言js 问js是什么,他有什么作用,与html和css的区别是什么 JavaScript(简称JS)是一种脚本语言,用于在网页上实现交互效果、动态效果和动态数据更新等功能。它是一种解释性语言,需要在浏览器中解释和执行。…

【Paper Note】Swin Transformer: Hierarchical ViT using Shifted Windows

Swin Transformer: Hierarchical ViT using Shifted Windows 概述核心思想整体结构名词解释与vit区别 模型处理过程概括Patch EmbeddingBasicLayerPatch MergingSwin Transform BlockWindow AttentionShifted Window Attention小结 模型使用及代码模型使用环境配置SwinT 代码Pa…

跨境卖家都要知道的:对话式销售

买家可以用他们的指纹登录大多数东西,并通过与它交谈来管理他们的日历。这些人不会填写一份表格,如果他们填写的字段越多,表格的长度就会越长。如果他们知道只会受到骚扰,他们当然不会下载某些东西。 相反,他们更喜欢…

[Linux系统]系统安全及应用一

系统安全及应用一、账号安全基本措施1.1系统账号清理1.1.1将非登录用户的shell设为/sbin/nologin1.1.2锁定长期不使用的账号1.1.3删除无用的账号1.1.4锁定账号文件文件chattr1.1.5查看文件校验和md5sum1.2密码安全控制1.2.1设置密码有效期1.3历史命令限制1.3.1 减少记录命令的条…

5GHz无线局域网系统模拟

移动电视双天线分集接收技术 随着DVB-T在手机电视、车载电视、楼宇电视、地铁电视等户外广播领域内的发展,在这些接收范围内,多径衰落、多普勒频移等小范围衰落是不可避免的问题,解决这些衰落和干扰成为倍受关注的问题。为了解决衰落&#x…

rk3568 点亮LCD (BT656 BT1120)

rk3568 适配 BT656/BT1120 BT.656 TX 和 BT.1120 TX,是一种并行输出接口,而 Camera 对应的是 BT.656 RX和 BT.1120 RX,是一种并行输入接口,两则在协议上是一致的。与同为并口的RGB非常像,在rk3568 芯片上RGB和BT656/B…

【jenkins】Jenkins连接 Gitlab实现 push代码自动构建

目录 一、安装插件 二、构建任务 三、为任务配置触发器 四、到gitlab进行设置webhooks 4.1 设置网络 4.2 到jenkins对应项目的源码库 4.3 测试 4.3.1 点击测试--标签推送事件 4.3.2 点击编辑 一、安装插件 持续部署的第一步需要检查是否安装gitlab插件: gitla…

Doris(9):删除数据(Delete)

Delete不同于其他导入方式,它是一个同步过程。和Insert into相似,所有的Delete操作在Doris中是一个独立的导入作业,一般Delete语句需要指定表和分区以及删除的条件来筛选要删除的数据。 Doris 目前可以通过两种方式删除数据: DE…

记录-JavaScript常规加密技术

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 当今Web开发中,数据安全是一个至关重要的问题,为了确保数据的安全性,我们需要使用加密技术。JavaScript作为一种客户端编程语言,可以很好地为数据进行加…