Skip to content

[$250] [Awaiting payment 2026-02-03] Add Granular Telemetry Spans for App Startup Performance Tracking #79955

@mountiny

Description

@mountiny

Coming from here

Background:

The Expensify App currently tracks app startup performance using the BootsplashVisible span with four child spans: BootsplashVisibleOnyx, BootsplashVisibleLocale, BootsplashVisibleNavigation, and BootsplashVisibleHider. Each of these high-level spans encompasses multiple sub-operations - for example, BootsplashVisibleNavigation includes Pusher connection setup, navigation container readiness, and OpenApp API calls, while BootsplashVisibleLocale includes loading translation files and importing emoji data.

Problem

When engineers investigate slow app startup in Sentry and see that BootsplashVisible or its child spans took several seconds, if they lack granular data showing which specific sub-operations contributed to the total duration, then they cannot pinpoint the actual performance bottleneck or determine where optimization efforts should be focused.

Solution

Implement 9 new telemetry spans that break down the four existing high-level spans into their measurable sub-operations, focusing only on operations that consistently take longer than 100ms during testing.

  • BootsplashVisibleOnyx
    • ONYX_MIGRATIONS - Tracks Onyx database migrations (RenameReceiptFilename, RenameEmojiSkinTone, ConvertPolicyChatReportIDsToString)
  • BootsplashVisibleLocale
    • TRANSLATIONS_LOAD - Tracks loading locale-specific translation files via dynamic imports
    • EMOJI_IMPORT - Measures importing locale-specific emoji data
  • BootsplashVisibleNavigation
    • PUSHER_INIT - Tracks Pusher WebSocket connection initialization
    • APP_OPEN - Measures the OpenApp or ReconnectApp API call duration including network time and response processing
  • BootsplashVisible
    • ROOT_READY - Measures from NavigationRoot mount to the onReady callback firing
    • PUBLIC_ROOM_CHECK - Measures the overall time spent checking if a deep link leads to a public room
    • PUBLIC_ROOM_API - Specifically tracks the OpenReport API call made during that check for unauthenticated users (child of PUBLIC_ROOM_CHECK)
    • DEEP_LINK - Measures the time from calling Linking.getInitialURL() to finishing deep link processing
      Operations under 100ms (like IntlStore.load(), setLocale(), individual emoji trie building) are not instrumented to avoid telemetry overhead while focusing on the actual performance bottlenecks.

Draft PR
Spans measured on heavy account.

Upwork Automation - Do Not Edit
  • Upwork Job URL: https://www.upwork.com/jobs/~022018718451101455196
  • Upwork Job ID: 2018718451101455196
  • Last Price Increase: 2026-02-03
Issue OwnerCurrent Issue Owner: @

Metadata

Metadata

Labels

Awaiting PaymentAuto-added when associated PR is deployed to productionBugSomething is broken. Auto assigns a BugZero manager.DailyKSv2ExternalAdded to denote the issue can be worked on by a contributorTask

Type

No type

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions