RUM 配置¶
RUM 初始化配置¶
| 字段 | 类型 | 必须 | 说明 |
|---|---|---|---|
| androidAppId | String | 是 | Android 平台的 app_id,在应用访问监测控制台申请 |
| iOSAppId | String | 是 | iOS 平台的 app_id,在应用访问监测控制台申请 |
| sampleRate | double | 否 | 采样率,取值范围 [0,1],0 表示不采集,1 表示全采集,默认值为 1。作用域为同一 session_id 下所有 View、Action、LongTask、Error 数据 |
| sessionOnErrorSampleRate | double | 否 | 错误采集率。当会话未被 sampleRate 采样时,若会话期间发生错误,可以采集到错误前 1 分钟范围的数据,取值范围 [0,1],默认值为 0 |
| enableUserResource | bool | 否 | 是否开启 Flutter http Resource 自动抓取,默认 false。通过修改 HttpOverrides.global 实现,如果项目有定制需求需要继承 FTHttpOverrides |
| enableNativeUserAction | bool | 否 | 是否进行 Native Action 追踪,默认 false |
| enableNativeUserView | bool | 否 | 是否进行 Native View 自动追踪。纯 Flutter 应用建议关闭,默认 false |
| enableNativeUserViewInFragment | bool | 否 | 是否自动追踪 Native Fragment 类型的页面数据,默认 false,仅支持 Android |
| enableNativeUserResource | bool | 否 | 是否进行 Native Resource 自动追踪。纯 Flutter 应用建议关闭,默认 false |
| enableAppUIBlock | bool | 否 | 是否进行 Native Freeze 自动追踪,默认 false |
| nativeUiBlockDurationMS | int | 否 | 设置 Native Freeze 的时间范围,取值范围 [100, ),单位毫秒。iOS 默认 250ms,Android 默认 1000ms |
| enableTrackNativeAppANR | bool | 否 | 是否开启 Native ANR 监测,默认 false |
| enableTrackNativeCrash | bool | 否 | 是否开启 Android Java Crash 和 OC/C/C++ 崩溃监测,默认 false |
| errorMonitorType | enum ErrorMonitorType | 否 | 设置辅助监控信息,添加附加监控数据到 RUM Error 数据中。默认不开启 |
| deviceMetricsMonitorType | enum DeviceMetricsMonitorType | 否 | 在 View 周期中添加性能监控数据,默认不开启 |
| detectFrequency | enum DetectFrequency | 否 | 视图性能监控采样周期,默认 DetectFrequency.normal |
| globalContext | Map | 否 | 自定义全局参数。添加规则请查阅 冲突字段说明 |
| rumCacheDiscard | enum | 否 | 丢弃策略:FTRUMCacheDiscard.discard 丢弃新数据(默认)、FTRUMCacheDiscard.discardOldest 丢弃旧数据 |
| rumCacheLimitCount | number | 否 | 本地缓存最大 RUM 条目数量限制 [10_000, ),默认 100_000 |
| isInTakeUrl | callBack | 否 | 设置需要过滤的 Resource 条件,使用方式请查阅 数据采集自定义规则 |
RUM 用户数据追踪¶
Action¶
使用方法¶
/// 添加 action
/// [actionName] action 名称
/// [actionType] action 类型
/// [property] 附加属性参数(可选)
Future<void> startAction(String actionName, String actionType,
{Map<String, String>? property})
代码示例¶
View¶
自定义 View¶
使用方法¶
/// view 创建,这个方法需要在 [starView] 之前被调用
/// [viewName] 界面名称
/// [duration] 页面加载时长
Future<void> createView(String viewName, int duration)
/// view 开始
/// [viewName] 界面名称
/// [viewReferer] 前一个界面名称
/// [property] 附加属性参数(可选)
Future<void> starView(String viewName, {Map<String, String>? property})
/// view 结束
/// [property] 附加属性参数(可选)
Future<void> stopView({Map<String, String>? property})
代码示例¶
FTRUMManager().createView("Current Page Name", 100000000);
FTRUMManager().starView("Current Page Name");
FTRUMManager().stopView();
自动页面采集、路由过滤、休眠唤醒监听等规则请查阅 数据采集自定义规则。
Error¶
自动采集¶
void main() async {
runZonedGuarded(() async {
WidgetsFlutterBinding.ensureInitialized();
await FTMobileFlutter.sdkConfig(
datakitUrl: serverUrl,
debug: true,
);
await FTRUMManager().setConfig(
androidAppId: appAndroidId,
iOSAppId: appIOSId,
);
// Flutter 异常捕获
FlutterError.onError = FTRUMManager().addFlutterError;
runApp(MyApp());
}, (Object error, StackTrace stack) {
// 添加 Error 数据
FTRUMManager().addError(error, stack);
});
}
自定义 Error¶
使用方法¶
/// 添加自定义错误
/// [stack] 堆栈日志
/// [message] 错误信息
/// [appState] 应用状态
/// [errorType] 自定义 errorType
/// [property] 附加属性参数(可选)
Future<void> addCustomError(String stack, String message,
{Map<String, String>? property, String? errorType})
代码示例¶
Resource¶
自动采集¶
通过 FTRUMManager().setConfig 开启 enableUserResource 来实现。
自定义 Resource¶
使用方法¶
/// 开始资源请求
/// [key] 唯一 id
/// [property] 附加属性参数(可选)
Future<void> startResource(String key, {Map<String, String>? property})
/// 结束资源请求
/// [key] 唯一 id
/// [property] 附加属性参数(可选)
Future<void> stopResource(String key, {Map<String, String>? property})
/// 发送资源数据指标
Future<void> addResource({
required String key,
required String url,
required String httpMethod,
required Map<String, dynamic> requestHeader,
Map<String, dynamic>? responseHeader,
String? responseBody = "",
int? resourceStatus,
})
代码示例¶
void httpClientGetHttp(String url) async {
var httpClient = HttpClient();
String key = Uuid().v4();
HttpClientResponse? response;
HttpClientRequest? request;
try {
request = await httpClient
.getUrl(Uri.parse(url))
.timeout(Duration(seconds: 10));
FTRUMManager().startResource(key);
response = await request.close();
} finally {
Map<String, dynamic> requestHeader = {};
Map<String, dynamic> responseHeader = {};
request!.headers.forEach((name, values) {
requestHeader[name] = values;
});
var responseBody = "";
if (response != null) {
response.headers.forEach((name, values) {
responseHeader[name] = values;
});
responseBody = await response.transform(Utf8Decoder()).join();
}
FTRUMManager().stopResource(key);
FTRUMManager().addResource(
key: key,
url: request.uri.toString(),
requestHeader: requestHeader,
httpMethod: request.method,
responseHeader: responseHeader,
resourceStatus: response?.statusCode,
responseBody: responseBody,
);
}
}
使用
http库与dio库,可参考 example。