RUM 配置¶
采样字段迁移(
ft-sdk >= 1.7.6):setSessionSamplingRate使用 0~100 的浮点百分比;旧setSamplingRate保留 0~1 单位,迁移时数值乘以 100。新字段仅在显式设置时优先,非法值会抛出异常且不改变之前的有效值。低于此版本继续使用旧方法;废弃不代表移除,旧方法仍保留原单位和行为。
RUM 初始化配置¶
FTSdk.initRUMWithConfig(
new FTRUMConfig()
.setRumAppId(RUM_APP_ID)
.setEnableTraceUserView(true)
.setDeviceMetricsMonitorType(DeviceMetricsMonitorType.ALL.getValue())
.setEnableTraceUserAction(true)
.setEnableTraceUserResource(true)
.setEnableTrackAppUIBlock(true)
.setEnableTrackAppCrash(true)
.setEnableTrackAppANR(true)
.setExtraMonitorTypeWithError(ErrorMonitorType.ALL.getValue())
);
FTSdk.initRUMWithConfig(
FTRUMConfig()
.setRumAppId(RUM_APP_ID)
.setEnableTraceUserView(true)
.setDeviceMetricsMonitorType(DeviceMetricsMonitorType.ALL.getValue())
.setEnableTraceUserAction(true)
.setEnableTraceUserResource(true)
.setEnableTrackAppUIBlock(true)
.setEnableTrackAppCrash(true)
.setEnableTrackAppANR(true)
.setExtraMonitorTypeWithError(ErrorMonitorType.ALL.getValue())
)
| 方法名 | 类型 | 必须 | 含义 |
|---|---|---|---|
| setRumAppId | String | 是 | 设置 RUM AppId。对应设置 RUM appid,才会开启 RUM 的采集功能,获取 appid 方法 |
| setSessionSamplingRate | Float | 否 | 采样百分比,范围 [0,100],默认 100;支持小数,例如 0.1 表示 0.1%。0 表示不采集,100 表示全采集。新字段显式设置后优先于旧字段,与设置顺序无关。 ft-sdk >= 1.7.6 支持。 |
| setSamplingRate | Float | 否 | 自 ft-sdk 1.7.6 起废弃,保留兼容。设置采集率,取值范围 [0,1],0 表示不采集,1 表示全采集,默认值为 1。作用域为同一 session_id 下所有 View、Action、LongTask、Error 数据 |
| setSessionOnErrorSamplingRate | float | 否 | 错误会话采样百分比,范围 [0,100],默认 0,支持小数。普通会话未采样且发生错误时,按此比例补采错误前 1 分钟范围数据;显式新字段优先于旧字段。 ft-sdk >= 1.7.6 支持。 |
| setSessionErrorSampleRate | Float | 否 | 自 ft-sdk 1.7.6 起废弃,保留 0~1 兼容。设置错误采集率。当会话未被 setSamplingRate 采样时,若会话期间发生错误,可以采集到错误前 1 分钟范围的数据。取值范围 [0,1],0 表示不采集,1 表示全采集,默认值为 0。作用域为同一 session_id 下所有 View、Action、LongTask、Error 数据,ft-sdk 1.6.11 以上支持 |
| setEnableTrackAppCrash | Boolean | 否 | 是否上报 App 崩溃日志,默认为 false,开启后会在错误分析中显示错误堆栈数据。关于崩溃日志中混淆内容转换的问题,可参考 符号文件上传。ft-sdk 1.5.1 以上版本,可以通过 extraLogCatWithJavaCrash、extraLogCatWithNativeCrash 设置在 Java Crash 和 Native Crash 是否显示 logcat |
| setIssueDataProvider | FTIssueDataProvider | 否 | 为自动采集的 Java/Native Crash 和 watchdog/native ANR Error 添加经过校验的自定义字段,包含历史恢复数据,默认为不设置,ft-sdk 1.7.5 以上支持,详见 Crash/ANR 自定义字段 |
| setExtraMonitorTypeWithError | Array | 否 | 设置辅助监控信息,添加附加监控数据到 RUM 崩溃数据中。ErrorMonitorType.BATTERY 为电池余量,ErrorMonitorType.MEMORY 为内存用量,ErrorMonitorType.CPU 为 CPU 占有率,默认不设置 |
| setDeviceMetricsMonitorType | Array | 否 | 设置 View 监控信息,在 View 周期中,添加监控数据。DeviceMetricsMonitorType.BATTERY 监控当前页的最高电流输出情况,DeviceMetricsMonitorType.MEMORY 监控当前应用使用内存情况,DeviceMetricsMonitorType.CPU 监控 CPU 跳动次数,DeviceMetricsMonitorType.FPS 监控屏幕帧率。监控周期可选 DetectFrequency.DEFAULT 500 毫秒、DetectFrequency.FREQUENT 100 毫秒、DetectFrequency.RARE 1 秒,默认不设置 |
| setEnableTrackAppANR | Boolean | 否 | 是否开启 ANR 采集,默认为 false。ft-sdk 1.7.5 起,Android 11(API 30)及以上在进程后续启动时通过 ApplicationExitInfo 恢复致命 ANR,不采集非致命实时 ANR;Android 10(API 29)及以下继续使用实时 watchdog/native ANR 采集。extraLogCatWithANR 仅用于 API 29 及以下的实时采集路径 |
| setEnableTrackAppUIBlock | Boolean, long | 否 | 是否开启 UI 卡顿检测,默认为 false,ft-sdk 1.6.4 以上版本可以通过 blockDurationMs 控制检测时间范围 [100,),单位毫秒,默认是 1 秒 |
| setEnableTraceUserAction | Boolean | 否 | 是否自动追踪用户操作,目前只支持用户启动和点击操作。该配置依赖 ft-plugin,默认为 false |
| setEnableTraceUserView | Boolean | 否 | 是否自动追踪用户页面操作,该配置依赖 ft-plugin,默认为 false |
| setEnableTraceUserViewInFragment | Boolean | 否 | 是否自动追踪 Fragment 类型页面数据,该配置依赖 ft-plugin,默认为 false,ft-sdk 1.6.11 以上支持 |
| setInitialResourceIdentifier | FTInitialResourceIdentifier | 否 | 设置参与原生 View network_settled_time 计算的 Resource 判断规则,默认使用 100 ms 时间窗口。不接受 null,规则返回 false 仅排除该指标贡献,不丢弃 Resource 事件。详见 View 耗时指标自定义规则 |
| setLastInteractionIdentifier | FTLastInteractionIdentifier | 否 | 设置原生 View interaction_to_next_view_time 的上一页交互判断规则,默认要求时间差大于 0 且小于 3000 ms。传入 null 关闭自动 INV。详见 View 耗时指标自定义规则 |
| setEnableTraceUserResource | Boolean | 否 | 是否采集网络请求 Resource,默认为 false。支持 OkHttp、HttpURLConnection / HttpsURLConnection 和 OkHttp WebSocket 握手,各方式的接入要求见 Resource 自动采集 |
| setEnableHttpURLConnectionResource | Boolean | 否 | 是否自动采集 HttpURLConnection / HttpsURLConnection Resource,默认为 false。需同时开启 setEnableTraceUserResource(true),要求 ft-sdk >= 1.7.6-alpha03 和 ft-plugin >= 1.3.9-alpha01,详见 URLConnection 自动采集 |
| setEnableResourceHostIP | Boolean | 否 | 是否采集请求目标域名地址的 IP。作用域:只影响 enableTraceUserResource 为 true 的 OkHttp 默认采集,不适用于 URLConnection。自定义 Resource 采集,需要使用 FTResourceEventListener.FTFactory(true) 来开启这个功能。另外,单个 OkHttp 对相同域名存在 IP 缓存机制,相同 OkHttpClient,在连接服务端 IP 不发生变化的前提下,只会生成一次 |
| setResourceUrlHandler | Callback | 否 | 设置需要过滤的 Resource 条件,默认不过滤 |
| setOkHttpEventListenerHandler | Callback | 否 | ASM 设置全局 OkHttp EventListener,默认不设置 |
| setOkHttpResourceContentHandler | Callback | 否 | ASM 设置全局 FTResourceInterceptor.ContentHandlerHelper,默认不设置,ft-sdk 1.6.7 以上支持,自定义 Resource |
| addGlobalContext | Dictionary | 否 | 添加自定义标签,用于用户监测数据源区分,如果需要使用追踪功能,则参数 key 为 track_id,value 为任意数值,添加规则注意事项请查阅此处 |
| setVisitorIdConfig | FTVisitorIdConfig | 否 | 配置匿名访客标识 Visitor ID,默认为 null(关闭)。传入有效配置后开启,OkHttp Header 注入独立于 RUM/Trace 采样及 Resource 采集开关,ft-sdk >= 1.7.6-alpha04 支持,详见 访客标识 Visitor ID |
| setRumCacheLimitCount | int | 否 | 本地缓存 RUM 限制数量 [10_000,),默认是 100_000,ft-sdk 1.6.6 以上支持 |
| setEnableTraceWebView | Boolean | 否 | 是否开启通过 Android SDK 采集 WebView 数据,默认为 true,ft-sdk 1.6.12 以上支持 |
| setAllowWebViewHost | Array | 否 | 设置允许数据追踪的 WebView host 地址,null 为全采集,默认为 null,ft-sdk 1.6.12 以上支持;该方法已废弃,ft-sdk 1.7.5 起请使用 FTSDKConfig.setAllowWebViewHost 统一配置 WebView RUM 与 Log |
| setViewActivityTrackingHandler | FTViewActivityTrackingHandler | 否 | 用于自定义 Activity 视图的跟踪方式。当 Activity 生命周期事件发生时,此处理器会被调用来决定如何跟踪该 Activity,默认不做处理,ft-sdk 1.6.13 以上支持 |
| setViewFragmentTrackingHandler | FTViewFragmentTrackingHandler | 否 | 用于自定义 Fragment 视图的跟踪方式。当 Fragment 生命周期事件发生时,此处理器会被调用来决定如何跟踪该 Fragment。默认不做处理,ft-sdk 1.6.13 以上支持 |
| setActionTrackingHandler | FTActionTrackingHandler | 否 | 用于自定义用户操作的跟踪方式。当用户执行操作时,此处理器会被调用来决定如何跟踪该操作,默认不做处理,ft-sdk 1.6.13 以上支持 |
RUM 手动埋点¶
在 FTRUMConfig 配置 enableTraceUserAction、enableTraceUserView、enableTraceUserResource、setEnableTrackAppUIBlock、setEnableTrackAppCrash 和 setEnableTrackAppANR 来实现 Action、View、Resource、LongTask、Error 的自动采集。若需自定义采集,可通过 FTRUMGlobalManager 手动上报。
Action¶
使用方法¶
/**
* 添加 Action
*
* @param actionName action 名称
* @param actionType action 类型
* @param property 附加属性参数(可选)
*/
public void startAction(String actionName, String actionType, HashMap<String, Object> property)
/**
* 添加 Action, 此类数据无法关联 Error,Resource,LongTask 数据
*
* @param actionName action 名称
* @param actionType action 类型
* @param duration 纳秒,持续时间(可选)
* @param property 扩展属性(可选)
*/
public void addAction(String actionName, String actionType, long duration, HashMap<String, Object> property)
/**
* 添加 action
*
* @param actionName action 名称
* @param actionType action 类型
* @param property 附加属性参数(可选)
*/
fun startAction(actionName: String, actionType: String, property: HashMap<String, Any>)
/**
* 添加 Action
*
* @param actionName action 名称
* @param actionType action 类型
* @param duration 纳秒,持续时间(可选)
* @param property 扩展属性(可选)
*/
fun addAction(actionName: String, actionType: String, duration: Long, property: HashMap<String, Any>)
startAction内部有计算耗时算法,计算期间会尽量与附近发生的Resource、LongTask、Error数据做数据关联,设有 100 ms 频繁触发保护,建议用于用户操作类型的数据。如果有频繁调用的需求请使用addAction,这个数据不会与startAction发生冲突,并且不与当下Resource、LongTask、Error进行数据关联。
代码示例¶
// 场景1
FTRUMGlobalManager.get().startAction("login", "action_type");
// 场景2: 动态参数
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key", "ft_value");
FTRUMGlobalManager.get().startAction("login", "action_type", map);
// 场景1
FTRUMGlobalManager.get().addAction("login", "action_type");
// 场景2: 动态参数
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key", "ft_value");
FTRUMGlobalManager.get().addAction("login", "action_type", map);
// 场景1
FTRUMGlobalManager.get().startAction("login", "action_type")
// 场景2: 动态参数
val map = HashMap<String, Any>()
map["ft_key"] = "ft_value"
FTRUMGlobalManager.get().startAction("login", "action_type", map)
// 场景1
FTRUMGlobalManager.get().addAction("login", "action_type")
// 场景2: 动态参数
val map = HashMap<String, Any>()
map["ft_key"] = "ft_value"
FTRUMGlobalManager.get().addAction("login", "action_type", map)
View¶
使用方法¶
/**
* view 起始
*
* @param viewName 当前页面名称
* @param property 附加属性参数(可选)
*/
public void startView(String viewName, HashMap<String, Object> property)
/**
* view 结束
*
* @param property 附加属性参数(可选)
*/
public void stopView(HashMap<String, Object> property)
/**
* 更新当前 view loading_time 指标,单位纳秒
*
* @param duration duration
*/
public void updateLoadTime(long duration)
/**
* view 起始
*
* @param viewName 当前页面名称
* @param property 附加属性参数(可选)
*/
fun startView(viewName: String, property: HashMap<String, Any>)
/**
* view 结束
*
* @param property 附加属性参数(可选)
*/
fun stopView(property: HashMap<String, Any>)
/**
* 更新当前 view loading_time 指标,单位纳秒
*
* @param duration duration
*/
fun updateLoadTime(duration: Long)
代码示例¶
@Override
protected void onResume() {
super.onResume();
// 场景 1
FTRUMGlobalManager.get().startView("Current Page Name");
// 场景 2: 动态参数
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key", "ft_value");
map.put("ft_key_will_change", "ft_value");
FTRUMGlobalManager.get().startView("Current Page Name", map)
}
@Override
protected void onPause() {
super.onPause();
// 场景 1
FTRUMGlobalManager.get().stopView();
// 场景 2 : 动态参数
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key_will_change", "ft_value_change"); //ft_key_will_change 的值会在 stopView 时被更新为 ft_value_change
FTRUMGlobalManager.get().stopView(map);
}
override fun onResume() {
super.onResume()
// 场景 1
FTRUMGlobalManager.get().startView("Current Page Name")
// 场景 2: 动态参数
val map = HashMap<String, Any>()
map["ft_key"] = "ft_value"
map["ft_key_will_change"] = "ft_value"
FTRUMGlobalManager.get().startView("Current Page Name", map)
}
override fun onPause() {
super.onPause()
// 场景 1
FTRUMGlobalManager.get().stopView()
// 场景 2 : 动态参数
val map = HashMap<String, Any>()
map["ft_key_will_change"] = "ft_value_change" // ft_key_will_change 这个数值,会在 stopView 时候被修改为 ft_value_change
FTRUMGlobalManager.get().stopView(map)
}
Error¶
使用方法¶
/**
* 添加错误信息
*
* @param log 日志
* @param message 消息
* @param errorType 错误类型, ErrorType
* @param state 程序运行状态
* @param dateline 发生时间,纳秒(可选)
* @param property 附加属性(可选)
*/
public void addError(String log, String message, long dateline, ErrorType errorType,
AppState state, HashMap<String, Object> property)
/**
* 添加错误信息
*
* @param log 日志
* @param message 消息
* @param errorType 错误类型, String
* @param state 程序运行状态
* @param dateline 发生时间,纳秒(可选)
* @param property 附加属性(可选)
*/
public void addError(String log, String message, long dateline, String errorType,
AppState state, HashMap<String, Object> property)
/**
* 添加错误信息
*
* @param log 日志
* @param message 消息
* @param errorType 错误类型, ErrorType
* @param state 程序运行状态
* @param dateline 发生时间,纳秒(可选)
* @param property 附加属性(可选)
*/
fun addError(log: String, message: String, dateline: Long, errorType: ErrorType, state: AppState, property: HashMap<String, Any>)
/**
* 添加错误信息
*
* @param log 日志
* @param message 消息
* @param errorType 错误类型, String
* @param state 程序运行状态
* @param dateline 发生时间,纳秒(可选)
* @param property 附加属性(可选)
*/
fun addError(log: String, message: String, dateline: Long, errorType: String, state: AppState, property: HashMap<String, Any>)
代码示例¶
// 场景 1:
FTRUMGlobalManager.get().addError("error log", "error msg", ErrorType.JAVA, AppState.RUN);
// 场景 2: 延迟记录发生的错误,这里的时间一般为错误发生的时间
FTRUMGlobalManager.get().addError("error log", "error msg", 16789000000000000000L, ErrorType.JAVA, AppState.RUN);
// 场景 3:动态参数
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key", "ft_value");
FTRUMGlobalManager.get().addError("error log", "error msg", ErrorType.JAVA, AppState.RUN, map);
// 场景 1:
FTRUMGlobalManager.get().addError("error log", "error msg", ErrorType.JAVA, AppState.RUN)
// 场景 2: 延迟记录发生的错误,这里的时间一般为错误发生的时间
FTRUMGlobalManager.get().addError("error log", "error msg", 16789000000000000000, ErrorType.JAVA, AppState.RUN)
// 场景 3:动态参数
val map = HashMap<String, Any>()
map["ft_key"] = "ft_value"
FTRUMGlobalManager.get().addError("error log", "error msg", ErrorType.JAVA, AppState.RUN, map)
LongTask¶
使用方法¶
代码示例¶
Resource¶
使用方法¶
/**
* resource 起始
*
* @param resourceId 资源 Id
* @param property 附加属性参数(可选)
*/
public void startResource(String resourceId, HashMap<String, Object> property)
/**
* resource 终止
*
* @param resourceId 资源 Id
* @param property 附加属性参数(可选)
*/
public void stopResource(final String resourceId, HashMap<String, Object> property)
/**
* 设置网络传输内容
*
* @param resourceId resourceId
* @param params params
* @param netStatusBean netStatusBean
*/
public void addResource(String resourceId, ResourceParams params, NetStatusBean netStatusBean)
/**
* resource 起始
*
* @param resourceId 资源 Id(可选)
*/
fun startResource(resourceId: String, property: HashMap<String, Any>)
/**
* resource 终止
*
* @param resourceId 资源 Id
* @param property 附加属性参数(可选)
*/
fun stopResource(resourceId: String, property: HashMap<String, Any>)
/**
* 设置网络传输内容
*
* @param resourceId resourceId
* @param params params
* @param netStatusBean netStatusBean
*/
fun addResource(resourceId: String, params: ResourceParams, netStatusBean: NetStatusBean)
代码示例¶
// 场景 1
// 请求开始
FTRUMGlobalManager.get().startResource("resourceId");
// ...
// 请求结束
FTRUMGlobalManager.get().stopResource("resourceId");
// 最后,在请求结束之后,发送请求相关的数据指标
ResourceParams params = new ResourceParams();
params.setUrl("https://guance.com");
params.setResponseContentType(response.header("Content-Type"));
params.setResponseConnection(response.header("Connection"));
params.setResponseContentEncoding(response.header("Content-Encoding"));
params.setResponseHeader(response.headers().toString());
params.setRequestHeader(request.headers().toString());
params.setResourceStatus(response.code());
params.setResourceMethod(request.method());
NetStatusBean bean = new NetStatusBean();
bean.setTcpStartTime(60000000);
// ...
FTRUMGlobalManager.get().addResource("resourceId", params, bean);
// 场景 2 :动态参数使用
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key", "ft_value");
map.put("ft_key_will_change", "ft_value");
FTRUMGlobalManager.get().startResource("resourceId", map);
// ...
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key_will_change", "ft_value_change"); // ft_key_will_change 这个数值,会在 stopResource 时候被修改为 ft_value_change
FTRUMGlobalManager.get().stopResource(uuid, map);
// 场景 1
// 请求开始
FTRUMGlobalManager.get().startResource("resourceId")
// 请求结束
FTRUMGlobalManager.get().stopResource("resourceId")
// 最后,在请求结束之后,发送请求相关的数据指标
val params = ResourceParams()
params.url = "https://guance.com"
params.responseContentType = response.header("Content-Type")
params.responseConnection = response.header("Connection")
params.responseContentEncoding = response.header("Content-Encoding")
params.responseHeader = response.headers.toString()
params.requestHeader = request.headers.toString()
params.resourceStatus = response.code
params.resourceMethod = request.method
val bean = NetStatusBean()
bean.tcpStartTime = 60000000
// ...
FTRUMGlobalManager.get().addResource("resourceId", params, bean)
// 场景 2 :动态参数使用
val map = hashMapOf<String, Any>(
"ft_key" to "ft_value",
"ft_key_will_change" to "ft_value"
)
FTRUMGlobalManager.get().startResource("resourceId", map)
// ...
val map = hashMapOf<String, Any>(
"ft_key_will_change" to "ft_value_change"
)
// ft_key_will_change 这个数值,会在 stopResource 时候被修改为 ft_value_change
FTRUMGlobalManager.get().stopResource(uuid, map)
| 方法名 | 必须 | 含义 | 说明 |
|---|---|---|---|
| NetStatusBean.fetchStartTime | 否 | 请求开始时间 | |
| NetStatusBean.tcpStartTime | 否 | TCP 连接时间 | |
| NetStatusBean.tcpEndTime | 否 | TCP 结束时间 | |
| NetStatusBean.dnsStartTime | 否 | DNS 开始时间 | |
| NetStatusBean.dnsEndTime | 否 | DNS 结束时间 | |
| NetStatusBean.responseStartTime | 否 | 响应开始时间 | |
| NetStatusBean.responseEndTime | 否 | 响应结束时间 | |
| NetStatusBean.sslStartTime | 否 | SSL 开始时间 | |
| NetStatusBean.sslEndTime | 否 | SSL 结束时间 | |
| NetStatusBean.property | 否 | 附加属性 | |
| ResourceParams.url | 是 | URL 地址 | |
| ResourceParams.requestHeader | 否 | 请求头参数 | |
| ResourceParams.responseHeader | 否 | 响应头参数 | |
| ResourceParams.responseConnection | 否 | 响应 connection | |
| ResourceParams.responseContentType | 否 | 响应 ContentType | |
| ResourceParams.responseContentEncoding | 否 | 响应 ContentEncoding | |
| ResourceParams.resourceMethod | 否 | 请求方法 | GET, POST 等 |
| ResourceParams.responseBody | 否 | 返回 body 内容 | |
| ResourceParams.property | 否 | 附加属性 |
Resource 自动采集¶
自动采集网络请求需要接入 ft-plugin,并在 RUM 初始化时开启 setEnableTraceUserResource(true)。Resource URL 过滤和 RUM 采样规则对以下采集方式均生效。
OkHttp¶
开启 setEnableTraceUserResource(true) 后,SDK 自动采集经插件插桩的 OkHttp HTTP/HTTPS 请求,无需修改请求代码。请在创建 OkHttpClient 前完成 SDK 初始化。
未使用插件时,可按 手动接入 OkHttp Resource / Trace 配置。
HttpURLConnection / HttpsURLConnection¶
要求 ft-sdk >= 1.7.6-alpha03 和 ft-plugin >= 1.3.9-alpha01。在创建连接前,同时开启以下两个开关:
- 采集范围:经插件插桩的
URL.openConnection()和openConnection(Proxy)HTTP/HTTPS 请求。插件选项instrumentHttpURLConnection默认开启;反射、系统内部或被排除插桩的调用不采集。 - 采集数据:URL、方法、请求头、响应头、状态码、实际读写字节数和总耗时,不采集正文、DNS/TCP/TLS 分阶段耗时或目标 IP。总耗时包含应用读取响应流的时间,未读完响应时字节数可能小于完整响应大小。
- 使用注意:正常读取并关闭响应流,请求结束后调用
disconnect()。建议过滤 SSE 等长连接请求;与其他采集层同时使用时,避免重复上报。 - 关联能力:Trace Header 注入和 RUM 链路关联需另行配置,见 URLConnection Trace;不支持 Visitor ID Header 注入。
WebSocket 握手 Resource¶
要求 ft-sdk >= 1.7.5 和 ft-plugin >= 1.3.8。开启 setEnableTraceUserResource(true) 后,自动采集 OkHttp newWebSocket() 的握手请求,无需额外开关。
每次握手生成一条 Resource,记录成功、拒绝或失败状态;不统计连接存续时间,也不采集消息内容。未使用支持自动采集的插件时,可通过 FTWebSocket 手动接入。