如何在Sentry中排除app.start.cold span,仅统计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
相关产品推荐
相关产品推荐

