Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(instrumentation-react-native-navigation): Adding new instrumentation library to track navigation changes for React Native apps #2359

Open
wants to merge 35 commits into
base: main
Choose a base branch
from

Conversation

facostaembrace
Copy link

@facostaembrace facostaembrace commented Jul 30, 2024

Which problem is this PR solving?

A couple of months ago, my team (Embrace) and I were looking for an instrumentation library that creates telemetry data for React Native applications. However, we noticed there was nothing available that adhered to open source standards. We also noticed people in Stack Overflow was asking about something similar.
This instrumentation library exposes two components that can be implemented at the root of React Native applications to create telemetry data that tracks navigation changes for the most popular navigation approaches in this environment.
Instrumentation request here.

#1089

Short description of the changes

  • Introduce a new instrumentation library to kick off a React Native ecosystem.
  • Exposes two components: <NativeNavigationTracker /> that creates spans and track navigation changes for wix/react-native-navigation library, and <NavigationTracker /> that is meant to be used when the application handles the navigation using @react-navigation/native or expo-router.
  • Both components have the ability of adding a minimum set of configurations.
  • Both components receives a custom provider, but if it is not passed it can also create telemetry data using the global one.
  • Configuration for both allows to add static attributes for spans.

@facostaembrace facostaembrace requested a review from a team July 30, 2024 21:12
Copy link

linux-foundation-easycla bot commented Jul 30, 2024

CLA Signed

The committers listed above are authorized under a signed CLA.

@facostaembrace facostaembrace changed the title feat(instrumentation-react-native-navigation) Adding new instrumentation library to track navigation changes for React Native apps feat:(instrumentation-react-native-navigation) Adding new instrumentation library to track navigation changes for React Native apps Jul 30, 2024
@facostaembrace facostaembrace force-pushed the instrumentation-react-native-navigation branch from 7899a94 to 42ac15b Compare July 30, 2024 21:23
@facostaembrace facostaembrace changed the title feat:(instrumentation-react-native-navigation) Adding new instrumentation library to track navigation changes for React Native apps feat(instrumentation-react-native-navigation): Adding new instrumentation library to track navigation changes for React Native apps Jul 30, 2024
@facostaembrace facostaembrace force-pushed the instrumentation-react-native-navigation branch from 42ac15b to cc3c154 Compare July 30, 2024 21:33
@facostaembrace
Copy link
Author

facostaembrace commented Jul 31, 2024

Fyi: still pending to submit the Instrumentation request that introduces this initiative.
Update: done (request here)

@facostaembrace facostaembrace force-pushed the instrumentation-react-native-navigation branch from cc3c154 to f71bc35 Compare August 1, 2024 17:01
Copy link
Member

@JamieDanielson JamieDanielson left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We now have provided guidance for new instrumentations getting added to this repo. Ideally this could be hosted elsewhere, but we will need at minimum 2 codeowners before we can review.

@facostaembrace
Copy link
Author

Hi @JamieDanielson . Thanks for taking a look! Yes, I read that document before, but I still have a question about it. Should I add myself (and somebody else) as component owner? Or should this code owner be somebody already accepted by the community?

@JamieDanielson
Copy link
Member

Hi @JamieDanielson . Thanks for taking a look! Yes, I read that document before, but I still have a question about it. Should I add myself (and somebody else) as component owner? Or should this code owner be somebody already accepted by the community?

It is okay if you are the codeowner along with another person who will help review issues, maintain the instrumentation, etc. Hopefully you will become more a part of the community over time 😃 but it is not necessary to be a JS approver, for example. A main concern at the moment is that we are light on bandwidth for the amount of instrumentations being hosted here, so we want to ensure that new things being added have ownership by someone willing to maintain them. Please add yourself and another codeowner to .github/component_owners.yml. If you can have them comment here and also review the PR it will be helpful too.

@facostaembrace facostaembrace requested a review from a team as a code owner September 23, 2024 21:13
@JamieDanielson JamieDanielson dismissed their stale review October 9, 2024 16:09

Dismissing stale request for changes, PR is ready for review

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

was curious about the large diff here, is it all just coming from devDependencies added in plugins/node/instrumentation-react-native-navigation/package.json?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it seems like that, it's was all autogenerated. Started by a fresh state (by just running npm ci at the beginning of the implementation) + adding the devDependencies for the @opentelemenetry/instrumentation-react-native-navigation (and running the proper npm i) results in this big diff here

}), []);

return (
<NavigationTracker ref={navigationRef} provider={provider}>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I seemed to have hit a typing error when following this example:
"NavigationContainerRefWithCurrent<RootParamList> is not assignable to type LegacyRef<INavigationContainer> | undefined"

I was able to ignore and it seemed to function fine but wasn't sure if that was a known issue is something particular to my setup?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good catch! fixed

}
```

If you dig into the attributes, `view.launch` refers to the moment the app is launched. It will be `true` only the first time the app mounts. Changing the status between background/foreground won't modify this attribute. For this case the `view.state.end` is used, and it can contain two possible values: `active` and `background`.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there is technically a third "inactive" state that's possible on iOS which may be worth calling out here, see: https://reactnative.dev/docs/appstate#app-states

import { useMemo } from 'react';

const consoleStub = {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

curious if other instrumentations require similar configurable logging, may be useful to pull out into a resuable helper

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's a great idea, I would vote for revisit this initiative after this PR is merged to try to isolate this as a test helper

span.current.setAttributes({
// it should create the first span knowing there is not a previous view
[ATTRIBUTES.initialView]: !!isLaunch,
// it should set the view name in case it's useful have this as attr
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// it should set the view name in case it's useful have this as attr
// it should set the view name in case it's useful to have this as an attr

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

seems like this file was accidentally updated

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

true. reverting. thanks for catching this

Copy link

codecov bot commented Oct 30, 2024

Codecov Report

Attention: Patch coverage is 93.49112% with 11 lines in your changes missing coverage. Please review.

Project coverage is 90.91%. Comparing base (9a20e15) to head (51ad05f).
Report is 10 commits behind head on main.

Files with missing lines Patch % Lines
...ct-native-navigation/src/utils/hooks/useConsole.ts 55.55% 8 Missing ⚠️
...n-react-native-navigation/src/utils/spanFactory.ts 94.44% 2 Missing ⚠️
...native-navigation/src/hooks/useAppStateListener.ts 94.11% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2359      +/-   ##
==========================================
+ Coverage   90.85%   90.91%   +0.05%     
==========================================
  Files         159      166       +7     
  Lines        7853     8022     +169     
  Branches     1622     1657      +35     
==========================================
+ Hits         7135     7293     +158     
- Misses        718      729      +11     
Files with missing lines Coverage Δ
...navigation/src/hooks/useNativeNavigationTracker.ts 100.00% <100.00%> (ø)
...ative-navigation/src/hooks/useNavigationTracker.ts 100.00% <100.00%> (ø)
...ct-native-navigation/src/utils/hooks/useSpanRef.ts 100.00% <100.00%> (ø)
...-native-navigation/src/utils/hooks/useTracerRef.ts 100.00% <100.00%> (ø)
...native-navigation/src/hooks/useAppStateListener.ts 94.11% <94.11%> (ø)
...n-react-native-navigation/src/utils/spanFactory.ts 94.44% <94.44%> (ø)
...ct-native-navigation/src/utils/hooks/useConsole.ts 55.55% <55.55%> (ø)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants