Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 1.8k
feat(nextjs): Connect trace between data-fetching methods and pageload#5655
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
Uh oh!
There was an error while loading. Please reload this page.
Changes from all commits
d54314fb91ff5031c51e65b310ddfaaba120f205ecdf1d3d93f192f75a76709663f765cee6dc35c86e9a019751bFile filter
Filter by extension
Conversations
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Uh oh!
There was an error while loading. Please reload this page.
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -22,20 +22,14 @@ type StartTransactionCb = (context: TransactionContext) => Transaction | undefin | ||
| * Describes data located in the __NEXT_DATA__ script tag. This tag is present on every page of a Next.js app. | ||
| */ | ||
| interface SentryEnhancedNextData extends NextData { | ||
| // contains props returned by `getInitialProps` - except for `pageProps`, these are the props that got returned by `getServerSideProps` or `getStaticProps` | ||
| props: { | ||
| _sentryGetInitialPropsTraceData?: string; // trace parent info, if injected by server-side `getInitialProps` | ||
| _sentryGetInitialPropsBaggage?: string; // baggage, if injected by server-side `getInitialProps` | ||
Comment on lines
-25
to
-28
ContributorAuthor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I got this wrong in a previous PR | ||
| pageProps?: { | ||
| _sentryGetServerSidePropsTraceData?: string; // trace parent info, if injected by server-side `getServerSideProps` | ||
| _sentryGetServerSidePropsBaggage?: string; // baggage, if injected by server-side `getServerSideProps` | ||
| // The following two values are only injected in a very special case with the following conditions: | ||
| _sentryTraceData?: string; // trace parent info, if injected by a data-fetcher | ||
| _sentryBaggage?: string; // baggage, if injected by a data-fetcher | ||
| // These two values are only injected by `getStaticProps` in a very special case with the following conditions: | ||
| // 1. The page's `getStaticPaths` method must have returned `fallback: 'blocking'`. | ||
| // 2. The requested page must be a "miss" in terms of "Incremental Static Regeneration", meaning the requested page has not been generated before. | ||
| // In this case, a page is requested and only served when `getStaticProps` is done. There is not even a fallback page or similar. | ||
| _sentryGetStaticPropsTraceData?: string; // trace parent info, if injected by server-side `getStaticProps` | ||
| _sentryGetStaticPropsBaggage?: string; // baggage, if injected by server-side `getStaticProps` | ||
| }; | ||
| }; | ||
| } | ||
| @@ -79,29 +73,19 @@ function extractNextDataTagInformation(): NextDataTagInfo { | ||
| const { page, query, props } = nextData; | ||
| // `nextData.page` always contains the parameterized route | ||
| // `nextData.page` always contains the parameterized route - except for when an error occurs in a data fetching | ||
| // function, then it is "/_error", but that isn't a problem since users know which route threw by looking at the | ||
| // parent transaction | ||
| nextDataTagInfo.route = page; | ||
| nextDataTagInfo.params = query; | ||
| if (props) { | ||
| const { pageProps } = props; | ||
| const getInitialPropsBaggage = props._sentryGetInitialPropsBaggage; | ||
| const getServerSidePropsBaggage = pageProps && pageProps._sentryGetServerSidePropsBaggage; | ||
| const getStaticPropsBaggage = pageProps && pageProps._sentryGetStaticPropsBaggage; | ||
| // Ordering of the following shouldn't matter but `getInitialProps` generally runs before `getServerSideProps` or `getStaticProps` so we give it priority. | ||
| const baggage = getInitialPropsBaggage || getServerSidePropsBaggage || getStaticPropsBaggage; | ||
| if (baggage) { | ||
| nextDataTagInfo.baggage = baggage; | ||
| if (props && props.pageProps) { | ||
| if (props.pageProps._sentryBaggage) { | ||
| nextDataTagInfo.baggage = props.pageProps._sentryBaggage; | ||
| } | ||
| const getInitialPropsTraceData = props._sentryGetInitialPropsTraceData; | ||
| const getServerSidePropsTraceData = pageProps && pageProps._sentryGetServerSidePropsTraceData; | ||
| const getStaticPropsTraceData = pageProps && pageProps._sentryGetStaticPropsTraceData; | ||
| // Ordering of the following shouldn't matter but `getInitialProps` generally runs before `getServerSideProps` or `getStaticProps` so we give it priority. | ||
| const traceData = getInitialPropsTraceData || getServerSidePropsTraceData || getStaticPropsTraceData; | ||
| if (traceData) { | ||
| nextDataTagInfo.traceParentData = extractTraceparentData(traceData); | ||
| if (props.pageProps._sentryTraceData) { | ||
| nextDataTagInfo.traceParentData = extractTraceparentData(props.pageProps._sentryTraceData); | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| const WithInitialPropsPage = ({ data }: { data: string }) => <h1>WithInitialPropsPage {data}</h1>; | ||
| WithInitialPropsPage.getInitialProps = () => { | ||
| return { data: '[some getInitialProps data]' }; | ||
| }; | ||
| export default WithInitialPropsPage; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| const WithServerSidePropsPage = ({ data }: { data: string }) => <h1>WithServerSidePropsPage {data}</h1>; | ||
| export async function getServerSideProps() { | ||
| return { props: { data: '[some getServerSideProps data]' } }; | ||
| } | ||
| export default WithServerSidePropsPage; |
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why did you choose to wrap this line in a function? (Same goes for the setter.)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't know to be honest. It just made sense to me to put this behind a little bit of abstraction to provide more context why this field exists on the
reqobject. Feel free to remove it in the future though! I think the ambient type (declare module 'http' {at the top of the file) provides enough context.