iOS APM
适用于 iOS 的 Site24x7 Mobile APM 可让您跟踪本地移动应用程序在实际最终用户设备上的性能。例如,新闻阅读器应用程序可能在内部执行以下操作:
- 导航到表格视图以显示文章列表
- 使用 REST API 调用加载文章列表
- 在 SQLite 数据库中缓存文章列表
- 下载每篇文章的缩略图
- 将缩略图缓存到文件系统
- 构建复杂的 UI,例如自定义表格视图单元格样式
以上所有操作都可能是影响用户体验的长期操作,因此在各种设备上对它们进行基准测试和优化非常重要。Site24x7 Mobile APM 通过将 APM 代理以库的形式嵌入到您的应用程序中,收集和聚合来自全球所有用户的指标。
APM 代理使用事务和组件监测代码的执行时间。在前面的示例中,从开始导航到呈现最终 UI 的整个操作序列都可以视为一个事务。单个操作可以分为不同的组件类型,例如 HTTP、SQLite、文件系统、UI 等。简单的操作可以仅使用事务来衡量,而复杂的操作可以使用带有组件的事务来衡量。
了解关于:
如何添加Mobile APM?
- 登录到 Site24x7 并转到 APM 选项卡下的 iOS 部分。
- 单击添加应用程序按钮。
- 输入应用程序名称和 Apdex 阈值,然后单击保存。
- 您可以通过在应用程序屏幕中单击应用程序名称附近的图标来复制应用程序密钥。
通过cocopods (for Swift)安装Mobile APM via
步骤1:
将 Mobile APM iOS SDK 添加到您的 podfile。
target 'Your_Project_Name' do
use_frameworks!
pod 'Site24x7APM', '0.0.1'
end
第2步:
在终端中运行以下命令
第 3 步:
在构建设置中使用dysm文件将调试信息格式设置为DWARF。
第4步:
初始化您的 SDK 并构建您的项目。
import APMClick to copy
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
S24APM.start(withAppKey:"App_Key", interval: 15);
return true;
}
}
开始事务
您通常应该在长时间运行的操作之前启动事务,并在操作完成时停止它。事务是线程安全的,可以从不同的线程启动和停止。一个事务对象只能启动和停止一次。具有相同名称的事务在整个应用程序中平均。因此,当使用相同的事务名称多次执行相同的操作时,会记录平均执行时间。
使用组件对事务中的操作进行分组?
您可以将事务中的操作分组到不同类型的组件中。您可以使用其中一种预定义类型,例如 S24HttpComponent.TYPE_HTTP、Component.TYPE_SQLITE、Component.TYPE_UI 等,或者指定您自己的类型。组件是线程安全的,可以从不同的线程启动和停止。一个组件对象只能启动和停止一次。组件对象在其父事务已停止后无法停止。事务中的多个组件可以重叠并并行运行。事务中具有相同名称的组件被平均。
在上面的示例中,HTTP 操作(下载文章和缩略图)所用的总时间由 S24HttpComponent 测量,而仅文章所用的时间由“下载文章”测量。每个缩略图花费的时间由“下载缩略图”平均并记录,因为它在一个循环中执行多次。
Flush数据?
有时需要手动将最近记录的数据刷新到 Site24x7 的服务器。如果您在申请终止之前记录事务,您可能需要这样做。如果您设置了较大的上传间隔(默认值为 60 秒),您应该在适当的时候手动刷新数据,以防应用程序在下一个上传间隔之前终止。
[S24APM flush]
查看数据
- 登录到您的 Site24x7 帐户 > APM > iOS 并单击您的应用程序。
- 仪表板列出了您的所有移动应用程序及其状态:启动、关闭、严重或故障。
- 此处还列出了已暂停或存在配置错误的应用程序。
- 对于活动应用程序,仪表板中列出了以下指标:
- 与前一个时间段相比,所选时间段的响应时间和吞吐量
- 所选时间段内的崩溃
- 所选时间段的 Apdex 分数和用户数
指标和推论
当您在移动应用程序中检测 APM Insight API 时,可以查看有关您的应用程序的以下指标:
1.全球汇总报表
全球摘要报表显示您的应用程序在所选时间段内在所有地区的性能。颜色代码基于 Apdex 分数,范围从 0 到 1,0 表示令人沮丧的用户体验,1 表示满意的用户体验。您可以将鼠标悬停在地图上的单个区域上以查看该特定位置的 Apdex 分数、平均响应时间、吞吐量和错误。
2.应用程序的响应时间和吞吐量
可以从“管理”选项卡查看所选时间段内应用程序的总响应时间和吞吐量。
3.响应时间按地理位置、运营商、设备和操作系统版本划分
您的应用程序响应时间可能会受到应用程序代码以外的各种原因的影响。
比较跨地域、设备和操作系统版本的应用响应时间将帮助您缩小问题范围。
可以在“地理”选项卡下查看按地理和运营商的响应时间。
可以在“设备类型”选项卡下查看各种设备和操作系统版本的响应时间。
4.事务的响应时间
单个事务的响应时间、吞吐量和计数(调用事务的次数)可以在事务选项卡下查看。
5.崩溃分析
您可以通过单击崩溃分析选项卡查看所选时间段内的崩溃次数。您可以将鼠标悬停在顶部的堆叠图表上,以查看各种设备上的崩溃数量、问题数量以及受此崩溃影响的用户数量。中间带向您显示崩溃的百分比变化 - 崩溃总数的增加或减少以及无崩溃用户的数量。
崩溃摘要列出了例外情况。您可以单击异常以查找确切的错误行。
配置告警
通过配置告警,在您的应用程序响应时间超过指定阈值水平时获得通知。
您可以根据严重性级别将告警设置为故障或严重。
请按照以下步骤配置告警:
您可以调整通知配置文件中的设置,以决定当您的应用程序关闭时何时接收告警。此外,您还可以配置用户告警组- 这使您可以决定谁应该在触发时接收告警。
自定义APIs
自定义 API 用于设置用户 ID 的动态值、跟踪自定义事件、捕获屏幕等。本文档将解释 Site24x7 中可用的各种类型的自定义 API 以及使用它们的语法。
可用的 API:
1、初始化SDK
您可以使用下面的 API 以自定义上传间隔初始化 SDK。默认情况下,数据上传间隔设置为 60 秒。
Objective-C 的语法:
/**
* Initializes the APM agent.
* @param {NSString*} appKey
* The application key.
* @param {NSUInteger} intervel
* The interval in seconds at which to upload data to the server. The default is 60 seconds.
*/
[S24APM startWithAppKey:@"App_Key" interval:30]
Swift 的语法:
/**
* Initializes the APM agent.
* @param {String} appKey
* The application key.
* @param {int} intervel
* The interval in seconds at which to upload data to the server. The default is 60 seconds.
*/
S24APM.start(withAppKey:"App_Key", interval: 15);
2. 自定义用户 ID
默认情况下,SDK 会生成一个唯一的用户 ID。如果要自定义用户 ID,可以通过实现以下语法来实现。当您想要跟踪特定于特定用户的指标或调试问题时,这会派上用场。
Objective-C 的语法:
*@param {NSString*} userId
*/
[S24APM setUserId:@"user@example.com" ]
Swift 的语法:
/**
*@param {String} userId
*/
S24APM.setUserId("user@zylker.com")
3. 事务
您可以使用下面的 API 来跟踪具有特定于应用程序时间的自定义事件。
Objective-C语法:
/**
*Transaction (can contain multiple components)
*@param {NSString*} transactionName
*Component
*@param {NSString*} transactionName
*@param {NSString*} componentName
*/
S24Transaction *transaction = [S24APM startTransactionWithName:@"List Articles"];
S24Component *httpComponent = [transaction startComponentWithType:S24HttpComponent];
S24Component *articlesComponent = [transaction startComponentWithType:@"Download Articles"];
// Download articles
[transaction stopComponent:articlesComponent];
for (Article *article in articles) {
S24Component *thumbnailComponent = [transaction startComponentWithType:@"Download Thumbnail"];
// Download thumbnail
[transaction stopComponent:thumbnailComponent];
}
[transaction stopComponent:httpComponent];
[S24APM stopTransaction:transaction];
Swift 的语法:
/**
*Transaction (can contain multiple components)
*@param {String} transactionName
*Component
*@param {String} transactionName
*@param {String} componentName
*/
S24Transaction *transaction = [S24APM startTransactionWithName:@"List Articles"];
S24Component *httpComponent = [transaction startComponentWithType:S24HttpComponent];
S24Component *articlesComponent = [transaction startComponentWithType:@"Download Articles"];
// Download articles
[transaction stopComponent:articlesComponent];
for (Article *article in articles) {
S24Component *thumbnailComponent = [transaction startComponentWithType:@"Download Thumbnail"];
// Download thumbnail
[transaction stopComponent:thumbnailComponent];
}
[transaction stopComponent:httpComponent];
[S24APM stopTransaction:transaction];
4. HTTP 调用
默认情况下,会自动捕获使用以下网络库的网络请求。
- NSUrlSession
- NSUrlConnection
如果您想添加更多 HTTP 调用,请使用下面的 API。
Objective-C的语法:
Objective-C
/***@param {NSString*} name
*@param {NSUInteger} duration measured in millis
*@param {NSString*} startTime
*@param {NSUInteger} respCode
*@paramt {NSString*} httpMethod
*/
[S24APM addHttpCall:@"example.com" withTime:60 startTime:@"1642750130310" respCode:200 httpMethod:@"GET"]
Swift 的语法:
/**
*@param {String} name
*@param {int} duration measured in millis
*@param {String} startTime
*@param {int} respCode
*@paramt {String} httpMethod
*/
S24APM.addHttpCall("example.com", withTime:60, startTime: "1642750130310", respCode: 200, httpMethod: "GET");
5. 屏幕
默认情况下,所有屏幕都被捕获;但是,如果您想添加缺少的屏幕,请使用下面给出的 API。
Objective-C的语法:
/**
*@param {NSString*} screen
*@param {NSUInteger} duration measured in millis
*@param {NSString*} startTime
*/
[S24APM addScreen:@"DetailScreen" withTime:60 startTime:@"1642750130310"]
Swift 的语法:
/**
*@param {String} screen
*@param {int} duration measured in millis
*@param {String} startTime
*/
S24APM.addScreen("DetailScreen", withTime: 60, startTime: "1642750130310");
6. 环境
您可以使用下面的 API 设置自定义环境详细信息,以便在各种环境设置(如开发、调试、生产或发布)中过滤数据。
Objective-C的语法:
/**
*@param {NSString*} environment
Custom environment types like debug, release, or beta release.
*/
[S24APM setEnvironment:@"release"]
Swift 的语法:
/**
*@param {String} environment
Custom environment types like debug, release, beta-release, etc.
*/
S24APM.setEnvironment("release");
7. Flush
您可以使用下面的 API 立即将记录的数据上传到服务器,而不是等待下一个上传间隔。默认情况下,刷新间隔设置为 60 秒。
Objective-C的语法:
[S24APM flush]
Swift 的语法:
S24APM.flush()
如果没有可用的网络,数据将保留在队列中,直到下一个上传间隔。如果您配置了较长的上传间隔,您可能需要在您的活动或服务被销毁时手动刷新数据。
8. 排除 HTTP 调用
您可以通过将 URL 列表作为参数传递给下面的 API 来从跟踪中排除自定义 URL。
Objective-C的语法:
/**
@param {NSArray<NSString *> *} listOfUrls
*/
[S24APM enableHttpTracking:@[@"example.com"]]
Swift 的语法:
/**
@param {var} listOfUrls
*/
S24APM.enableHttpTracking(["example.com"]);
9.排除屏幕
您可以通过将屏幕列表作为参数传递给下面的 API 来从跟踪中排除自定义屏幕。
Objective-C的语法:
/**
@param {NSArray<NSString *> *} listOfScreens
*/
[S24APM ignoreScreens:@["DetailScreen"]]
Swift 的语法:
/**
@param {var} listOfScreens
*/
S24APM.ignoreScreens(["DetailScreen"]);
发行说明
版本 2.1.0
2022 年 5 月 20 日
新功能:
- 用于使用应用密钥和上传间隔监控应用程序的新 API 。
增强:
- 增强的 Crashlytics 支持。
版本 2.0.4
2022 年 3 月 4 日
增强:
- 支持基于 Swift 的 iOS 应用程序中的HTTP 调用。
版本 2.0.3
2022 年 1 月 19 日
问题修复:
- 修正了一些小错误。
版本 2.0.2
2022 年 1 月 12 日
增强功能:
- 对于每个上传间隔时间,都会捕获最新的 20 个屏幕和 HTTP 调用。
- 推出XCFrameworks,支持模拟器和真机。
- 用于配置自定义环境的 API 。
2.0.1 版
2022 年 1 月 11 日
问题修复:
- “在后台线程上调用了 UI API”问题已得到解决。
版本 2.0.0
2021 年 6 月 4 日
增强功能:
- 支持使用请求方法、响应时间、吞吐量、状态代码、平台和屏幕跟踪 HTTP 调用。
- 支持根据响应时间、吞吐量和计数跟踪屏幕。
- 支持自动跟踪视图和导航。
- 支持手动跟踪视图。
- 启用用户会话跟踪,会话超时为 60 分钟。
- 支持手动添加用户 ID。
- 支持跟踪以下包的所有 HTTP 调用:
- NSURLSession 方法
- dataTaskWithURL
- dataTaskWithURL completionHandler
- dataTaskWithRequest
- dataTaskWithRequest completionHandler
- downloadTaskWithURL
- downloadTaskWithURL completionHandler
- downloadTaskWithRequest
- downloadTaskWithRequest completionHandler
- uploadTaskWithRequest fromData
- uploadTaskWithRequest fromData completionHandler
- uploadTaskWithRequest fromFile
- uploadTaskWithRequest fromFile completionHandler
- NSURLConnection 方法
- sendAsynchronousRequest 队列完成
处理程序 - dataTaskWithURL 完成处理程序
- NSURLSession 方法
- 支持手动添加任何其他 HTTP 调用。