コンテンツにスキップ

RUM 設定

RUM 初期化設定

await FTRUMManager().setConfig(
  androidAppId: appAndroidId,
  iOSAppId: appIOSId,
);
フィールド 必須 説明
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.batterymemorycpuall に対応します。呼び出し時は対応する .value(例:ErrorMonitorType.all.value)を渡します。デフォルトでは無効です
deviceMetricsMonitorType int いいえ RUM View データに付加するパフォーマンス監視情報を設定します。DeviceMetricsMonitorType.batterymemorycpufpsall に対応します。呼び出し時は対応する .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 を有効にする必要があります。machExceptionsignalcppExceptionnsExceptionsystemapplicationStateallhighCompatibility から選択できます。デフォルトは 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.navigatorObserversFTRouteObserver を追加すると、SDK は Flutter ページの切り替えを自動収集できます。ページ名(view_name)は以下の方法で設定できます。

方法 1:routes による収集

MaterialApp.routes に遷移先のページを設定します。routeskey がページ名(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})
コード例
FTRUMManager().addCustomError("error stack", "error message");

LongTask

自動収集

FTRUMManager().setConfigenableLongTask を有効にすると、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().setConfigenableUserResource を有効にすることで実現します。

カスタム 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 リソースタイプ。例:nativeimagemediafontcssjs
metrics.requestSize num リクエストサイズ。リクエストヘッダーとリクエストボディを含む(バイト単位)
metrics.resourceHttpProtocol String Resource が使用する HTTP プロトコル。例:http/1.1
metrics.reusedConnection bool 接続を再利用するかどうか

enableUserResource による自動収集を有効にすると、SDK はリクエストメソッド、レスポンスヘッダー、接続状態に基づいて、resourceTyperequestSizeresourceHttpProtocolreusedConnection などのフィールドを自動的に補完します。

コード例
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 を参照してください。

フィードバック

このページは役に立ちましたか?