Skip to content

Commit

Permalink
Pass client trace metadata to client in pages router (#69620)
Browse files Browse the repository at this point in the history
  • Loading branch information
lforst authored Sep 10, 2024
1 parent 3113d80 commit 47072bf
Show file tree
Hide file tree
Showing 16 changed files with 361 additions and 157 deletions.
14 changes: 14 additions & 0 deletions packages/next/src/pages/_document.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ import {
import type { HtmlProps } from '../shared/lib/html-context.shared-runtime'
import { encodeURIPath } from '../shared/lib/encode-uri-path'
import type { DeepReadonly } from '../shared/lib/deep-readonly'
import { getTracer } from '../server/lib/trace/tracer'
import { getTracedMetadata } from '../server/lib/trace/utils'

export type { DocumentContext, DocumentInitialProps, DocumentProps }

Expand Down Expand Up @@ -758,6 +760,17 @@ export class Head extends React.Component<HeadProps> {
assetPrefix
)

const tracingMetadata = getTracedMetadata(
getTracer().getTracePropagationData(),
this.context.experimentalClientTraceMetadata
)

const traceMetaTags = (tracingMetadata || []).map(
({ key, value }, index) => (
<meta key={`next-trace-data-${index}`} name={key} content={value} />
)
)

return (
<head {...getHeadHTMLProps(this.props)}>
{this.context.isDevelopment && (
Expand Down Expand Up @@ -882,6 +895,7 @@ export class Head extends React.Component<HeadProps> {
// (by default, style-loader injects at the bottom of <head />)
<noscript id="__next_css__DO_NOT_USE__" />
)}
{traceMetaTags}
{styles || null}
</>
)}
Expand Down
6 changes: 2 additions & 4 deletions packages/next/src/server/app-render/app-render.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,7 @@ import { appendMutableCookies } from '../web/spec-extension/adapters/request-coo
import { createServerInsertedHTML } from './server-inserted-html'
import { getRequiredScripts } from './required-scripts'
import { addPathPrefix } from '../../shared/lib/router/utils/add-path-prefix'
import {
getTracedMetadata,
makeGetServerInsertedHTML,
} from './make-get-server-inserted-html'
import { makeGetServerInsertedHTML } from './make-get-server-inserted-html'
import { walkTreeWithFlightRouterState } from './walk-tree-with-flight-router-state'
import { createComponentTree } from './create-component-tree'
import { getAssetQueryString } from './get-asset-query-string'
Expand Down Expand Up @@ -156,6 +153,7 @@ import {
type PrerenderStore,
} from './prerender-async-storage.external'
import { CacheSignal } from './cache-signal'
import { getTracedMetadata } from '../lib/trace/utils'

export type GetDynamicParamFromSegment = (
// [slug] / [[slug]] / [...slug]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,6 @@ import { RedirectStatusCode } from '../../client/components/redirect-status-code
import { addPathPrefix } from '../../shared/lib/router/utils/add-path-prefix'
import type { ClientTraceDataEntry } from '../lib/trace/tracer'

export function getTracedMetadata(
traceData: ClientTraceDataEntry[],
clientTraceMetadata: string[] | undefined
): ClientTraceDataEntry[] | undefined {
if (!clientTraceMetadata) return undefined
return traceData.filter(({ key }) => clientTraceMetadata.includes(key))
}

export function makeGetServerInsertedHTML({
polyfills,
renderServerInsertedHTML,
Expand Down
13 changes: 13 additions & 0 deletions packages/next/src/server/lib/trace/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import type { ClientTraceDataEntry } from './tracer'

/**
* Takes OpenTelemetry client trace data and the `clientTraceMetadata` option configured in the Next.js config (currently
* experimental) and returns a filtered/allowed list of client trace data entries.
*/
export function getTracedMetadata(
traceData: ClientTraceDataEntry[],
clientTraceMetadata: string[] | undefined
): ClientTraceDataEntry[] | undefined {
if (!clientTraceMetadata) return undefined
return traceData.filter(({ key }) => clientTraceMetadata.includes(key))
}
5 changes: 5 additions & 0 deletions packages/next/src/server/render.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,9 @@ export type RenderOptsPartial = {
isExperimentalCompile?: boolean
isPrefetch?: boolean
swrDelta?: SwrDelta
experimental: {
clientTraceMetadata?: string[]
}
}

export type RenderOpts = LoadComponentsReturnType<PagesModule> &
Expand Down Expand Up @@ -1493,6 +1496,8 @@ export async function renderToHTMLImpl(
runtime: globalRuntime,
largePageDataBytes: renderOpts.largePageDataBytes,
nextFontManifest: renderOpts.nextFontManifest,
experimentalClientTraceMetadata:
renderOpts.experimental.clientTraceMetadata,
}

const document = (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ export type HtmlProps = {
hasConcurrentFeatures?: boolean
largePageDataBytes?: number
nextFontManifest?: DeepReadonly<NextFontManifest>
experimentalClientTraceMetadata?: string[]
}

export const HtmlContext = createContext<HtmlProps | undefined>(undefined)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ export default function StaticPage() {
return (
<>
<h1 id="static-page-header">Static Page</h1>
<Link href="/dynamic-page" id="go-to-dynamic-page">
<Link href="/app-router/dynamic-page" id="go-to-dynamic-page">
Go to dynamic page
</Link>
<Link href="/static-page-2" id="go-to-static-page">
<Link href="/app-router/static-page-2" id="go-to-static-page">
Go to static page
</Link>
</>
Expand Down
Loading

0 comments on commit 47072bf

Please sign in to comment.