iOS 可观测实践有哪些?好文拿走不谢

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
云拨测,每月3000次拨测额度
简介: ios可观测实践

前置条件

账号注册

前往官方网站 观测云 - 云时代的系统可观测平台 注册账号,使用已注册的账号/密码登录。

image.png

安装 Datakit

获取命令

点击 [集成] 模块,右上角 [快速获取 DataKit 安装命令],根据您的操作系统和系统类型选择合适的安装命令。

image.png

执行安装

复制 Datakit 安装命令在需要被监控的服务器上直接运行。

  • 安装目录 /usr/local/datakit/
  • 日志目录 /var/log/datakit/
  • 主配置文件 /usr/local/datakit/conf.d/datakit.conf
  • 插件配置目录 /usr/local/datakit/conf.d/


Datakit 安装完成后,已经默认开启 Linux 主机常用插件,可以在DF——基础设施——内置视图查看。

image.png

点击 [基础设施] 模块,查看所有已安装 Datakit 的主机列表以及基础信息,如主机名,CPU,内存等。

image.png

点击 [主机名] 可以查看该主机的详细系统信息,集成运行情况 (该主机所有已安装的插件),内置视图(主机)。

image.png

点击 [集成运行情况] 任意插件名称 [查看监控视图] 可以看到该插件的内置视图。

image.png

创建一个iOS应用

登录 观测云 控制台,进入「应用监测」页面,点击右上角「新建应用」,在新窗口输入「应用名称」,点击「创建」,即可开始配置。

image.png

应用采集数据属性说明

数据类型

观测云的用户访问监测包括六种数据类型。

image.png

默认属性

默认属性为全局属性,用户访问监测的场景构建和事件告警都可以通过下面的默认属性进行查询。

SDK属性

image.png

应用属性

image.png

用户 & 会话属性image.png

设备 & 分辨率属性

image.png

地理 & 网络属性

image.png

View 属性

image.png

Action 属性

image.png

用户属性

除了默认属性以外,还可以通过用户属性构建场景和配置事件告警。用户属性是非全局属性,通过用户属性,可以跟踪用户访问应用的整个过程,定位和发现用户受影响的访问情况,监控用户访问性能。

其他数据类型属性

Session

统计指标

image.png

属性

image.png

View

指标

image.png

统计指标

image.png

Resource

指标

image.png属性

image.png

Error

属性

image.png

type=network时,新增以下Network Error属性。

image.png

Long Task

指标

image.png

Action

指标

image.png

统计指标

image.png

应用集成

集成方式

方式一:CocoaPods 集成(推荐)

版本说明 image.png

  1. 配置 Podfile 文件。
1. target 'yourProjectName' do
2. 
3. # Pods for your project
4.  pod 'FTMobileSDK', '~> 1.1.0-alpha.10'
5. 
6. end

Podfile 目录下执行 pod install 安装 SDK

方式二:手动集成(直接下载 SDK)

  1. GitHub 获取 SDK 的源代码。
  2. FTMobileSDK 整个文件夹导入项目。

image.png

勾选 Copy items id needed

image.png

3.  添加依赖库:项目设置 Build Phase -> Link Binary With Libraries 添加:UIKitFoundationlibz.tb

初始化并调用SDK

添加头文件

请将 #import "FTMobileAgent.h" 添加到 AppDelegate.m 引用头文件的位置。

添加初始化代码

示例:

#import <FTMobileAgent/FTMobileAgent.h>
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
     // SDK FTMobileConfig 设置
    FTMobileConfig *config = [[FTMobileConfig alloc]initWithMetricsUrl:@"Your App metricsUrl"];
    config.monitorInfoType = FTMonitorInfoTypeAll;
     //启动 SDK
    [FTMobileAgent startWithConfigOptions:config];
    return YES;
}

metricsUrl 数据上报地址:

出于安全考虑,DataKit 的 HTTP 服务默认绑定在 localhost:9529 上,如果希望从外部访问,需编辑 /usr/local/datakit/conf.d/datakit.conf 中的 http_listen 字段,将其改成 0.0.0.0:9529或其它网卡、端口。

举例:比如我公网ip是1.1.1.1 我先到配置中改0.0.0.0,app中metricsUrl地址为 http://1.1.1.1:9529

FTMobileConfig

可配置参数

image.png

配置 app_id 开启 RUM

  1. 设置 appid

注意: 设置 appid 后,RUM 才能开启。

2.  RUM 设置采集率

1. /**
2.  * 采样配置,属性值:0或者100,100则表示百分百采集,不做数据样本压缩。默认:100
3.  */
4. @property (nonatomic, assign) int samplerate;

注意: 开启 RUM 后,日志中将不采集 Crash 信息,Crash 信息会采集到 RUM中。

 3.  RUM 设置是否追踪用户操作

/**
 * 设置是否追踪用户操作,目前支持应用启动和点击操作
 */
@property (nonatomic, assign) BOOL enableTraceUserAction;

设置日志相关

  • source 日志来源
/**
 * 日志的来源 默认为:ft_mobile_sdk_ios
 */
 @property (nonatomic, copy) NSString *source;
  • serviceName  日志所属业务或服务的名称
1. /**
2.  * 设置日志所属业务或服务的名称
3.  */
4. @property (nonatomic, copy) NSString *serviceName;

  • traceConsoleLog 采集控制台日志

一般情况下, 因为 NSLog 的输出会消耗系统资源,而且输出的数据也可能会暴露出App里的保密数据, 所以在发布正式版时会把这些输出全部屏蔽掉。此时开启采集控制台日志,也并不能抓取到工程里打印的日志。建议使用 日志写入接口 来上传想查看的日志。

/**
 *设置是否需要采集控制台日志 默认为NO
 */
 @property (nonatomic, assign) BOOL traceConsoleLog

设置网络链路追踪

  • networkTrace 设置网络追踪,开启网络请求信息采集
/**
 * 设置网络请求信息采集 默认为NO
 */
 @property (nonatomic, assign) BOOL networkTrace;
  • networkTraceType 设置网络请求信息采集时 使用链路追踪类型
/**
 *  设置网络请求信息采集时 使用链路追踪类型 type 默认为 Zipkin 
 *  FTNetworkTrackTypeZipkin 、FTNetworkTrackTypeJaeger 
 */
 @property (nonatomic, assign) FTNetworkTrackType networkTraceType;
/**
 *  开启网络请求信息采集 并设置链路追踪类型 type 默认为 Zipkin
 *  @param  type   链路追踪类型 默认为 Zipkin
 */
-(void)networkTraceWithTraceType:(FTNetworkTrackType)type;

开启崩溃 Crash 采集

enableTrackAppCrash 采集崩溃日志 (崩溃分析

/**
 *设置是否需要采集崩溃日志 默认为NO
 */
 @property (nonatomic, assign) BOOL enableTrackAppCrash;

注意: 开启 RUM 后,日志中将不采集 Crash 信息,Crash 信息会采集到 RUM 中。

SDK 内部 DebugLog 打印

debug 环境下,设置 FTMobileConfigenableSDKDebugLog 属性。

config.enableSDKDebugLog = YES; //打印日志

设置 X-Datakit-UUID

X-Datakit-UUID 是 SDK 初始化生成的 UUID, 应用清理缓存后(包括应用删除),会重新生成。

FTMobileConfig 配置中,开发者可以强制更改。更改方法:

[config setXDataKitUUID:@"YOUR UUID"];

设置 env 环境

typedef NS_ENUM(NSInteger, FTEnv) {
    FTEnvProd         = 0, //线上环境
    FTEnvGray,             //灰度环境
    FTEnvPre,              //预发布环境
    FTEnvCommon,           //日常环境
    FTEnvLocal,            //本地环境
};
@property (nonatomic, assign) FTEnv env;

采集数据配置

配置 FTMobileConfigFTMonitorInfoType 属性。可采集的类型如下

/**
 *
 * @constant
 *  FTMonitorInfoTypeBattery  - 电池电量
 *  FTMonitorInfoTypeMemory   - 内存总量、内存使用率
 *  FTMonitorInfoTypeCpu      - CPU使用率
 */
typedef NS_OPTIONS(NSUInteger, FTMonitorInfoType) {
    FTMonitorInfoTypeAll          = 0xFFFFFFFF,
    FTMonitorInfoTypeBattery      = 1 << 1,
    FTMonitorInfoTypeMemory       = 1 << 2,
    FTMonitorInfoTypeCpu          = 1 << 3,
};

设置 UI 卡顿、ANR 事件采集

  • enableTrackAppUIBlock 采集UI卡顿事件
/**
 * 默认为NO
 * 设置是否需要采集卡顿
 */
 @property (nonatomic, assign) BOOL enableTrackAppFreeze;
  • enableTrackAppANR  采集ANR卡顿无响应事件
/**
 * 默认为NO
 * 设置是否需要采集卡顿无响应事件
 */
 @property (nonatomic, assign) BOOL enableTrackAppANR;

采集的数据会上传到 RUM 与日志中。

主动上报日志方法

上传机制 : 将数据存储到数据库中,等待时机进行上传。数据库存储量限制在 5000 条,如果网络异常等原因导致数据堆积,存储 5000 条后,会丢弃新传入的数据。

  • 上传日志方法
typedef NS_ENUM(NSInteger, FTStatus) {
    FTStatusInfo         = 0,
    FTStatusWarning,
    FTStatusError,
    FTStatusCritical,
    FTStatusOk,
};
/**
 * 日志上报
 * @param content  日志内容,可为json字符串
 * @param status   事件等级和状态,info:提示,warning:警告,error:错误,critical:严重,ok:恢复,默认:info
 */
-(void)logging:(NSString *)content status:(FTStatus)status;
  • 方法使用示例
[[FTMobileAgent sharedInstance] logging:@"TestLoggingBackground" status:FTStatusInfo];

用户的绑定与注销

用户绑定

/**
 * 绑定用户信息
 * @param Id       用户Id
 */
- (void)bindUserWithUserID:(NSString *)Id;

用户注销

/**
 * 注销当前用户
 */
- (void)logout;

方法使用示例

1. //登录后 绑定用户信息
2. [[FTMobileAgent sharedInstance] bindUserWithUserID:userId];
1. //登出后 注销当前用户
2. [[FTMobileAgent sharedInstance] logout];

常见问题

关于崩溃日志分析

在开发时的 Debug 和 Release 模式下, Crash 时捕获的线程回溯是被符号化的。

而发布包没带符号表,异常线程的关键回溯,会显示镜像的名字,不会转化为有效的代码符号,获取到的 crash log 中的相关信息都是 16 进制的内存地址,并不能定位崩溃的代码,所以需要将 16 进制的内存地址解析为对应的类及方法。

利用命令行工具解析 Crash

需要的文件:

  1. 需要从 观测云 下载 SDK 采集上传的崩溃日志。下载后将后缀改为 .crash。
  2. 需要 App 打包时产生的 dSYM 文件,必须使用当前应用打包的电脑所生成的 dSYM 文件,其他电脑生成的文件可能会导致分析不准确的问题,因此每次发包后建议根据应用的 版本号 或 dSYM 文件的 UUID 来对应保存 dSYM 文件。以备解析时,根据后台日志 tag 中的 application_UUID 对应的 UUID 来找到对应 dSYM 文件。
  3. 需要使用 symbolicatecrash,Xcode 自带的崩溃分析工具,使用这个工具可以更精确的定位崩溃所在的位置,将0x开头的地址替换为响应的代码和具体行数。


查找 symbolicatecrash 方法

终端输入

find /Applications/Xcode.app -name symbolicatecrash -type f

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

进行解析:

  1. 将 symbolicatecrash 与 .crash 和 .app.dSYM 放在同一文件夹中
  2. 开启命令行工具,进入文件夹
  3. 使用命令解析 Crash 文件,*号指的是具体的文件名
./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash
  1. 解析完成后会生成一个新的 .Crash 文件,这个文件中就是崩溃详细信息。

CocoaPods安装

1:pod install 出错,如下图

image.png

解决方案:请使用 pod update 命令

2:pod update 出错,如下图

image.png

解决方案: github 链接问题,加个 vpn,或者使用 pod update 命令 再次尝试

image.png

目录
相关文章
|
4月前
|
安全 开发工具 Swift
ios-class-guard - iOS代码混淆与加固实践
ios-class-guard - iOS代码混淆与加固实践
52 0
|
5月前
|
安全 开发工具 Swift
 ios-class-guard - iOS代码混淆与加固实践
然后在作者的回答中也有提到,PreEmptive Protection for iOS - Rename (or PPiOS-Rename),使用相同的原理,但是它将使用 iPhoneSimulator 支持 iPhoneOS SDK,但是经测试,该工具只能用于纯 OC 项目,并不支持 OC 与 Swift 混编的项目
|
Ubuntu 物联网 编译器
iOS编译openssl实践
之前建设的跨平台全链路智能语音交互系统一直只跑在Android系统(主要是Iot设备),没有iOS业务场景,最近经过不断的努力,终于要把这个能力推广到B端APP,面向B端用户,这个时候就有了iOS的述求,毕竟从能力建设之初就吹出去了,系统是跨平台的,这个时候不能掉链子。
468 0
|
iOS开发
《移动 App 性能监测实践(iOS篇)》电子版地址
移动 App 性能监测实践(iOS篇)
130 0
《移动 App 性能监测实践(iOS篇)》电子版地址
|
Ubuntu 网络协议 Linux
开源云真机平台Sonic(Windows端)接入iOS设备实践
开源云真机平台Sonic(Windows端)接入iOS设备实践过程,及相关注意事项。
开源云真机平台Sonic(Windows端)接入iOS设备实践
|
JSON 搜索推荐 API
盒马 iOS Live Activity &“灵动岛”配送场景实践
盒马 iOS Live Activity &“灵动岛”配送场景实践
2459 0
盒马 iOS Live Activity &“灵动岛”配送场景实践
|
存储 jenkins 测试技术
iOS UI 自动化测试原理以及在 Trip.com 的应用实践
笔者入职 Trip.com 已满一年,回顾这一年的工作历程,约一半的时间都在做 UI 自动化测试相关内容。从而,笔者更深入地研究了 iOS 平台下的自动化测试技术,目前也在负责部门 App 自动化测试平台的搭建和维护。故想借这篇文章一并将所踩过的坑以及学习到的技术,系统且全面地整理出分享给大家。
335 0
|
数据采集 测试技术 Android开发
【精准测试】iOS 代码覆盖率数据采集自动化实践
《简单两步实现 Jacoco+Android 代码覆盖率的接入!(最新最全版)》介绍了如何实现Android端的代码覆盖率接入,基于同样的背景我们也需要实现iOS端的代码覆盖率数据采集。
902 0
【精准测试】iOS 代码覆盖率数据采集自动化实践
|
JavaScript 安全 Java
iOS 自动化测试踩坑(一): 技术方案、环境配置与落地实践
iOS 自动化测试踩坑(一): 技术方案、环境配置与落地实践
|
安全 JavaScript Java
iOS 自动化测试踩坑(一): 技术方案、环境配置与落地实践
![](https://ceshiren.com/uploads/default/original/3X/a/b/ab23a3dcb65fef3da08dc551542b62f03abfb07e.jpeg) 移动端的自动化测试,最常见的是 Android 自动化测试,我个人觉得 Android 的测试优先级会更高,也更开放,更容易测试;而 iOS 相较于 Android 要安全稳定的多,但也