You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Sentry中排除app.start.cold span,仅统计navigation操作耗时?

解决Sentry Performance统计仅保留Navigation耗时的问题

有三种可行方案,根据你的需求选择:

方案1:修改自动生成的事务,只保留Navigation相关时长

在Sentry初始化时通过beforeSendTransaction钩子,过滤掉无关的span(比如app.start.cold),并重新计算事务的起止时间为Navigation操作的时间范围:

import * as Sentry from '@sentry/react-native';

Sentry.init({
  dsn: '你的DSN',
  tracesSampleRate: 1.0,
  beforeSendTransaction: (transaction) => {
    // 只处理React Navigation相关的事务
    if (transaction.contexts?.navigation?.screen) {
      // 筛选出所有navigation类型的span
      const navSpans = transaction.spans.filter(span => span.op === 'navigation');
      
      if (navSpans.length) {
        // 取最早的开始时间和最晚的结束时间作为事务的时间边界
        const earliestStart = Math.min(...navSpans.map(s => s.startTimestamp));
        const latestEnd = Math.max(...navSpans.map(s => s.timestamp));
        
        // 更新事务的起止时间,让事务时长仅统计Navigation耗时
        transaction.startTimestamp = earliestStart;
        transaction.timestamp = latestEnd;
        
        // 可选:直接移除无关span,让事务详情里只显示Navigation相关内容
        transaction.spans = navSpans;
      }
    }
    return transaction;
  },
});

方案2:直接关闭冷启动自动埋点

如果你完全不需要冷启动的性能数据,可以直接禁用Sentry的app.start自动采集,这样生成的Navigation事务就不会包含冷启动span:

Sentry.init({
  dsn: '你的DSN',
  tracesSampleRate: 1.0,
  autoInstrument: {
    appStart: false, // 关闭冷启动自动埋点
    reactNavigation: true, // 保留React Navigation的自动埋点
  },
});

方案3:手动创建Navigation事务(最灵活)

放弃自动埋点,手动在导航事件中创建和结束事务,完全控制统计范围:

import { useNavigationContainerRef, useNavigationEvent } from '@react-navigation/native';
import * as Sentry from '@sentry/react-native';

function NavigationSentryTracker() {
  const navigationRef = useNavigationContainerRef();

  useNavigationEvent((event) => {
    // 页面聚焦时开始事务
    if (event.type === 'focus') {
      const transaction = Sentry.startTransaction({
        name: `Navigate to ${event.target}`,
        op: 'navigation',
      });
      transaction.setTag('screen', event.target);
      // 把事务实例存在导航ref中,方便后续结束
      navigationRef.current._sentryTransaction = transaction;
    }

    // 页面失焦时结束事务
    if (event.type === 'blur') {
      const transaction = navigationRef.current?._sentryTransaction;
      if (transaction) {
        transaction.finish();
        delete navigationRef.current._sentryTransaction;
      }
    }
  });

  return null;
}

// 在你的导航容器中引入这个追踪组件
<NavigationContainer ref={navigationRef}>
  <NavigationSentryTracker />
  {/* 你的路由结构 */}
</NavigationContainer>

内容的提问来源于stack exchange,提问作者Stachu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:25:25