Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions packages/next/src/server/next.ts
Original file line number Diff line number Diff line change
Expand Up @@ -149,10 +149,13 @@ export class NextServer implements NextWrapperServer {
res: ServerResponse,
parsedUrl?: NextUrlWithParsedQuery
) => {
return getTracer().trace(NextServerSpan.getRequestHandler, async () => {
const requestHandler = await this.getServerRequestHandler()
return requestHandler(req, res, parsedUrl)
})
const tracer = getTracer()
return tracer.withPropagatedContext(req.headers, () =>
tracer.trace(NextServerSpan.getRequestHandler, async () => {
const requestHandler = await this.getServerRequestHandler()
return requestHandler(req, res, parsedUrl)
})
)
}
}

Expand All @@ -166,13 +169,13 @@ export class NextServer implements NextWrapperServer {
res: ServerResponse,
parsedUrl?: NextUrlWithParsedQuery
) => {
return getTracer().trace(
NextServerSpan.getRequestHandlerWithMetadata,
async () => {
const tracer = getTracer()
return tracer.withPropagatedContext(req.headers, () =>
tracer.trace(NextServerSpan.getRequestHandlerWithMetadata, async () => {
const server = await this.getServer()
const handler = server.getRequestHandlerWithMetadata(meta)
return handler(req, res, parsedUrl)
}
})
)
}
}
Expand Down
68 changes: 68 additions & 0 deletions test/e2e/opentelemetry/instrumentation/opentelemetry.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1159,6 +1159,74 @@ describe('opentelemetry', () => {
)
}
})
;(process.env.__NEXT_CACHE_COMPONENTS ? describe.skip : describe)(
'opentelemetry NEXT_OTEL_VERBOSE=1',
() => {
const { next, skipped } = nextTestSetup({
files: __dirname,
skipDeployment: true,
dependencies: require('./package.json').dependencies,
env: {
TEST_OTEL_COLLECTOR_PORT: String(COLLECTOR_PORT),
NEXT_TELEMETRY_DISABLED: '1',
NEXT_OTEL_VERBOSE: '1',
},
})

if (skipped) {
return
}

let collector: Collector | undefined

beforeEach(async () => {
collector = await connectCollector({ port: COLLECTOR_PORT })
})

afterEach(async () => {
await collector?.shutdown()
collector = undefined
})

// Regression for https://github.com/vercel/otel/issues/107.
it('all spans (including verbose) inherit traceId from incoming traceparent header', async () => {
const pathname = '/app/param/rsc-fetch'
await next.fetch(pathname, {
headers: {
traceparent: `00-${EXTERNAL.traceId}-${EXTERNAL.spanId}-01`,
},
})

let spans: SavedSpan[] = []
await retry(async () => {
const all = collector?.getSpans() ?? []
const root = all.find(
(s) =>
s.attributes?.['next.span_type'] === 'BaseServer.handleRequest' &&
s.attributes?.['http.target'] === pathname
)
expect(root).toBeDefined()
expect(root!.traceId).toBe(EXTERNAL.traceId)

spans = all.filter((s) => s.traceId === root!.traceId)
expect(spans.length).toBeGreaterThan(1)

const verbose = spans.find(
(s) =>
s.attributes?.['next.span_type'] === 'NextServer.getRequestHandler'
)
expect(verbose).toBeDefined()
expect(verbose!.traceId).toBe(EXTERNAL.traceId)
const parentSpanId = verbose!.parentId
expect(parentSpanId).toBe(EXTERNAL.spanId)
})

for (const span of spans) {
expect(span.traceId).toBe(EXTERNAL.traceId)
}
})
}
)

describe('opentelemetry with disabled fetch tracing', () => {
const { next, skipped } = nextTestSetup({
Expand Down
Loading