适用于 Android 的移动 APM
适用于 Android 的 Site24x7 Mobile APM 可让您跟踪本地移动应用程序在实际最终用户设备上的性能。例如,新闻阅读器应用程序可能在内部执行以下操作:
- 启动活动以显示文章列表
- 使用 REST API 调用加载文章列表
- 在 SQLite 数据库中缓存文章列表
- 下载每篇文章的缩略图
- 将缩略图缓存到文件系统
- 构建复杂的 UI,例如自定义列表视图布局
以上所有操作都可能是影响用户体验的长期操作,因此在各种设备上对它们进行基准测试和优化非常重要。Site24x7 Mobile APM 通过将 APM 代理以库的形式嵌入到您的应用程序中,收集和聚合来自全球所有用户的指标。
APM 代理使用事务和组件监测代码的执行时间。在前面的示例中,从启动 Activity 到呈现最终 UI 的整个操作序列都可以视为一个事务。单个操作可以分为不同的组件类型,例如 HTTP、SQLite、文件系统、UI 等。简单的操作可以仅使用事务来衡量,而复杂的操作可以使用带有组件的事务来衡量。
添加Mobile APM?
添加移动 APM
- 登录到 Site24x7 并转到APM选项卡下的Android OS部分。
- 单击添加应用程序按钮。
- 输入应用程序名称和Apdex 阈值,然后单击保存。
- 通过单击应用程序屏幕中应用程序名称附近的图标来复制您的应用程序密钥。
在您的本机应用程序中检测和初始化 Mobile APM
用法
首先登录到 Site24x7 网站并创建一个新的 Mobile APM 应用程序。您将获得一个应用程序密钥和一个下载 库文件的链接。您的应用程序的所有版本都必须使用相同的应用程序密钥。
- 步骤1
将 Mobile APM Android SDK 添加到应用级 build.gradle
repositories {
google()
jcenter()
maven { url 'https://maven.zohodl.com' }
}
dependencies {
// These docs use an open ended version so that our plugin
// can be updated quickly in response to Android tooling updates
classpath 'com.zoho.site24x7:mobileapm-analytics-plugin:1.0'
}
}
apply plugin: 'com.android.application'
apply plugin: 'zanalytics-plugin'
repositories {
google()
jcenter()
maven { url 'https://maven.zohodl.com' }
}
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.newtestapplicaiton"
minSdkVersion 16
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
zanalytics {
debug {
apiToken =
"Your app key"
}
release {
apiToken =
"Your app key"
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v4:23.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
compile 'com.zoho.site24x7:mobileapm:1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
需要在应用级别 build.gradle 中添加突出显示的行以开始监控
- 步骤 2 APM 代理需要在 AndroidManifest.xml 中声明以下权限:
<uses-permissionandroid: name="android.permission.INTERNET"/>
<uses-permissionandroid: name="android.permission.ACCESS_NETWORK_STATE"/>
- 第 3 步
通过使用您之前获得的应用程序密钥在 Application 子类的 onCreate() 方法中调用 Apm.startMonitoring() 来初始化 APM 代理。默认情况下,APM 代理每 60 秒将数据上传到 Site24x7。如果需要,您可以自定义上传间隔。如果没有记录数据,APM 代理将不会进行不必要的网络连接,无论时间间隔如何。
import android.os.Bundle;
import com.site24x7.android.apm.Apm;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Apm.startMonitoring(getApplicationContext());
setContentView(R.layout.activity_main);
}
注意:执行一些事务以启动数据收集。
- 第 4 步:构建您的项目。
开始事务?
使用事务
通过调用 Apm.startTransaction()并为其提供名称来启动事务。您通常应该在长时间运行的操作之前启动事务,并在操作完成时停止它。事务是线程安全的,可以从不同的线程启动和停止。一个事务对象只能启动和停止一次。具有相同名称的事务在整个应用程序中平均。因此,当使用相同的事务名称多次执行相同的操作时,会记录平均执行时间。
private void listArticles() {
Transaction transaction = Apm. startTransaction ( "List Articles" );
// Perform long-running operation
Apm. stopTransaction ( transaction );
}
使用组件对事务中的操作进行分组?
使用组件
您可以通过调用Transaction.startComponent()并指定类型将事务中的操作分组到组件中。您可以使用其中一种预定义类型,例如Component.TYPE_HTTP、Component.TYPE_SQLITE、Component.TYPE_UI等,或者指定您自己的类型。组件是线程安全的,可以从不同的线程启动和停止。一个组件对象只能启动和停止一次。组件对象在其父事务已停止后无法停止。事务中的多个组件可以重叠并并行运行。事务中具有相同名称的组件被平均。
Component httpComponent = transaction .startComponent( Component.TYPE_HTTP );
Component articlesComponent = transaction .startComponent( "Download Articles" );
// Download articles
transaction .stopComponent( articlesComponent );
for (Article article in articles ) {
Component thumbnailComponent = transaction .startComponent( "Download Thumbnail" );
// Download thumbnail
transaction .stopComponent( thumbnailComponent );
}
transaction .stopComponent( httpComponent );
Apm. stopTransaction (transaction);
}
在上面的示例中,HTTP 操作(下载文章和缩略图)所花费的总时间由 Component.TYPE_HTTP衡量, 而仅文章所花费的时间由"Download Articles"衡量。每个缩略图花费的时间由“下载缩略图”平均并记录,因为它在一个循环中执行多次。
Flush数据?
刷新数据
有时需要 使用 Apm.flush()方法手动将最近记录的数据刷新到 Site24x7 的服务器。如果您在应用程序或活动被销毁之前记录事务,您可能希望这样做。如果您设置了较大的上传间隔(默认值为 60 秒),您应该在适当的时候手动刷新数据,以防应用程序在下一个上传间隔之前终止。
查看数据
- 登录到您的 Site24x7 帐户 > APM > Android 操作系统,然后单击您的应用程序。
- 仪表板列出了您的所有移动应用程序及其状态:启动、关闭、严重或故障。
- 此处还列出了已暂停或存在配置错误的应用程序。
- 对于活动应用程序,仪表板中列出了以下指标:
- 与前一个时间段相比,所选时间段的响应时间和吞吐量
- 所选时间段内的崩溃
- 所选时间段的 Apdex 分数和用户数
指标和推论
1.全球汇总报表
全球摘要报表显示您的应用程序在所选时间段内在所有地区的性能。颜色代码基于 Apdex 分数,范围从 0 到 1,0 表示令人沮丧的用户体验,1 表示满意的用户体验。您可以将鼠标悬停在地图上的单个区域上以查看该特定位置的 Apdex 分数、平均响应时间、吞吐量和错误。
2.应用程序的响应时间和吞吐量
可以从“管理”选项卡查看所选时间段内应用程序的总响应时间和吞吐量。
3.响应时间按地理位置、运营商、设备和操作系统版本划分
您的应用程序响应时间可能会受到应用程序代码以外的各种原因的影响。比较跨地域、设备和操作系统版本的应用响应时间将帮助您缩小问题范围
可以在“地理位置”选项卡下查看按地理位置和运营商的响应时间。
可以在“设备类型”选项卡下查看各种设备和操作系统版本的响应时间。
4.事务的响应时间
单个事务的响应时间、吞吐量和计数(调用事务的次数)可以在事务选项卡下查看。
5.崩溃分析
您可以通过单击崩溃分析选项卡查看所选时间段内的崩溃次数。您可以将鼠标悬停在顶部的堆叠图表上,以查看各种设备上的崩溃数量、
您可以单击异常以查找确切的错误行。
配置告警
配置告警
通过配置告警,在您的应用程序响应时间超过指定阈值水平时获得通知。
您可以根据严重性级别将告警设置为故障或严重。
请按照以下步骤配置告警:
- 登录到您的 Site24x7 帐户 > APM > Android。
- 选择您的应用程序 > 将鼠标悬停在图标上 > 编辑监视器详细信息。
- 在配置文件下,单击 (+) 以添加新的阈值和可用性配置文件。
- 在监视器类型中选择您的移动应用程序并为您的告警命名。
- 输入平均响应时间值 - 当您的应用程序响应时间超过此值时,您将收到告警。
- 点击保存
您可以调整通知配置文件中的设置,以决定当您的应用程序关闭时何时接收告警。此外,您还可以配置用户告警组- 这使您可以决定谁应该在触发时接收告警。
自定义 APIs
自定义 API 用于设置用户 ID 的动态值、跟踪自定义事件、捕获屏幕等。本文档将解释 Site24x7 中可用的各种类型的自定义 API 以及使用它们的语法。
可用的 API:
1. 初始化SDK
您可以使用下面的 API 以自定义上传间隔初始化 SDK。默认情况下,数据上传间隔设置为 60 秒。
语法:
* Initializes the APM agent.
* @param {Context} context
* The application context.
* @param {String} appKey
* The application key.
* @param {int} uploadIntervalSeconds
* The interval in seconds at which to upload data to the site24x7 servers. The default is 60 seconds.
* @throws MalformedURLException
* if {@code serverUrl} could not be parsed.
*/
Apm.startMonitoring(getApplicationContext(), "appKey", uploadInterval)
2. 自定义用户 ID
默认情况下,SDK 会生成一个唯一的用户 ID。如果要自定义用户 ID,可以通过实现以下语法来实现。当您想要跟踪特定于特定用户的指标或调试问题时,这会派上用场。
语法:
*@param {String} userId
*/
Apm.setUserId("user@zylker.com")
3. 事务
您可以使用下面的 API 来跟踪具有特定于应用程序时间的自定义事件。
语法:
*Transaction (can contain multiple components)
*@param {String} transactionName
*Component
*@param {String} transactionName
*@param {String} componentName
*/
Transaction transaction = Apm. startTransaction ( "List Articles" );
Component httpComponent = transaction .startComponent( Component.TYPE_HTTP );
Component articlesComponent = transaction .startComponent( "Download Articles" );
// Download articles
transaction .stopComponent( articlesComponent );
for (Article article in articles ) {
Component thumbnailComponent = transaction .startComponent( "Download Thumbnail" );
// Download thumbnail
transaction .stopComponent( thumbnailComponent );
}
transaction .stopComponent( httpComponent );
Apm. stopTransaction (transaction);
4. HTTP 调用
默认情况下,会自动捕获使用以下网络库的网络请求。
- java.net.HttpURLConnection
- javax.net.ssl.HttpsURLConnection
- OkHttpLibrary (will provide Interceptor)
语法:
*Introducing Site24x7LoggingInterceptor for tracking HTTP calls made using OkHttp Library or Retrofit.
*/
OkHttpClient client = new OkHttpClient.Builder()
.addNetworkInterceptor(new Site24x7LoggingInterceptor())
.build();
Using the request body:
Request request = new Request.Builder()
.url(url)
.build();ResponseBody body = client
.newCall(request)
.execute()
.body();Using Retrofit:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_API_URL)
.client(client)
.build();
如果您想添加更多 HTTP 调用,请使用下面的 API。
语法:
*@param {String} url
*@param {String} requestMethod
*@param {long} startTime
You can get it from System.currentTimeMillis()
*@param {long} loadTime
Measured in Millis
*@param {int} responseCode
*@param{String} screen
The screen in which the HTTP call is made.
*/
Apm.addHttpCalls("https://www.example.com", "GET", 1642743078700, 526, 200, "paymentscreen" )
5. 屏幕
默认情况下,所有屏幕都被捕获;但是,如果您想添加缺少的屏幕,请使用下面给出的 API。
语法:
*@param {String} screenName
*@param {String} orientation
*@param {long} loadTime measured in millis
*@param {long} startTime measured in millis
*/
Apm.addScreen("DetailScreen", "portrait", 50, 1642743078700)
6. 环境
您可以使用下面的 API 设置自定义环境详细信息,以便在各种环境设置(如开发、调试、生产或发布)中过滤数据。
语法:
*@param {String} environment
Custom environment types like debug, release, or beta release.
*/
Apm.setEnvironment("release")
7. Flush
您可以使用下面的 API 立即将记录的数据上传到服务器,而不是等待下一个上传间隔。默认情况下,刷新间隔设置为 60 秒。
语法:
如果没有可用的网络,数据将保留在队列中,直到下一个上传间隔。如果您配置了较长的上传间隔,您可能需要在您的活动或服务被销毁时手动刷新数据。
8. 排除 HTTP 调用
您可以通过将 URL 列表作为参数传递给下面的 API 来从跟踪中排除自定义 URL。
语法:
@param {Lis<String>} listOfUrls
*/
Apm.excludeHttpCalls( Arrays.asList("example.com") )
9. 排除屏幕
您可以通过将屏幕列表作为参数传递给下面的 API 来从跟踪中排除自定义屏幕。
语法:
@param {List<String>} listOfScreens
*/
Apm.excludeScreens( Arrays.asList("customScreenName") )
10. 片段支持
您可以使用以下代码行自动跟踪片段。
语法:
将上述行添加到 Launching Activity 的 onCreate 方法中。
*Enables fragment support for other activities
*/
Apm.enableFragmentSupport()
发行说明
版本 2.1.0
13-05-2022
问题修复:
- java.lang.IllegalStateException-“监控已开始”异常已解决。
- java.lang.ClassCastException - 捕获片段时发生的异常已解决。
新功能:
- 用于配置自定义环境的 API 。
- 用于启用对片段的支持的API 。
- 使用上下文、应用程序密钥和上传间隔开始监视的 API 。
- 使用 Site24x7LoggingInterceptor支持Retrofit 和 Okhttp 客户端。
增强:
- 增强的 Crashlytics 支持。
版本 2.0.0
04-06-2021
增强功能:
- 支持使用请求方法、响应时间、吞吐量、状态代码、平台和屏幕跟踪 HTTP 调用。
- 支持根据响应时间、吞吐量和计数跟踪屏幕。
- 支持自动跟踪视图和导航。
- 支持手动跟踪视图。
- 启用用户会话跟踪,会话超时为 60 分钟。
- 支持手动添加用户 ID。
- 支持跟踪以下包的所有 HTTP 调用:
- java.net.HttpURLConnection
- javax.net.ssl.HttpsURLConnection
- 支持手动添加任何其他 HTTP 调用。