データ収集カスタムルール¶
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 に基づく収集フィルタリング¶
カスタム属性の追加¶
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 にすることはできません。