コンテンツにスキップ

データ収集カスタムルール

View

Activity

  • まず FTRUMConfig.setEnableTraceUserView(true) を有効にする必要があります。
FTSdk.initRUMWithConfig(new FTRUMConfig()
    .setViewActivityTrackingHandler(new FTViewActivityTrackingHandler() {
        @Override
        public HandlerView resolveHandlerView(Activity activity) {
            String activityName = activity.getClass().getSimpleName();

            // Activity 名に基づいてビュー名をカスタマイズ
            if (activityName.startsWith("Main")) {
                return new HandlerView("自定义主页面");
            } else if (activityName.startsWith("Detail")) {
                HashMap<String, Object> properties = new HashMap<>();
                properties.put("extra_key", "extra_value");
                return new HandlerView("自定义详情页面", properties);
            }

            // null を返して追跡をスキップ
            return null;
        }
    })
);
FTSdk.initRUMWithConfig(
    FTRUMConfig()
        .setViewActivityTrackingHandler(object : FTViewActivityTrackingHandler {
            override fun resolveHandlerView(activity: Activity): HandlerView? {
                val activityName = activity.javaClass.simpleName
                return when {
                    activityName.startsWith("Main") ->
                        HandlerView("自定义主页面")
                    activityName.startsWith("Detail") -> {
                        val properties = hashMapOf<String, Any>("extra_key" to "extra_value")
                        HandlerView("自定义详情页面", properties)
                    }
                    else -> null // 追跡をスキップ
                }
            }
        })
)

Fragment

  • FTRUMConfig.setEnableTraceUserView(true)FTRUMConfig.setEnableTraceUserViewInFragment(true) の両方を有効にする必要があります。
FTSdk.initRUMWithConfig(new FTRUMConfig()
    .setViewFragmentTrackingHandler(new FTViewFragmentTrackingHandler() {
        @Override
        public HandlerView resolveHandlerView(FragmentWrapper fragment) {
            String fragmentName = fragment.getSimpleClassName();

            // Fragment 名に基づいてビュー名をカスタマイズ
            if (fragmentName.equals("HomeFragment")) {
                return new HandlerView("自定义首页片段");
            } else if (fragmentName.startsWith("Detail")) {
                HashMap<String, Object> properties = new HashMap<>();
                properties.put("extra_key", "extra_value");
                return new HandlerView("自定义详情片段", properties);
            }

            // null を返して追跡をスキップ
            return null;
        }
    })
);
FTSdk.initRUMWithConfig(
    FTRUMConfig()
        .setViewFragmentTrackingHandler(object : FTViewFragmentTrackingHandler {
            override fun resolveHandlerView(fragment: FragmentWrapper): HandlerView? {
                val fragmentName = fragment.simpleClassName
                return when {
                    fragmentName == "HomeFragment" ->
                        HandlerView("自定义首页片段")
                    fragmentName.startsWith("Detail") -> {
                        val properties = hashMapOf<String, Any>("extra_key" to "extra_value")
                        HandlerView("自定义详情片段", properties)
                    }
                    else -> null // 追跡をスキップ
                }
            }
        })
)

Action

  • FTRUMConfig.setEnableTraceUserAction(true) が有効である必要があります。
  • 用途: Action 名や属性をカスタマイズしたり、特定の View に基づいて Action 収集をフィルタリングします。
FTSdk.initRUMWithConfig(new FTRUMConfig()
    .setActionTrackingHandler(new FTActionTrackingHandler() {
        @Override
        public HandlerAction resolveHandlerAction(ActionEventWrapper actionEventWrapper) {
            // 操作タイプを取得
            ActionSourceType actionType = actionEventWrapper.getSourceType();
            Object source = actionEventWrapper.getSource();

            // 指定した View の Action をフィルタリング
            if (source instanceof View) {
                View view = (View) source;
                if (view.getId() == R.id.ignore_action_view) {
                    return null;
                }
            }

            // 操作タイプに基づいてカスタム追跡
            if (actionType == ActionSourceType.CLICK_VIEW) {
                HashMap<String, Object> properties = new HashMap<>();
                properties.put("extra_key", "extra_value");
                return new HandlerAction("自定义按钮点击", properties);
            } else if (actionType == ActionSourceType.CLICK_LIST_ITEM) {
                return new HandlerAction("自定义列表项点击");
            }

            // null を返して追跡をスキップ
            return null;
        }
    })
);
FTSdk.initRUMWithConfig(
    FTRUMConfig()
        .setActionTrackingHandler(object : FTActionTrackingHandler {
            override fun resolveHandlerAction(actionEventWrapper: ActionEventWrapper): HandlerAction? {
                val source = actionEventWrapper.source

                // 指定した View の Action をフィルタリング
                if (source is View && source.id == R.id.ignore_action_view) {
                    return null
                }

                return when (actionEventWrapper.sourceType) {
                    ActionSourceType.CLICK_VIEW -> {
                        val properties = hashMapOf<String, Any>("extra_key" to "extra_value")
                        HandlerAction("自定义按钮点击", properties)
                    }
                    ActionSourceType.CLICK_LIST_ITEM ->
                        HandlerAction("自定义列表项点击")
                    else -> null // 追跡をスキップ
                }
            }
        })
)
注意

ActionEventWrapper.getSource() を使用して、現在の操作のソースオブジェクトを取得できます。通常のクリック、リスト項目のクリック、タブのクリックなど、View によってトリガーされる Action の場合、source は通常対応する View です。setActionTrackingHandler を設定すると、SDK はこのハンドラーの戻り値を Action 収集の基準として使用します。null を返す Action はスキップされます。収集を継続する必要がある Action は HandlerAction を返す必要があります。

Resource

  • FTRUMConfig.setEnableTraceUserResource(true) が有効である必要があります。

URL に基づく収集フィルタリング

FTSdk.initRUMWithConfig(new FTRUMConfig()
    .setResourceUrlHandler(new FTInTakeUrlHandler() {
        @Override
        public boolean isInTakeUrl(String url) {
            // true を返すと収集しない、false を返すと収集する
            return url.startsWith("https://url.rule");
        }
    })
);
FTSdk.initRUMWithConfig(
    FTRUMConfig()
        .setResourceUrlHandler(object : FTInTakeUrlHandler {
            override fun isInTakeUrl(url: String): Boolean {
                // true を返すと収集しない、false を返すと収集する
                return url.startsWith("https://url.rule")
            }
        })
)

カスタム属性の追加

FTRUMConfig.setOkHttpResourceContentHandler(FTResourceInterceptor.ContentHandlerHelperEx) を使用して設定できます。

new FTResourceInterceptor.ContentHandlerHelperEx() {
    @Override
    public void onRequest(Request request, HashMap<String, Object> extraData) {
        extraData.put("df_custom_key","custom_value");
    }

    @Override
    public void onResponse(Response response, HashMap<String, Object> extraData) throws IOException {
        extraData.put("df_custom_key","custom_value");
    }

    @Override
    public boolean onExceptionWithFilter(Exception e, HashMap<String, Object> extraData)  {
        extraData.put("df_custom_key","custom_value");
        return false;
    }
}
object : FTResourceInterceptor.ContentHandlerHelperEx() {

override fun onRequest(
    request: Request,
    extraData: HashMap<String, Any>
    ) {
        extraData["df_custom_key"] = "custom_value"
    }

    override fun onResponse(
        response: Response,
        extraData: HashMap<String, Any>
    ) {
        extraData["df_custom_key"] = "custom_value"
    }

    override fun onExceptionWithFilter(
        e: Exception,
        extraData: HashMap<String, Any>
    ): Boolean {
        extraData["df_custom_key"] = "custom_value"
        return false
    }
}   

ネットワークエラーのフィルタリング

ローカルネットワークの IOException エラーをフィルタリングできます。FTRUMConfig.setOkHttpResourceContentHandler(FTResourceInterceptor.ContentHandlerHelperEx) を使用して設定するか、Resource のカスタマイズ を参照してください。

new FTResourceInterceptor.ContentHandlerHelperEx() {
    //...

    /**
     * ネットワーク接続中の例外を返します。
     *
     * @param e         リクエストで発生した IOException データ
     * @param extraData 追加データ
     * @return ローカルネットワークの network_error タイプのエラーをフィルタリングするかどうか。true はフィルタリングして収集しないことを意味します。
     */
    @Override
    public boolean onExceptionWithFilter(Exception e, HashMap<String, Object> extraData) {
        if (e instanceof SocketTimeoutException) { //ネットワークタイムアウト
            return true;
        }
        return super.onExceptionWithFilter(e, extraData);
    }
}
object : FTResourceInterceptor.ContentHandlerHelperEx() {
    //...

    /**
    * ネットワーク接続中の例外を返します。
    *
    * @param e         リクエストで発生した IOException データ
    * @param extraData 追加データ
    * @return ローカルネットワークの network_error タイプのエラーをフィルタリングするかどうか。true はフィルタリングして収集しないことを意味します。
    */
    override fun onExceptionWithFilter(e: Exception, extraData: HashMap<String, Any>): Boolean {
        return if (e is SocketTimeoutException) {
            true
        } else {
            super.onExceptionWithFilter(e, extraData)
        }
    }
}

カスタム TraceHeader

FTTraceConfig.setOkHttpTraceHeaderHandler(FTTraceInterceptor.HeaderHandler) を使用して設定するか、Trace のカスタマイズ を参照してください。以下は w3c-traceContext の例です。

 new FTTraceInterceptor.HeaderHandler() {
        private String[] splits;

        @Override
        public HashMap<String, String> getTraceHeader(Request request) {
            HashMap<String, String> map = new HashMap<>();
            // ヘッダーからカスタム trace_id を取得
            String replaceTrace = request.header(CUSTOM_TRACE_HEADER);
            String headerString = FTTraceManager.get().
                    getTraceHeader(request.url().toString())
                    // ヘッダーから propagation header を取得
                    .get(FTTraceHandler.W3C_TRACEPARENT_KEY); 
            splits = headerString.split("-");
            String originTraceId = splits[1];
            splits[1] = replaceTrace;
            map.put(FTTraceHandler.W3C_TRACEPARENT_KEY, headerString.replace(originTraceId, replaceTrace));
            return map;
        }

        @Override
        public String getSpanID() {
            if (splits != null) {
                return splits[2];
            }
            return null;
        }

        @Override
        public String getTraceID() {
            if (splits != null) {
                return splits[1];
            }
            return null;
        }
};
object : FTTraceInterceptor.HeaderHandler() {
    private var splits: List<String>? = null
    override fun getTraceHeader(request: Request): HashMap<String, String> {
        val map = HashMap<String, String>()

        // ヘッダーからカスタム trace_id を取得
        val replaceTrace = request.header(CUSTOM_TRACE_HEADER)
        val headerString = FTTraceManager.get()
            .getTraceHeader(request.url().toString())
            .get(FTTraceHandler.W3C_TRACEPARENT_KEY)

        splits = headerString?.split("-")
        val originTraceId = splits?.getOrNull(1)

        if (headerString != null && originTraceId != null && replaceTrace != null) {
            map[FTTraceHandler.W3C_TRACEPARENT_KEY] = 
                headerString.replace(originTraceId, replaceTrace)
        }

        return map
    }

    override fun getSpanID(): String? {
        return splits?.getOrNull(2)
    }

    override fun getTraceID(): String? {
        return splits?.getOrNull(1)
    }
}

カスタム trace_id を使用して RUM Resource を関連付ける

アプリ側にカスタム trace_id(例:リクエストヘッダーのキーが custom_trace_id)が既にある場合、SDK が生成した traceparent の trace_id を更新し、TraceContext.Simple を使用して RUM Resource の関連付けに使用する trace_id を指定できます。

new FTTraceInterceptor.HeaderHandler() {
    @Override
    public TraceContext getTraceContext(Request request) {
        HashMap<String, String> headers = FTTraceManager.get()
                .getTraceHeader(request.url().toString());

        // リクエストヘッダーからカスタム trace_id を取得(例:custom_trace_id)
        String customTraceId = request.header(CUSTOM_TRACE_HEADER);

        TraceContext.Simple sdkContext = TraceContext.Simple.fromTraceType(headers);
        if (customTraceId == null
                || customTraceId.length() == 0
                || sdkContext == null
                || sdkContext.getTraceId() == null) {
            return sdkContext;
        }

        String traceparent = headers.get(FTTraceHandler.W3C_TRACEPARENT_KEY);
        if (traceparent == null) {
            return sdkContext;
        }

        String newTraceparent = traceparent.replace(
                sdkContext.getTraceId(),
                customTraceId
        );

        // リクエストに注入する W3C trace header を更新
        headers.put(FTTraceHandler.W3C_TRACEPARENT_KEY, newTraceparent);

        // オプション:カスタムビジネスヘッダーを保持
        headers.put(CUSTOM_TRACE_HEADER, customTraceId);

        // RUM Resource は customTraceId を使用し、spanId は SDK 生成の spanId を継続使用
        return new TraceContext.Simple(headers, customTraceId, sdkContext.getSpanId());
    }
};
object : FTTraceInterceptor.HeaderHandler() {
    override fun getTraceContext(request: Request): TraceContext? {
        val headers = FTTraceManager.get()
            .getTraceHeader(request.url().toString())

        // リクエストヘッダーからカスタム trace_id を取得
        val customTraceId = request.header(CUSTOM_TRACE_HEADER)

        val sdkContext = TraceContext.Simple.fromTraceType(headers)
        val sdkTraceId = sdkContext?.traceId
        val sdkSpanId = sdkContext?.spanId
        if (customTraceId.isNullOrEmpty() || sdkTraceId.isNullOrEmpty()) {
            return sdkContext
        }

        val traceparent = headers[FTTraceHandler.W3C_TRACEPARENT_KEY] ?: return sdkContext
        val newTraceparent = traceparent.replace(sdkTraceId, customTraceId)

        // リクエストに注入する W3C trace header を更新
        headers[FTTraceHandler.W3C_TRACEPARENT_KEY] = newTraceparent

        // オプション:カスタムビジネスヘッダーを保持
        headers[CUSTOM_TRACE_HEADER] = customTraceId

        // RUM Resource は customTraceId を使用し、spanId は SDK 生成の spanId を継続使用
        return TraceContext.Simple(headers, customTraceId, sdkSpanId)
    }
}

注意:W3C trace_id は 32 桁の 16 進文字列である必要があり、すべて 0 にすることはできません。

フィードバック

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