Skip to content

Commit 4057e80

Browse files
authored
chore: Copy OTEL status metadata to segment (#3613)
1 parent f42a501 commit 4057e80

File tree

5 files changed

+635
-2
lines changed

5 files changed

+635
-2
lines changed

lib/otel/traces/span-processor.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,13 @@ const SpanLink = require('#agentlib/spans/span-link.js')
1515
const TimedEvent = require('#agentlib/spans/timed-event.js')
1616
const normalizeTimestamp = require('../normalize-timestamp.js')
1717
const { otelSynthesis } = require('#agentlib/symbols.js')
18-
const { assignToTarget, buildRuleMappings, extractAttributeValue, processRegex, transformTemplate } = require('./utils.js')
18+
const {
19+
assignToTarget,
20+
buildRuleMappings,
21+
extractAttributeValue,
22+
processRegex,
23+
transformTemplate
24+
} = require('./utils.js')
1925
const defaultLogger = require('#agentlib/logger.js').child({ component: 'span-processor' })
2026

2127
const {
@@ -58,6 +64,19 @@ module.exports = class NrSpanProcessor {
5864
const { segment, transaction, rule } = span[otelSynthesis]
5965
const { instrumentationScope } = span
6066

67+
// OTEL spans have a status attribute. We copy this information over
68+
// to our agent attributes as informational metadata.
69+
let code
70+
switch (span.status.code) {
71+
case 0: { code = 'unset'; break }
72+
case 1: { code = 'ok'; break }
73+
case 2: { code = 'error'; break }
74+
}
75+
segment.addAttribute('status.code', code)
76+
if (code === 'error') {
77+
segment.addAttribute('status.description', span.status.message)
78+
}
79+
6180
// We always attach the instrumentation scope data as agent attributes
6281
// if the OTEL span has them set.
6382
// See https://opentelemetry.io/docs/specs/otel/common/mapping-to-non-otlp/#instrumentationscope

lib/spans/timed-event.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ class TimedEvent {
5151
}
5252
}
5353

54+
get [Symbol.toStringTag]() { return 'TimedEvent' }
55+
5456
getIntrinsicAttributes() {
5557
return this.intrinsics
5658
}

test/unit/lib/otel/fixtures/index.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,23 @@ const {
1313
} = require('./db-sql')
1414
const createSpan = require('./span')
1515
const createHttpClientSpan = require('./http-client')
16-
const { createRpcServerSpan, createHttpServerSpan } = require('./server')
16+
const {
17+
createFallbackServer,
18+
createRpcServerSpan,
19+
createHttpServerSpan,
20+
createHttpServer1dot23Span
21+
} = require('./server')
1722
const { createProducerSpan } = require('./producer')
1823
const { createConsumerSpan } = require('./consumer')
1924

2025
module.exports = {
2126
createConsumerSpan,
2227
createDbSpan,
2328
createDbClientSpan,
29+
createFallbackServer,
2430
createHttpClientSpan,
2531
createHttpServerSpan,
32+
createHttpServer1dot23Span,
2633
createMemcachedDbSpan,
2734
createMongoDbSpan,
2835
createRedisDbSpan,

test/unit/lib/otel/fixtures/server.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,18 @@ const createSpan = require('./span')
1010

1111
const {
1212
ATTR_HTTP_METHOD,
13+
ATTR_HTTP_REQUEST_METHOD,
1314
ATTR_HTTP_ROUTE,
1415
ATTR_HTTP_URL,
1516
ATTR_RPC_METHOD,
1617
ATTR_RPC_SERVICE,
1718
ATTR_RPC_SYSTEM,
1819
} = require('#agentlib/otel/traces/constants.js')
1920

21+
function createFallbackServer({ tracer, name = 'test-span', spanContext }) {
22+
return createSpan({ name, kind: SpanKind.SERVER, tracer, spanContext })
23+
}
24+
2025
function createRpcServerSpan({ tracer, name = 'test-span', spanContext }) {
2126
const span = createSpan({ name, kind: SpanKind.SERVER, tracer, spanContext })
2227
span.setAttribute(ATTR_RPC_SYSTEM, 'grpc')
@@ -33,7 +38,17 @@ function createHttpServerSpan({ tracer, name = 'test-span', spanContext }) {
3338
return span
3439
}
3540

41+
function createHttpServer1dot23Span({ tracer, name = 'test-span', spanContext }) {
42+
const span = createSpan({ name, kind: SpanKind.SERVER, tracer, spanContext })
43+
span.setAttribute(ATTR_HTTP_REQUEST_METHOD, 'PUT')
44+
span.setAttribute(ATTR_HTTP_ROUTE, '/user/:id')
45+
span.setAttribute(ATTR_HTTP_URL, '/user/1')
46+
return span
47+
}
48+
3649
module.exports = {
50+
createFallbackServer,
3751
createHttpServerSpan,
52+
createHttpServer1dot23Span,
3853
createRpcServerSpan
3954
}

0 commit comments

Comments
 (0)