newrelic 13.2.0 → 13.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NEWS.md +44 -0
- package/THIRD_PARTY_NOTICES.md +219 -8
- package/api.js +1 -1
- package/esm-loader.mjs +6 -1
- package/lib/instrumentation/@azure/functions.js +8 -46
- package/lib/instrumentation/core/http-outbound.js +26 -10
- package/lib/instrumentation/core/http.js +20 -118
- package/lib/instrumentations.js +0 -14
- package/lib/otel/logs/index.js +80 -0
- package/lib/otel/metrics/index.js +119 -0
- package/lib/otel/setup-signal.js +37 -0
- package/lib/otel/setup.js +15 -25
- package/lib/otel/{attr-reconciler.js → traces/attr-reconciler.js} +2 -2
- package/lib/otel/{exception-mapping.js → traces/exception-mapping.js} +1 -1
- package/lib/otel/traces/index.js +40 -0
- package/lib/otel/{rules.js → traces/rules.js} +1 -1
- package/lib/otel/{segment-synthesis.js → traces/segment-synthesis.js} +5 -4
- package/lib/otel/{segments → traces/segments}/consumer.js +4 -4
- package/lib/otel/{segments → traces/segments}/database.js +6 -6
- package/lib/otel/{segments → traces/segments}/http-external.js +11 -8
- package/lib/otel/traces/segments/index.js +22 -0
- package/lib/otel/{segments → traces/segments}/internal.js +1 -1
- package/lib/otel/{segments → traces/segments}/producer.js +2 -2
- package/lib/otel/{segments → traces/segments}/server.js +4 -4
- package/lib/otel/{segments → traces/segments}/utils.js +1 -1
- package/lib/otel/{span-processor.js → traces/span-processor.js} +13 -19
- package/lib/otel/{transformation-rules.json → traces/transformation-rules.json} +3 -2
- package/lib/otel/{utils.js → traces/utils.js} +2 -1
- package/lib/serverless/aws-lambda.js +7 -68
- package/lib/shim/webframework-shim/middleware.js +1 -1
- package/lib/shimmer.js +2 -2
- package/lib/subscriber-configs.js +2 -1
- package/lib/subscribers/base.js +30 -0
- package/lib/subscribers/elasticsearch/config.js +1 -0
- package/lib/subscribers/mcp-sdk/client-request.js +66 -0
- package/lib/subscribers/mcp-sdk/config.js +13 -75
- package/lib/subscribers/openai/base.js +21 -0
- package/lib/subscribers/openai/chat-responses.js +15 -0
- package/lib/subscribers/openai/chat.js +85 -0
- package/lib/subscribers/openai/client.js +31 -0
- package/lib/subscribers/openai/config.js +85 -0
- package/lib/subscribers/openai/embeddings.js +54 -0
- package/lib/subscribers/openai/utils.js +349 -0
- package/lib/transaction/index.js +157 -56
- package/lib/transaction/trace/segment.js +5 -2
- package/lib/util/urltils.js +158 -192
- package/lib/utilization/common.js +0 -6
- package/package.json +3 -4
- package/lib/instrumentation/openai.js +0 -482
- package/lib/otel/logs/bootstrap-logs.js +0 -84
- package/lib/otel/metrics/bootstrap-metrics.js +0 -117
- package/lib/otel/segments/index.js +0 -22
- package/lib/patch-module.js +0 -70
- package/lib/subscribers/mcp-sdk/client-prompt.js +0 -23
- package/lib/subscribers/mcp-sdk/client-resource.js +0 -24
- package/lib/subscribers/mcp-sdk/client-tool.js +0 -23
- package/lib/subscribers/mcp-sdk/client.js +0 -29
- /package/lib/otel/{constants.js → traces/constants.js} +0 -0
- /package/lib/otel/{sampler.js → traces/sampler.js} +0 -0
package/lib/patch-module.js
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2025 New Relic Corporation. All rights reserved.
|
|
3
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const { create } = require('@apm-js-collab/code-transformer')
|
|
7
|
-
const Module = require('node:module')
|
|
8
|
-
const parse = require('module-details-from-path')
|
|
9
|
-
const getPackageVersion = require('./util/get-package-version')
|
|
10
|
-
const logger = require('./logger').child({ component: 'ModulePatch' })
|
|
11
|
-
|
|
12
|
-
class ModulePatch {
|
|
13
|
-
constructor({ packages = new Set(), instrumentations = [] } = {}) {
|
|
14
|
-
this.packages = packages
|
|
15
|
-
this.instrumentator = create(instrumentations)
|
|
16
|
-
this.transformers = new Map()
|
|
17
|
-
this.resolve = Module._resolveFilename
|
|
18
|
-
this.compile = Module.prototype._compile
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Patches the Node.js module class methods that are responsible for resolving filePaths and compiling code.
|
|
23
|
-
* If a module is found that has an instrumentator, it will transform the code before compiling it
|
|
24
|
-
* with tracing channel methods.
|
|
25
|
-
*/
|
|
26
|
-
patch() {
|
|
27
|
-
const self = this
|
|
28
|
-
Module._resolveFilename = function wrappedResolveFileName() {
|
|
29
|
-
const resolvedName = self.resolve.apply(this, arguments)
|
|
30
|
-
const resolvedModule = parse(resolvedName)
|
|
31
|
-
if (resolvedModule && self.packages.has(resolvedModule.name)) {
|
|
32
|
-
const version = getPackageVersion(resolvedModule.basedir, resolvedModule.name)
|
|
33
|
-
const transformer = self.instrumentator.getTransformer(resolvedModule.name, version, resolvedModule.path)
|
|
34
|
-
if (transformer) {
|
|
35
|
-
self.transformers.set(resolvedName, transformer)
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return resolvedName
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
Module.prototype._compile = function wrappedCompile(...args) {
|
|
42
|
-
const [content, filename] = args
|
|
43
|
-
if (self.transformers.has(filename)) {
|
|
44
|
-
const transformer = self.transformers.get(filename)
|
|
45
|
-
try {
|
|
46
|
-
const transformedCode = transformer.transform(content, 'unknown')
|
|
47
|
-
args[0] = transformedCode
|
|
48
|
-
} catch (error) {
|
|
49
|
-
logger.error({ error }, `Error transforming module ${filename}`)
|
|
50
|
-
} finally {
|
|
51
|
-
transformer.free()
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
return self.compile.apply(this, args)
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Clears all the transformers and restores the original Module methods that were wrapped.
|
|
61
|
-
* **Note**: This is intended to be used in testing only.
|
|
62
|
-
*/
|
|
63
|
-
unpatch() {
|
|
64
|
-
this.transformers.clear()
|
|
65
|
-
Module._resolveFilename = this.resolve
|
|
66
|
-
Module.prototype._compile = this.compile
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
module.exports = ModulePatch
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2025 New Relic Corporation. All rights reserved.
|
|
3
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
'use strict'
|
|
7
|
-
|
|
8
|
-
const McpClientSubscriber = require('./client')
|
|
9
|
-
const { MCP } = require('../../metrics/names')
|
|
10
|
-
|
|
11
|
-
class McpClientPromptSubscriber extends McpClientSubscriber {
|
|
12
|
-
constructor({ agent, logger }) {
|
|
13
|
-
super({ agent, logger, channelName: 'nr_getPrompt' })
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
handler(data, ctx) {
|
|
17
|
-
const promptName = data?.arguments?.[0]?.name
|
|
18
|
-
this.segmentName = `${MCP.PROMPT}/getPrompt/${promptName}`
|
|
19
|
-
return super.handler(ctx)
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
module.exports = McpClientPromptSubscriber
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2025 New Relic Corporation. All rights reserved.
|
|
3
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
'use strict'
|
|
7
|
-
|
|
8
|
-
const McpClientSubscriber = require('./client')
|
|
9
|
-
const { MCP } = require('../../metrics/names')
|
|
10
|
-
|
|
11
|
-
class McpClientResourceSubscriber extends McpClientSubscriber {
|
|
12
|
-
constructor({ agent, logger }) {
|
|
13
|
-
super({ agent, logger, channelName: 'nr_readResource' })
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
handler(data, ctx) {
|
|
17
|
-
const uri = data?.arguments?.[0]?.uri
|
|
18
|
-
const scheme = typeof uri === 'string' ? uri.split('://')[0] : undefined
|
|
19
|
-
this.segmentName = `${MCP.RESOURCE}/readResource/${scheme}`
|
|
20
|
-
return super.handler(ctx)
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
module.exports = McpClientResourceSubscriber
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2025 New Relic Corporation. All rights reserved.
|
|
3
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
'use strict'
|
|
7
|
-
|
|
8
|
-
const McpClientSubscriber = require('./client')
|
|
9
|
-
const { MCP } = require('../../metrics/names')
|
|
10
|
-
|
|
11
|
-
class McpClientToolSubscriber extends McpClientSubscriber {
|
|
12
|
-
constructor({ agent, logger }) {
|
|
13
|
-
super({ agent, logger, channelName: 'nr_callTool' })
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
handler(data, ctx) {
|
|
17
|
-
const toolName = data?.arguments?.[0]?.name
|
|
18
|
-
this.segmentName = `${MCP.TOOL}/callTool/${toolName}`
|
|
19
|
-
return super.handler(ctx)
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
module.exports = McpClientToolSubscriber
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2025 New Relic Corporation. All rights reserved.
|
|
3
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
'use strict'
|
|
7
|
-
|
|
8
|
-
const Subscriber = require('../base')
|
|
9
|
-
|
|
10
|
-
class McpClientSubscriber extends Subscriber {
|
|
11
|
-
constructor({ agent, logger, channelName }) {
|
|
12
|
-
super({ agent, logger, packageName: '@modelcontextprotocol/sdk', channelName })
|
|
13
|
-
this.events = ['asyncEnd']
|
|
14
|
-
this.segmentName = 'Unknown'
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
get enabled() {
|
|
18
|
-
return super.enabled && this.config.ai_monitoring.enabled === true
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
handler(ctx) {
|
|
22
|
-
return this.createSegment({
|
|
23
|
-
name: this.segmentName,
|
|
24
|
-
ctx
|
|
25
|
-
})
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
module.exports = McpClientSubscriber
|
|
File without changes
|
|
File without changes
|