Bluesky app fork with some witchin' additions 💫
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

[Statsig] Sample noisy events (#4288)

* Sample state:background and state:foreground

* Sample feed events

* Add DEV protection against forgetting to add events to the list

authored by

dan and committed by
GitHub
d6275e98 94312010

+41 -21
+5 -5
src/lib/statsig/events.ts
··· 20 20 context: 'StartOnboarding' | 'AfterOnboarding' | 'Login' 21 21 status: 'granted' | 'denied' | 'undetermined' 22 22 } 23 - 'state:background': { 23 + 'state:background:sampled': { 24 24 secondsActive: number 25 25 } 26 - 'state:foreground': {} 26 + 'state:foreground:sampled': {} 27 27 'router:navigate:sampled': {} 28 28 29 29 // Screen events ··· 57 57 'onboarding:finished:avatarResult': { 58 58 avatarResult: 'default' | 'created' | 'uploaded' 59 59 } 60 - 'home:feedDisplayed': { 60 + 'home:feedDisplayed:sampled': { 61 61 feedUrl: string 62 62 feedType: string 63 63 index: number 64 64 reason: 'focus' | 'tabbar-click' | 'pager-swipe' | 'desktop-sidebar-click' 65 65 } 66 - 'feed:endReached': { 66 + 'feed:endReached:sampled': { 67 67 feedUrl: string 68 68 feedType: string 69 69 itemCount: number 70 70 } 71 - 'feed:refresh': { 71 + 'feed:refresh:sampled': { 72 72 feedUrl: string 73 73 feedType: string 74 74 reason: 'pull-to-refresh' | 'soft-reset' | 'load-latest'
+17 -3
src/lib/statsig/statsig.tsx
··· 87 87 } 88 88 } 89 89 90 - const DOWNSAMPLED_EVENTS = new Set(['router:navigate:sampled']) 90 + const DOWNSAMPLED_EVENTS: Set<keyof LogEvents> = new Set([ 91 + 'router:navigate:sampled', 92 + 'state:background:sampled', 93 + 'state:foreground:sampled', 94 + 'home:feedDisplayed:sampled', 95 + 'feed:endReached:sampled', 96 + 'feed:refresh:sampled', 97 + ]) 91 98 const isDownsampledSession = Math.random() < 0.9 // 90% likely 92 99 93 100 export function logEvent<E extends keyof LogEvents>( ··· 97 104 try { 98 105 if (isDownsampledSession && DOWNSAMPLED_EVENTS.has(eventName)) { 99 106 return 107 + } 108 + if (process.env.NODE_ENV === 'development') { 109 + if (eventName.endsWith(':sampled')) { 110 + logger.error( 111 + 'Did you forget to add ' + eventName + ' to DOWNSAMPLED_EVENTS?', 112 + ) 113 + } 100 114 } 101 115 const fullMetadata = { 102 116 ...rawMetadata, ··· 199 213 lastState = state 200 214 if (state === 'active') { 201 215 lastActive = performance.now() 202 - logEvent('state:foreground', {}) 216 + logEvent('state:foreground:sampled', {}) 203 217 } else { 204 218 let secondsActive = 0 205 219 if (lastActive != null) { 206 220 secondsActive = Math.round((performance.now() - lastActive) / 1e3) 207 221 } 208 222 lastActive = null 209 - logEvent('state:background', { 223 + logEvent('state:background:sampled', { 210 224 secondsActive, 211 225 }) 212 226 }
+2 -2
src/view/com/feeds/FeedPage.tsx
··· 76 76 scrollToTop() 77 77 truncateAndInvalidate(queryClient, FEED_RQKEY(feed)) 78 78 setHasNew(false) 79 - logEvent('feed:refresh', { 79 + logEvent('feed:refresh:sampled', { 80 80 feedType: feed.split('|')[0], 81 81 feedUrl: feed, 82 82 reason: 'soft-reset', ··· 102 102 scrollToTop() 103 103 truncateAndInvalidate(queryClient, FEED_RQKEY(feed)) 104 104 setHasNew(false) 105 - logEvent('feed:refresh', { 105 + logEvent('feed:refresh:sampled', { 106 106 feedType: feed.split('|')[0], 107 107 feedUrl: feed, 108 108 reason: 'load-latest',
+3 -3
src/view/com/pager/Pager.tsx
··· 15 15 export interface PagerRef { 16 16 setPage: ( 17 17 index: number, 18 - reason: LogEvents['home:feedDisplayed']['reason'], 18 + reason: LogEvents['home:feedDisplayed:sampled']['reason'], 19 19 ) => void 20 20 } 21 21 ··· 32 32 onPageSelected?: (index: number) => void 33 33 onPageSelecting?: ( 34 34 index: number, 35 - reason: LogEvents['home:feedDisplayed']['reason'], 35 + reason: LogEvents['home:feedDisplayed:sampled']['reason'], 36 36 ) => void 37 37 onPageScrollStateChanged?: ( 38 38 scrollState: 'idle' | 'dragging' | 'settling', ··· 61 61 React.useImperativeHandle(ref, () => ({ 62 62 setPage: ( 63 63 index: number, 64 - reason: LogEvents['home:feedDisplayed']['reason'], 64 + reason: LogEvents['home:feedDisplayed:sampled']['reason'], 65 65 ) => { 66 66 pagerView.current?.setPage(index) 67 67 onPageSelecting?.(index, reason)
+6 -3
src/view/com/pager/Pager.web.tsx
··· 18 18 onPageSelected?: (index: number) => void 19 19 onPageSelecting?: ( 20 20 index: number, 21 - reason: LogEvents['home:feedDisplayed']['reason'], 21 + reason: LogEvents['home:feedDisplayed:sampled']['reason'], 22 22 ) => void 23 23 } 24 24 export const Pager = React.forwardRef(function PagerImpl( ··· 38 38 React.useImperativeHandle(ref, () => ({ 39 39 setPage: ( 40 40 index: number, 41 - reason: LogEvents['home:feedDisplayed']['reason'], 41 + reason: LogEvents['home:feedDisplayed:sampled']['reason'], 42 42 ) => { 43 43 onTabBarSelect(index, reason) 44 44 }, 45 45 })) 46 46 47 47 const onTabBarSelect = React.useCallback( 48 - (index: number, reason: LogEvents['home:feedDisplayed']['reason']) => { 48 + ( 49 + index: number, 50 + reason: LogEvents['home:feedDisplayed:sampled']['reason'], 51 + ) => { 49 52 const scrollY = window.scrollY 50 53 // We want to determine if the tabbar is already "sticking" at the top (in which 51 54 // case we should preserve and restore scroll), or if it is somewhere below in the
+2 -2
src/view/com/posts/Feed.tsx
··· 226 226 227 227 const onRefresh = React.useCallback(async () => { 228 228 track('Feed:onRefresh') 229 - logEvent('feed:refresh', { 229 + logEvent('feed:refresh:sampled', { 230 230 feedType: feedType, 231 231 feedUrl: feed, 232 232 reason: 'pull-to-refresh', ··· 244 244 const onEndReached = React.useCallback(async () => { 245 245 if (isFetching || !hasNextPage || isError) return 246 246 247 - logEvent('feed:endReached', { 247 + logEvent('feed:endReached:sampled', { 248 248 feedType: feedType, 249 249 feedUrl: feed, 250 250 itemCount: feedItems.length,
+6 -3
src/view/screens/Home.tsx
··· 99 99 useFocusEffect( 100 100 useNonReactiveCallback(() => { 101 101 if (selectedFeed) { 102 - logEvent('home:feedDisplayed', { 102 + logEvent('home:feedDisplayed:sampled', { 103 103 index: selectedIndex, 104 104 feedType: selectedFeed.split('|')[0], 105 105 feedUrl: selectedFeed, ··· 140 140 ) 141 141 142 142 const onPageSelecting = React.useCallback( 143 - (index: number, reason: LogEvents['home:feedDisplayed']['reason']) => { 143 + ( 144 + index: number, 145 + reason: LogEvents['home:feedDisplayed:sampled']['reason'], 146 + ) => { 144 147 const feed = allFeeds[index] 145 - logEvent('home:feedDisplayed', { 148 + logEvent('home:feedDisplayed:sampled', { 146 149 index, 147 150 feedType: feed.split('|')[0], 148 151 feedUrl: feed,