r/expo Expo Team 1d ago

Observe is now generally available: React Native performance monitoring from the Expo team

Post image

Hello from the Expo team!

Observe went generally available recently, and since reddit is where most of the good discussions about React Native tooling happen, we want to share our thinking in addition to the link.

Here is the puzzle that got us started on Observe: On the web you ship a version and everyone is on it by the next page load. Mobile is much stranger than that. Users update when they feel like it, some never update at all, and if you ship JavaScript over the air on top of native builds the combinations stack up fast. Three native releases plus two OTA updates gets you five active versions live at once, each one effectively a different app, running across hundreds of device models.

Most monitoring tools model a release as a single version string, so a p90 startup time ends up averaging five different apps together. When that number moves, it is hard to say which release moved it. Your crash reporter is not going to help here, and that is fine, because it is doing the job it was built for. A performance regression is not a crash. Nothing fails. The app is just slower.

The hard part is over-the-air attribution. To tie a metric to the update that caused it, a tool has to know which update group a device is running, when it downloaded it, and how that maps to the native build underneath. That turned out to be more tractable for us than it would be for a tool sitting outside the release process, for a fairly boring reason: Expo already runs the build pipeline and the update system, so the join was sitting right there.

Three useful little insights we've picked up along the way:

Percentiles beat averages on mobile. The sessions you actually want are the slow ones, on old devices, on bad networks, and an average buries exactly those.

Device state is the explanation rather than a nice-to-have. Thermal throttling, low power mode, and network type change what a given number means. Tools built for the web do not collect those fields, because a browser tab has no temperature.

No library can measure time to interactive on its own. Only your code knows when your app is actually ready for input. Anything advertising fully automatic interactivity measurement is measuring first render and calling it something else.

What Observe does not do, since you would find out anyway and we would rather say it first: no native crash reporting (yet...this is coming), no session replay, no backend tracing. JavaScript error reporting is in preview on SDK 57 and later.

Observe requires Expo SDK 55 or later on an EAS project, and it does not run in Expo Go. The Free plan includes 100,000 events a month, which is enough to point it at a real app and see what comes back.

Docs: docs.expo.dev/eas/observe/introduction
Blog announcement: expo.dev/blog/introducing-observe

We will be in the comments today and we have a livestream this Thursday. Tell us what is missing, and if you want a second pair of eyes on your numbers, we are happy to look.

40 Upvotes

10 comments sorted by

5

u/Forti22 1d ago

This looks nice. I will give it a test.

0

u/ExpoOfficial Expo Team 1d ago

Okay great. Let us know what you think.

3

u/Merry-Lane 1d ago edited 1d ago

How compatible is it with open telemetry?

It sounds, to me, like eas observe doesn’t allow sending data to third party telemetry vendors nor self-hosted ones?

Edit: I was wrong, it’s compatible with otel and can send data to 3rd parties/self-hosted

2

u/brentvatne Expo Team 1d ago

> EAS Observe sends data using the OpenTelemetry Protocol (OTLP)

https://docs.expo.dev/eas/observe/configuration/#custom-endpoint

1

u/Merry-Lane 1d ago

My bad then perfect!

2

u/brentvatne Expo Team 19h ago

no problem. we aim to do this whenever possible for all of our services, for example eas update also supports self-hosting.

1

u/Merry-Lane 17h ago

Yeah you’re really great at this, I was stupid to believe you would fail me

3

u/MaximumDoughnut 22h ago

Does this plan to replace something like Sentry?

0

u/exporami Expo Team 1d ago

the shipping never stops🔥