Skip to content

Commit 162978d

Browse files
committed
set span status to Error when status code 500
1 parent c7fd524 commit 162978d

File tree

5 files changed

+25
-5
lines changed

5 files changed

+25
-5
lines changed

packages/next/src/server/app-render/create-error-handler.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ export function createFlightReactServerErrorHandler(
9191
const span = getTracer().getActiveScopeSpan()
9292
if (span) {
9393
span.recordException(err)
94+
span.setAttribute('error.type', err.message)
9495
span.setStatus({
9596
code: SpanStatusCode.ERROR,
9697
message: err.message,
@@ -164,6 +165,7 @@ export function createHTMLReactServerErrorHandler(
164165
const span = getTracer().getActiveScopeSpan()
165166
if (span) {
166167
span.recordException(err)
168+
span.setAttribute('error.type', err.message)
167169
span.setStatus({
168170
code: SpanStatusCode.ERROR,
169171
message: err.message,
@@ -244,6 +246,7 @@ export function createHTMLErrorHandler(
244246
const span = getTracer().getActiveScopeSpan()
245247
if (span) {
246248
span.recordException(err)
249+
span.setAttribute('error.type', err.message)
247250
span.setStatus({
248251
code: SpanStatusCode.ERROR,
249252
message: err.message,

packages/next/src/server/base-server.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,12 @@ import { AppRouteRouteMatcherProvider } from './route-matcher-providers/app-rout
9696
import { PagesAPIRouteMatcherProvider } from './route-matcher-providers/pages-api-route-matcher-provider'
9797
import { PagesRouteMatcherProvider } from './route-matcher-providers/pages-route-matcher-provider'
9898
import { ServerManifestLoader } from './route-matcher-providers/helpers/manifest-loaders/server-manifest-loader'
99-
import { getTracer, isBubbledError, SpanKind } from './lib/trace/tracer'
99+
import {
100+
getTracer,
101+
isBubbledError,
102+
SpanKind,
103+
SpanStatusCode,
104+
} from './lib/trace/tracer'
100105
import { BaseServerSpan } from './lib/trace/constants'
101106
import { I18NProvider } from './lib/i18n-provider'
102107
import { sendResponse } from './send-response'
@@ -896,6 +901,16 @@ export default abstract class Server<
896901
'next.rsc': isRSCRequest,
897902
})
898903

904+
if (res.statusCode && res.statusCode >= 500) {
905+
// For 5xx status codes: SHOULD be set to 'Error' span status.
906+
// x-ref: https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status
907+
span.setStatus({
908+
code: SpanStatusCode.ERROR,
909+
})
910+
// For span status 'Error', SHOULD set 'error.type' attribute.
911+
span.setAttribute('error.type', res.statusCode.toString())
912+
}
913+
899914
const rootSpanAttributes = tracer.getRootSpanAttributes()
900915
// We were unable to get attributes, probably OTEL is not enabled
901916
if (!rootSpanAttributes) return

packages/next/src/server/lib/trace/tracer.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ const closeSpanWithError = (span: Span, error?: Error) => {
5656
} else {
5757
if (error) {
5858
span.recordException(error)
59+
span.setAttribute('error.type', error.message)
5960
}
6061
span.setStatus({ code: SpanStatusCode.ERROR, message: error?.message })
6162
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
export default async function Page() {
2-
throw new Error('Error')
1+
export default function Page() {
2+
throw new Error('Error from Server Component')
33
}

test/e2e/opentelemetry/instrumentation/opentelemetry.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,7 @@ describe('opentelemetry', () => {
545545
'next.rsc': false,
546546
'next.span_name': 'GET /app/[param]/rsc-fetch/error',
547547
'next.span_type': 'BaseServer.handleRequest',
548+
'error.type': '500',
548549
},
549550
kind: 1,
550551
status: { code: 2 },
@@ -560,7 +561,7 @@ describe('opentelemetry', () => {
560561
'next.span_type': 'AppRender.getBodyResult',
561562
},
562563
kind: 0,
563-
status: { code: 2 },
564+
status: { code: 2, message: 'Error from Server Component' },
564565
spans: [
565566
{
566567
name: 'build component tree',
@@ -620,7 +621,7 @@ describe('opentelemetry', () => {
620621
},
621622
{
622623
attributes: {
623-
'next.clientComponentLoadCount': 8,
624+
'next.clientComponentLoadCount': isNextDev ? 9 : 8,
624625
'next.span_type':
625626
'NextNodeServer.clientComponentLoading',
626627
},

0 commit comments

Comments
 (0)