RUM 設定¶
RUM 初期化設定¶
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
| androidAppId | String | Android 必須 | Android プラットフォームの app_id。RUM コンソールで申請してください。Android ランタイム時のみ読み込まれます |
| iOSAppId | String | iOS 必須 | iOS プラットフォームの app_id。RUM コンソールで申請してください。iOS ランタイム時のみ読み込まれます |
| 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 | いいえ | ネイティブ側の Action(Android/iOS のネイティブコントロールクリックやアプリ起動イベントを含む)を自動追跡するかどうか。デフォルトは false です。Android 側では ft-plugin の設定が必要です。起動イベントを収集するには Application のカスタマイズも必要です |
| enableNativeUserView | bool | いいえ | ネイティブページ(Android は Activity、iOS は UIViewController)を自動収集するかどうか。デフォルトは false です |
| enableNativeSwiftUIUserView | bool | いいえ | iOS:ネイティブ SwiftUI View の自動追跡を有効にするかどうか。enableNativeUserView も同時に有効にする必要があります |
| enableNativeUserViewInFragment | bool | いいえ | Android Fragment ページを自動収集するかどうか。ft-plugin の設定が必要です。デフォルトは false です。Android のみ対応 |
| enableNativeUserResource | bool | いいえ | ネイティブネットワーク Resource の自動収集を有効にするかどうか。Android は OkHttp リクエスト、iOS はネイティブネットワークリクエストを自動収集します。デフォルトは false です。このパラメータは、Flutter HttpClient リクエストを収集する enableUserResource とは独立した機能です |
| enableNativeAppUIBlock | bool | いいえ | ネイティブメインスレッドのブロック(UI Block/Freeze)を自動検出するかどうか。デフォルトは false です |
| nativeUiBlockDurationMS | int | いいえ | ネイティブメインスレッドブロック検出の閾値(ミリ秒単位)。enableNativeAppUIBlock が有効な場合のみ機能します。範囲は [100, ) です。iOS のデフォルトは 250ms、Android のデフォルトは 1000ms です |
| enableLongTask | bool | いいえ | Flutter Dart メイン Isolate の長タスクを自動検出するかどうか。デフォルトは false です |
| dartLongTaskThreshold | double | いいえ | Flutter Dart 長タスク検出の閾値(秒単位)。デフォルトは 0.1 です |
| enableTrackNativeAppANR | bool | いいえ | ネイティブ ANR 監視を有効にするかどうか。デフォルトは false です。ANR はアプリケーションが継続的に応答しない状態を検出するもので、enableNativeAppUIBlock で収集される単発のメインスレッドブロックとは異なります。iOS はメインスレッドの RunLoop で応答なしを検出します |
| enableTrackNativeCrash | bool | いいえ | ネイティブクラッシュ監視を有効にするかどうか。デフォルトは false です。Android は Java Crash と Native C/C++ Crash を収集します。iOS は Crash を収集し、iosCrashMonitoringType で監視タイプを設定できます |
| errorMonitorType | int | いいえ | RUM Error データに付加する補助監視情報を設定します。ErrorMonitorType.battery、memory、cpu、all に対応します。呼び出し時は対応する .value(例:ErrorMonitorType.all.value)を渡します。デフォルトでは無効です |
| deviceMetricsMonitorType | int | いいえ | RUM View データに付加するパフォーマンス監視情報を設定します。DeviceMetricsMonitorType.battery、memory、cpu、fps、all に対応します。呼び出し時は対応する .value(例:DeviceMetricsMonitorType.all.value)を渡します。デフォルトでは無効です |
| detectFrequency | enum DetectFrequency | いいえ | View パフォーマンス監視のサンプリング周期:DetectFrequency.normal は 500ms、frequent は 100ms、rare は 1000ms です。デフォルトは normal です。deviceMetricsMonitorType を設定している場合のみ意味を持ちます |
| globalContext | Map | いいえ | カスタムグローバルパラメータ。追加ルールについてはフィールド競合の説明を参照してください |
| rumCacheDiscard | enum | いいえ | 破棄ポリシー:FTRUMCacheDiscard.discard は新しいデータを破棄(デフォルト)、FTRUMCacheDiscard.discardOldest は古いデータを破棄します |
| rumCacheLimitCount | int | いいえ | ローカルキャッシュの最大 RUM エントリ数制限。[10_000, ) の範囲で、デフォルトは 100_000 です |
| isInTakeUrl | bool Function(String url) | いいえ | Flutter http Resource の URL フィルタリングコールバック。true を返すとフィルタリング(収集しない)、false を返すと収集します。使用方法についてはデータ収集カスタムルールを参照してください |
| enableTraceWebView | bool | いいえ | ネイティブ SDK による WebView データ収集を有効にするかどうか。Android/iOS に対応し、デフォルトは true です |
| allowWebViewHost | List |
いいえ | WebView データ収集を許可する Host のリストを設定します。enableTraceWebView と組み合わせて使用します。Android/iOS に対応します。設定しない場合、または null の場合はすべての Host の収集を許可します |
| enableResourceHostIP | bool | いいえ | ネイティブ Resource リクエストの Host IP を収集するかどうか。デフォルトは false です。enableNativeUserResource によるネイティブネットワーク自動収集のみに影響し、enableUserResource で収集する Flutter HttpClient Resource には影響しません。iOS は 13 以上が必要です |
| iosCrashMonitoringType | enum IOSCrashMonitoringType | いいえ | iOS クラッシュ監視タイプ。iOS のみ有効で、enableTrackNativeCrash を有効にする必要があります。machException、signal、cppException、nsException、system、applicationState、all、highCompatibility から選択できます。デフォルトは IOSCrashMonitoringType.highCompatibility です |
RUM ユーザーデータ追跡¶
Action¶
使用方法¶
/// action を追加
/// [actionName] action 名
/// [actionType] action タイプ
/// [property] 追加属性パラメータ(オプション)
Future<void> startAction(String actionName, String actionType,
{Map<String, Object?>? property})
/// 高頻度で action を追加。現在の Resource、LongTask、Error イベントとは関連付けません
Future<void> addAction(String actionName, String actionType,
{Map<String, Object?>? property})
コード例¶
FTRUMManager().startAction("action name", "action type");
FTRUMManager().addAction("action name", "action type");
View¶
自動収集¶
MaterialApp.navigatorObservers に FTRouteObserver を追加すると、SDK は Flutter ページの切り替えを自動収集できます。ページ名(view_name)は以下の方法で設定できます。
方法 1:routes による収集¶
MaterialApp.routes に遷移先のページを設定します。routes の key がページ名(view_name)になります。
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomeRoute(),
navigatorObservers: [
FTRouteObserver(),
],
routes: <String, WidgetBuilder>{
'logging': (BuildContext context) => Logging(),
'rum': (BuildContext context) => RUM(),
'tracing_custom': (BuildContext context) => CustomTracing(),
'tracing_auto': (BuildContext context) => AutoTracing(),
},
);
}
}
Navigator.pushNamed(context, "logging");
方法 2:FTMaterialPageRoute による収集¶
カスタム FTMaterialPageRoute を使用して、ウィジェットの runtimeType からページ名を解析します。この場合、widget のクラス名がページ名(view_name)になります。
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomeRoute(),
navigatorObservers: [
FTRouteObserver(),
],
);
}
}
Navigator.of(context).push(
FTMaterialPageRoute(builder: (context) => new NoRouteNamePage()),
);
サンプルについてはこちらを参照してください。
方法 3:RouteSettings.name による収集¶
Route タイプのページで RouteSettings.name をカスタマイズします。FTRouteObserver はこの値を優先して取得します。この方法は showDialog()、showTimePicker() などの Dialog タイプのページにも適用できます。
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomeRoute(),
navigatorObservers: [
FTRouteObserver(),
],
);
}
}
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => new NoRouteNamePage(),
settings: RouteSettings(name: "RouteSettingName"),
),
);
上記3つの方法は、1つのプロジェクト内で混在して使用できます。
スリープおよびウェイクアップイベントの収集¶
バージョン 0.5.1-pre.1 未満で、アプリケーションのスリープおよびウェイクアップ動作を収集する必要がある場合は、以下のコードを追加してください。
class _HomeState extends State<HomeRoute> {
@override
void initState() {
FTLifeRecycleHandler().initObserver();
}
@override
void dispose() {
FTLifeRecycleHandler().removeObserver();
}
}
自動収集のフィルタリングルールについては、データ収集カスタムルールを参照してください。
カスタム 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})
コード例¶
LongTask¶
自動収集¶
FTRUMManager().setConfig で enableLongTask を有効にすると、SDK は Flutter Dart メイン Isolate に閾値を超えるブロッキングタスクが発生したかどうかを検出し、LongTask データを生成します。デフォルトの閾値は 0.1 秒で、dartLongTaskThreshold で調整できます。
await FTRUMManager().setConfig(
androidAppId: appAndroidId,
iOSAppId: appIOSId,
enableLongTask: true,
dartLongTaskThreshold: 0.1,
);
カスタム LongTask¶
使用方法¶
/// LongTask を報告。duration の単位はナノ秒
Future<void> addLongTask(String stack, int duration,
{Map<String, String>? property})
コード例¶
FTRUMManager().addLongTask(
"flutter_manual_long_task",
250000000,
property: {"long_task_source": "manual_report"},
);
自動検出される LongTask は、Dart メイン Isolate のイベントループ遅延を識別するためのものです。収集されるのはブロック時間であり、必ずしもブロックを引き起こしたビジネスコードのスタックを取得できるとは限りません。
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,
int? resourceSize,
String? resourceType,
FTRUMResourceMetrics? metrics,
})
| フィールド | 型 | 説明 |
|---|---|---|
| resourceSize | int | レスポンスボディのサイズ(バイト単位) |
| resourceType | String | リソースタイプ。例:native、image、media、font、css、js |
| metrics.requestSize | num | リクエストサイズ。リクエストヘッダーとリクエストボディを含む(バイト単位) |
| metrics.resourceHttpProtocol | String | Resource が使用する HTTP プロトコル。例:http/1.1 |
| metrics.reusedConnection | bool | 接続を再利用するかどうか |
enableUserResourceによる自動収集を有効にすると、SDK はリクエストメソッド、レスポンスヘッダー、接続状態に基づいて、resourceType、requestSize、resourceHttpProtocol、reusedConnectionなどのフィールドを自動的に補完します。
コード例¶
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 を参照してください。