dd-trace 5.0.0-pre-58d2e20 → 5.0.0-pre-8a512a2
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/MIGRATING.md +0 -14
- package/package.json +19 -19
- package/packages/datadog-esbuild/index.js +109 -31
- package/packages/datadog-instrumentations/index.js +1 -0
- package/packages/datadog-instrumentations/src/aws-sdk.js +6 -2
- package/packages/datadog-instrumentations/src/couchbase.js +4 -4
- package/packages/datadog-instrumentations/src/fetch.js +24 -21
- package/packages/datadog-instrumentations/src/helpers/bundler-register.js +54 -0
- package/packages/datadog-instrumentations/src/helpers/hook.js +1 -4
- package/packages/datadog-instrumentations/src/helpers/hooks.js +4 -0
- package/packages/datadog-instrumentations/src/helpers/register.js +7 -2
- package/packages/datadog-instrumentations/src/http/client.js +41 -32
- package/packages/datadog-instrumentations/src/http2/client.js +1 -0
- package/packages/datadog-instrumentations/src/jest.js +63 -1
- package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -1
- package/packages/datadog-plugin-elasticsearch/src/index.js +1 -1
- package/packages/datadog-plugin-fetch/src/index.js +8 -13
- package/packages/datadog-plugin-graphql/src/execute.js +6 -4
- package/packages/datadog-plugin-http/src/client.js +25 -20
- package/packages/datadog-plugin-memcached/src/index.js +1 -1
- package/packages/datadog-plugin-mongodb-core/src/index.js +2 -2
- package/packages/datadog-plugin-mysql/src/index.js +1 -1
- package/packages/datadog-plugin-openai/src/index.js +13 -7
- package/packages/datadog-plugin-openai/src/services.js +13 -9
- package/packages/datadog-plugin-oracledb/src/index.js +1 -1
- package/packages/datadog-plugin-pg/src/index.js +1 -1
- package/packages/datadog-plugin-redis/src/index.js +1 -1
- package/packages/datadog-plugin-tedious/src/index.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/weak-hash-analyzer.js +11 -7
- package/packages/dd-trace/src/appsec/passport.js +1 -1
- package/packages/dd-trace/src/config.js +33 -15
- package/packages/dd-trace/src/external-logger/src/index.js +9 -1
- package/packages/dd-trace/src/external-logger/test/index.spec.js +1 -1
- package/packages/dd-trace/src/format.js +1 -1
- package/packages/dd-trace/src/opentelemetry/span.js +3 -1
- package/packages/dd-trace/src/opentracing/span_context.js +2 -1
- package/packages/dd-trace/src/plugin_manager.js +6 -1
- package/packages/dd-trace/src/plugins/index.js +2 -0
- package/packages/dd-trace/src/plugins/tracing.js +16 -9
- package/packages/dd-trace/src/plugins/util/ci.js +2 -1
- package/packages/dd-trace/src/profiling/exporters/agent.js +4 -1
- package/packages/dd-trace/src/proxy.js +2 -2
- package/packages/dd-trace/src/serverless.js +51 -7
- package/packages/dd-trace/src/service-naming/index.js +9 -13
- package/packages/dd-trace/src/service-naming/schemas/definition.js +4 -4
- package/packages/dd-trace/src/service-naming/schemas/util.js +2 -2
- package/packages/dd-trace/src/service-naming/schemas/v0/graphql.js +12 -0
- package/packages/dd-trace/src/service-naming/schemas/v0/index.js +2 -1
- package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +7 -7
- package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +29 -23
- package/packages/dd-trace/src/service-naming/schemas/v1/graphql.js +12 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/index.js +2 -1
- package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +8 -9
- package/packages/dd-trace/src/span_sampler.js +1 -1
- package/packages/dd-trace/src/telemetry/metrics.js +11 -1
- package/packages/diagnostics_channel/src/index.js +1 -1
- package/scripts/install_plugin_modules.js +1 -0
- package/packages/dd-trace/src/dcitm.js +0 -53
package/MIGRATING.md
CHANGED
|
@@ -29,20 +29,6 @@ switching to `jest-circus` to anyone still using `jest-jasmine2`.
|
|
|
29
29
|
|
|
30
30
|
We now support only Next.js 10.2 and up.
|
|
31
31
|
|
|
32
|
-
### W3C headers are now prioritized over Datadog headers
|
|
33
|
-
|
|
34
|
-
As we move towards open standards, we have decided to prioritize W3C Trace
|
|
35
|
-
Context headers over our own vendor-specific headers for context propagation
|
|
36
|
-
across services. For most applications this shouldn't change anything and
|
|
37
|
-
distributed tracing should continue to work seamlessly.
|
|
38
|
-
|
|
39
|
-
In some rare cases it's possible that some of the services involved in a trace
|
|
40
|
-
are not instrumented by Datadog at all which can cause spans within the trace to
|
|
41
|
-
become disconnected. While the data would still be available in the UI, the
|
|
42
|
-
relationship between spans would no longer be visible. This can be addressed by
|
|
43
|
-
restoring the previous behaviour using
|
|
44
|
-
`DD_TRACE_PROPAGATION_STYLE='datadog,tracecontext'`.
|
|
45
|
-
|
|
46
32
|
## 2.0 to 3.0
|
|
47
33
|
|
|
48
34
|
### Node 12 is no longer supported
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dd-trace",
|
|
3
|
-
"version": "5.0.0-pre-
|
|
3
|
+
"version": "5.0.0-pre-8a512a2",
|
|
4
4
|
"description": "Datadog APM tracing client for JavaScript",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"typings": "index.d.ts",
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"dependencies": {
|
|
69
69
|
"@datadog/native-appsec": "^3.2.0",
|
|
70
70
|
"@datadog/native-iast-rewriter": "2.0.1",
|
|
71
|
-
"@datadog/native-iast-taint-tracking": "
|
|
71
|
+
"@datadog/native-iast-taint-tracking": "1.5.0",
|
|
72
72
|
"@datadog/native-metrics": "^2.0.0",
|
|
73
73
|
"@datadog/pprof": "3.1.0",
|
|
74
74
|
"@datadog/sketches-js": "^2.1.0",
|
|
@@ -76,10 +76,10 @@
|
|
|
76
76
|
"@opentelemetry/core": "^1.14.0",
|
|
77
77
|
"crypto-randomuuid": "^1.0.0",
|
|
78
78
|
"diagnostics_channel": "^1.1.0",
|
|
79
|
-
"ignore": "^5.2.
|
|
80
|
-
"import-in-the-middle": "^1.
|
|
79
|
+
"ignore": "^5.2.4",
|
|
80
|
+
"import-in-the-middle": "^1.4.1",
|
|
81
81
|
"int64-buffer": "^0.1.9",
|
|
82
|
-
"ipaddr.js": "^2.0
|
|
82
|
+
"ipaddr.js": "^2.1.0",
|
|
83
83
|
"istanbul-lib-coverage": "3.2.0",
|
|
84
84
|
"koalas": "^1.0.2",
|
|
85
85
|
"limiter": "^1.1.4",
|
|
@@ -91,24 +91,24 @@
|
|
|
91
91
|
"methods": "^1.1.2",
|
|
92
92
|
"module-details-from-path": "^1.0.3",
|
|
93
93
|
"msgpack-lite": "^0.1.26",
|
|
94
|
-
"node-abort-controller": "^3.
|
|
94
|
+
"node-abort-controller": "^3.1.1",
|
|
95
95
|
"opentracing": ">=0.12.1",
|
|
96
96
|
"path-to-regexp": "^0.1.2",
|
|
97
97
|
"protobufjs": "^7.2.4",
|
|
98
|
-
"retry": "^0.
|
|
99
|
-
"semver": "^7.
|
|
98
|
+
"retry": "^0.13.1",
|
|
99
|
+
"semver": "^7.5.4"
|
|
100
100
|
},
|
|
101
101
|
"devDependencies": {
|
|
102
102
|
"@types/node": ">=16",
|
|
103
103
|
"autocannon": "^4.5.2",
|
|
104
104
|
"axios": "^0.21.2",
|
|
105
105
|
"benchmark": "^2.1.4",
|
|
106
|
-
"body-parser": "^1.
|
|
107
|
-
"chai": "^4.
|
|
108
|
-
"chalk": "^3.0
|
|
109
|
-
"checksum": "^0.
|
|
110
|
-
"cli-table3": "^0.
|
|
111
|
-
"dotenv": "
|
|
106
|
+
"body-parser": "^1.20.2",
|
|
107
|
+
"chai": "^4.3.7",
|
|
108
|
+
"chalk": "^5.3.0",
|
|
109
|
+
"checksum": "^1.0.0",
|
|
110
|
+
"cli-table3": "^0.6.3",
|
|
111
|
+
"dotenv": "16.3.1",
|
|
112
112
|
"esbuild": "0.16.12",
|
|
113
113
|
"eslint": "^8.23.0",
|
|
114
114
|
"eslint-config-standard": "^11.0.0-beta.0",
|
|
@@ -118,13 +118,13 @@
|
|
|
118
118
|
"eslint-plugin-node": "^5.2.1",
|
|
119
119
|
"eslint-plugin-promise": "^3.6.0",
|
|
120
120
|
"eslint-plugin-standard": "^3.0.1",
|
|
121
|
-
"express": "^4.
|
|
121
|
+
"express": "^4.18.2",
|
|
122
122
|
"get-port": "^3.2.0",
|
|
123
123
|
"glob": "^7.1.6",
|
|
124
124
|
"graphql": "0.13.2",
|
|
125
125
|
"jszip": "^3.5.0",
|
|
126
126
|
"knex": "^2.4.2",
|
|
127
|
-
"mkdirp": "^0.
|
|
127
|
+
"mkdirp": "^3.0.1",
|
|
128
128
|
"mocha": "8",
|
|
129
129
|
"multer": "^1.4.5-lts.1",
|
|
130
130
|
"nock": "^11.3.3",
|
|
@@ -132,9 +132,9 @@
|
|
|
132
132
|
"pprof-format": "^2.0.7",
|
|
133
133
|
"proxyquire": "^1.8.0",
|
|
134
134
|
"rimraf": "^3.0.0",
|
|
135
|
-
"sinon": "^
|
|
135
|
+
"sinon": "^15.2.0",
|
|
136
136
|
"sinon-chai": "^3.7.0",
|
|
137
|
-
"tap": "^16.3.
|
|
138
|
-
"tape": "^
|
|
137
|
+
"tap": "^16.3.7",
|
|
138
|
+
"tape": "^5.6.5"
|
|
139
139
|
}
|
|
140
140
|
}
|
|
@@ -2,73 +2,105 @@
|
|
|
2
2
|
|
|
3
3
|
/* eslint-disable no-console */
|
|
4
4
|
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
const instrumented = Object.keys(require('../datadog-instrumentations/src/helpers/hooks.js'))
|
|
8
|
-
const rawBuiltins = require('module').builtinModules
|
|
5
|
+
const instrumentations = require('../datadog-instrumentations/src/helpers/instrumentations.js')
|
|
6
|
+
const hooks = require('../datadog-instrumentations/src/helpers/hooks.js')
|
|
9
7
|
|
|
10
8
|
warnIfUnsupported()
|
|
11
9
|
|
|
10
|
+
for (const hook of Object.values(hooks)) {
|
|
11
|
+
hook()
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const modulesOfInterest = new Set()
|
|
15
|
+
|
|
16
|
+
for (const instrumentation of Object.values(instrumentations)) {
|
|
17
|
+
for (const entry of instrumentation) {
|
|
18
|
+
if (!entry.file) {
|
|
19
|
+
modulesOfInterest.add(entry.name) // e.g. "redis"
|
|
20
|
+
} else {
|
|
21
|
+
modulesOfInterest.add(`${entry.name}/${entry.file}`) // e.g. "redis/my/file.js"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const NAMESPACE = 'datadog'
|
|
27
|
+
const NM = 'node_modules/'
|
|
28
|
+
const INSTRUMENTED = Object.keys(instrumentations)
|
|
29
|
+
const RAW_BUILTINS = require('module').builtinModules
|
|
30
|
+
const CHANNEL = 'dd-trace:bundler:load'
|
|
31
|
+
|
|
12
32
|
const builtins = new Set()
|
|
13
33
|
|
|
14
|
-
for (const builtin of
|
|
34
|
+
for (const builtin of RAW_BUILTINS) {
|
|
15
35
|
builtins.add(builtin)
|
|
16
36
|
builtins.add(`node:${builtin}`)
|
|
17
37
|
}
|
|
18
38
|
|
|
19
|
-
const packagesOfInterest = new Set()
|
|
20
|
-
|
|
21
39
|
const DEBUG = !!process.env.DD_TRACE_DEBUG
|
|
22
40
|
|
|
23
|
-
// We don't want to handle any built-in packages
|
|
41
|
+
// We don't want to handle any built-in packages
|
|
24
42
|
// Those packages will still be handled via RITM
|
|
25
43
|
// Attempting to instrument them would fail as they have no package.json file
|
|
26
|
-
for (const pkg of
|
|
44
|
+
for (const pkg of INSTRUMENTED) {
|
|
27
45
|
if (builtins.has(pkg)) continue
|
|
28
46
|
if (pkg.startsWith('node:')) continue
|
|
29
|
-
|
|
47
|
+
modulesOfInterest.add(pkg)
|
|
30
48
|
}
|
|
31
49
|
|
|
32
|
-
const DC_CHANNEL = 'dd-trace:bundledModuleLoadStart'
|
|
33
|
-
|
|
34
50
|
module.exports.name = 'datadog-esbuild'
|
|
35
51
|
|
|
36
52
|
module.exports.setup = function (build) {
|
|
37
53
|
build.onResolve({ filter: /.*/ }, args => {
|
|
54
|
+
let fullPathToModule
|
|
55
|
+
try {
|
|
56
|
+
fullPathToModule = dotFriendlyResolve(args.path, args.resolveDir)
|
|
57
|
+
} catch (err) {
|
|
58
|
+
console.warn(`Unable to find "${args.path}". Is the package dead code?`)
|
|
59
|
+
return
|
|
60
|
+
}
|
|
61
|
+
const extracted = extractPackageAndModulePath(fullPathToModule)
|
|
38
62
|
const packageName = args.path
|
|
39
63
|
|
|
40
|
-
|
|
64
|
+
const internal = builtins.has(args.path)
|
|
65
|
+
|
|
66
|
+
if (args.namespace === 'file' && (
|
|
67
|
+
modulesOfInterest.has(packageName) || modulesOfInterest.has(`${extracted.pkg}/${extracted.path}`))
|
|
68
|
+
) {
|
|
41
69
|
// The file namespace is used when requiring files from disk in userland
|
|
42
70
|
|
|
43
71
|
let pathToPackageJson
|
|
44
72
|
try {
|
|
45
|
-
pathToPackageJson = require.resolve(`${
|
|
73
|
+
pathToPackageJson = require.resolve(`${extracted.pkg}/package.json`, { paths: [ args.resolveDir ] })
|
|
46
74
|
} catch (err) {
|
|
47
75
|
if (err.code === 'MODULE_NOT_FOUND') {
|
|
48
|
-
|
|
76
|
+
if (!internal) {
|
|
77
|
+
console.warn(`Unable to find "${extracted.pkg}/package.json". Is the package dead code?`)
|
|
78
|
+
}
|
|
49
79
|
return
|
|
50
80
|
} else {
|
|
51
81
|
throw err
|
|
52
82
|
}
|
|
53
83
|
}
|
|
54
84
|
|
|
55
|
-
const
|
|
85
|
+
const packageJson = require(pathToPackageJson)
|
|
56
86
|
|
|
57
|
-
if (DEBUG) {
|
|
58
|
-
console.log(`resolve ${packageName}@${pkg.version}`)
|
|
59
|
-
}
|
|
87
|
+
if (DEBUG) console.log(`RESOLVE ${packageName}@${packageJson.version}`)
|
|
60
88
|
|
|
61
89
|
// https://esbuild.github.io/plugins/#on-resolve-arguments
|
|
62
90
|
return {
|
|
63
|
-
path:
|
|
91
|
+
path: fullPathToModule,
|
|
64
92
|
namespace: NAMESPACE,
|
|
65
93
|
pluginData: {
|
|
66
|
-
version:
|
|
94
|
+
version: packageJson.version,
|
|
95
|
+
pkg: extracted.pkg,
|
|
96
|
+
path: extracted.path,
|
|
97
|
+
full: fullPathToModule,
|
|
98
|
+
raw: packageName,
|
|
99
|
+
internal
|
|
67
100
|
}
|
|
68
101
|
}
|
|
69
|
-
} else if (args.namespace ===
|
|
102
|
+
} else if (args.namespace === NAMESPACE) {
|
|
70
103
|
// The datadog namespace is used when requiring files that are injected during the onLoad stage
|
|
71
|
-
// see note in onLoad
|
|
72
104
|
|
|
73
105
|
if (builtins.has(packageName)) return
|
|
74
106
|
|
|
@@ -80,23 +112,28 @@ module.exports.setup = function (build) {
|
|
|
80
112
|
})
|
|
81
113
|
|
|
82
114
|
build.onLoad({ filter: /.*/, namespace: NAMESPACE }, args => {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
}
|
|
115
|
+
const data = args.pluginData
|
|
116
|
+
|
|
117
|
+
if (DEBUG) console.log(`LOAD ${data.pkg}@${data.version}, pkg "${data.path}"`)
|
|
118
|
+
|
|
119
|
+
const path = data.raw !== data.pkg
|
|
120
|
+
? `${data.pkg}/${data.path}`
|
|
121
|
+
: data.pkg
|
|
86
122
|
|
|
87
|
-
// JSON.stringify adds double quotes. For perf gain could simply add in quotes when we know it's safe.
|
|
88
123
|
const contents = `
|
|
89
124
|
const dc = require('diagnostics_channel');
|
|
90
|
-
const ch = dc.channel(${
|
|
91
|
-
const mod = require(${
|
|
125
|
+
const ch = dc.channel('${CHANNEL}');
|
|
126
|
+
const mod = require('${args.path}');
|
|
92
127
|
const payload = {
|
|
93
128
|
module: mod,
|
|
94
|
-
|
|
95
|
-
|
|
129
|
+
version: '${data.version}',
|
|
130
|
+
package: '${data.pkg}',
|
|
131
|
+
path: '${path}'
|
|
96
132
|
};
|
|
97
133
|
ch.publish(payload);
|
|
98
134
|
module.exports = payload.module;
|
|
99
135
|
`
|
|
136
|
+
|
|
100
137
|
// https://esbuild.github.io/plugins/#on-load-results
|
|
101
138
|
return {
|
|
102
139
|
contents,
|
|
@@ -121,3 +158,44 @@ function warnIfUnsupported () {
|
|
|
121
158
|
console.error('more recent version is used at runtime, third party packages won\'t be instrumented.')
|
|
122
159
|
}
|
|
123
160
|
}
|
|
161
|
+
|
|
162
|
+
// @see https://github.com/nodejs/node/issues/47000
|
|
163
|
+
function dotFriendlyResolve (path, directory) {
|
|
164
|
+
if (path === '.') {
|
|
165
|
+
path = './'
|
|
166
|
+
} else if (path === '..') {
|
|
167
|
+
path = '../'
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return require.resolve(path, { paths: [ directory ] })
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* For a given full path to a module,
|
|
175
|
+
* return the package name it belongs to and the local path to the module
|
|
176
|
+
* input: '/foo/node_modules/@co/stuff/foo/bar/baz.js'
|
|
177
|
+
* output: { pkg: '@co/stuff', path: 'foo/bar/baz.js' }
|
|
178
|
+
*/
|
|
179
|
+
function extractPackageAndModulePath (fullPath) {
|
|
180
|
+
const nm = fullPath.lastIndexOf(NM)
|
|
181
|
+
if (nm < 0) {
|
|
182
|
+
return { pkg: null, path: null }
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const subPath = fullPath.substring(nm + NM.length)
|
|
186
|
+
const firstSlash = subPath.indexOf('/')
|
|
187
|
+
|
|
188
|
+
if (subPath[0] === '@') {
|
|
189
|
+
const secondSlash = subPath.substring(firstSlash + 1).indexOf('/')
|
|
190
|
+
|
|
191
|
+
return {
|
|
192
|
+
pkg: subPath.substring(0, firstSlash + 1 + secondSlash),
|
|
193
|
+
path: subPath.substring(firstSlash + 1 + secondSlash + 1)
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return {
|
|
198
|
+
pkg: subPath.substring(0, firstSlash),
|
|
199
|
+
path: subPath.substring(firstSlash + 1)
|
|
200
|
+
}
|
|
201
|
+
}
|
|
@@ -177,7 +177,6 @@ addHook({ name: '@aws-sdk/smithy-client', versions: ['>=3'] }, smithy => {
|
|
|
177
177
|
})
|
|
178
178
|
|
|
179
179
|
addHook({ name: 'aws-sdk', versions: ['>=2.3.0'] }, AWS => {
|
|
180
|
-
shimmer.wrap(AWS.Request.prototype, 'promise', wrapRequest)
|
|
181
180
|
shimmer.wrap(AWS.config, 'setPromisesDependency', setPromisesDependency => {
|
|
182
181
|
return function wrappedSetPromisesDependency (dep) {
|
|
183
182
|
const result = setPromisesDependency.apply(this, arguments)
|
|
@@ -188,9 +187,14 @@ addHook({ name: 'aws-sdk', versions: ['>=2.3.0'] }, AWS => {
|
|
|
188
187
|
return AWS
|
|
189
188
|
})
|
|
190
189
|
|
|
190
|
+
addHook({ name: 'aws-sdk', file: 'lib/core.js', versions: ['>=2.3.0'] }, AWS => {
|
|
191
|
+
shimmer.wrap(AWS.Request.prototype, 'promise', wrapRequest)
|
|
192
|
+
return AWS
|
|
193
|
+
})
|
|
194
|
+
|
|
191
195
|
// <2.1.35 has breaking changes for instrumentation
|
|
192
196
|
// https://github.com/aws/aws-sdk-js/pull/629
|
|
193
|
-
addHook({ name: 'aws-sdk', versions: ['>=2.1.35'] }, AWS => {
|
|
197
|
+
addHook({ name: 'aws-sdk', file: 'lib/core.js', versions: ['>=2.1.35'] }, AWS => {
|
|
194
198
|
shimmer.wrap(AWS.Request.prototype, 'send', wrapRequest)
|
|
195
199
|
return AWS
|
|
196
200
|
})
|
|
@@ -160,7 +160,7 @@ function wrapV3Query (query) {
|
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
// semver >=2 <3
|
|
163
|
-
addHook({ name: 'couchbase', file: 'lib/bucket.js', versions: ['^2.6.
|
|
163
|
+
addHook({ name: 'couchbase', file: 'lib/bucket.js', versions: ['^2.6.12'] }, Bucket => {
|
|
164
164
|
const startCh = channel('apm:couchbase:query:start')
|
|
165
165
|
const finishCh = channel('apm:couchbase:query:finish')
|
|
166
166
|
const errorCh = channel('apm:couchbase:query:error')
|
|
@@ -208,7 +208,7 @@ addHook({ name: 'couchbase', file: 'lib/bucket.js', versions: ['^2.6.5'] }, Buck
|
|
|
208
208
|
return Bucket
|
|
209
209
|
})
|
|
210
210
|
|
|
211
|
-
addHook({ name: 'couchbase', file: 'lib/cluster.js', versions: ['^2.6.
|
|
211
|
+
addHook({ name: 'couchbase', file: 'lib/cluster.js', versions: ['^2.6.12'] }, Cluster => {
|
|
212
212
|
Cluster.prototype._maybeInvoke = wrapMaybeInvoke(Cluster.prototype._maybeInvoke)
|
|
213
213
|
Cluster.prototype.query = wrapQuery(Cluster.prototype.query)
|
|
214
214
|
|
|
@@ -217,7 +217,7 @@ addHook({ name: 'couchbase', file: 'lib/cluster.js', versions: ['^2.6.5'] }, Clu
|
|
|
217
217
|
|
|
218
218
|
// semver >=3 <3.2.0
|
|
219
219
|
|
|
220
|
-
addHook({ name: 'couchbase', file: 'lib/collection.js', versions: ['
|
|
220
|
+
addHook({ name: 'couchbase', file: 'lib/collection.js', versions: ['^3.0.7', '^3.1.3'] }, Collection => {
|
|
221
221
|
wrapAllNames(['upsert', 'insert', 'replace'], name => {
|
|
222
222
|
shimmer.wrap(Collection.prototype, name, wrapWithName(name))
|
|
223
223
|
})
|
|
@@ -225,7 +225,7 @@ addHook({ name: 'couchbase', file: 'lib/collection.js', versions: ['>=3.0.0 <3.2
|
|
|
225
225
|
return Collection
|
|
226
226
|
})
|
|
227
227
|
|
|
228
|
-
addHook({ name: 'couchbase', file: 'lib/cluster.js', versions: ['
|
|
228
|
+
addHook({ name: 'couchbase', file: 'lib/cluster.js', versions: ['^3.0.7', '^3.1.3'] }, Cluster => {
|
|
229
229
|
shimmer.wrap(Cluster.prototype, 'query', wrapV3Query)
|
|
230
230
|
return Cluster
|
|
231
231
|
})
|
|
@@ -17,29 +17,32 @@ function wrapFetch (fetch, Request) {
|
|
|
17
17
|
const headers = req.headers
|
|
18
18
|
const message = { req, headers }
|
|
19
19
|
|
|
20
|
-
startChannel.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
return res
|
|
32
|
-
},
|
|
33
|
-
err => {
|
|
34
|
-
if (err.name !== 'AbortError') {
|
|
35
|
-
errorChannel.publish(err)
|
|
36
|
-
}
|
|
20
|
+
return startChannel.runStores(message, () => {
|
|
21
|
+
// Request object is read-only so we need new objects to change headers.
|
|
22
|
+
arguments[0] = message.req
|
|
23
|
+
arguments[1] = { headers: message.headers }
|
|
24
|
+
|
|
25
|
+
return fetch.apply(this, arguments)
|
|
26
|
+
.then(
|
|
27
|
+
res => {
|
|
28
|
+
message.res = res
|
|
29
|
+
|
|
30
|
+
finishChannel.publish(message)
|
|
37
31
|
|
|
38
|
-
|
|
32
|
+
return res
|
|
33
|
+
},
|
|
34
|
+
err => {
|
|
35
|
+
if (err.name !== 'AbortError') {
|
|
36
|
+
message.error = err
|
|
37
|
+
errorChannel.publish(message)
|
|
38
|
+
}
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
finishChannel.publish(message)
|
|
41
|
+
|
|
42
|
+
throw err
|
|
43
|
+
}
|
|
44
|
+
)
|
|
45
|
+
})
|
|
43
46
|
}
|
|
44
47
|
}
|
|
45
48
|
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
// eslint-disable-next-line n/no-restricted-require
|
|
4
|
+
const dc = require('diagnostics_channel')
|
|
5
|
+
|
|
6
|
+
const {
|
|
7
|
+
filename,
|
|
8
|
+
loadChannel,
|
|
9
|
+
matchVersion
|
|
10
|
+
} = require('./register.js')
|
|
11
|
+
const hooks = require('./hooks')
|
|
12
|
+
const instrumentations = require('./instrumentations')
|
|
13
|
+
const log = require('../../../dd-trace/src/log')
|
|
14
|
+
|
|
15
|
+
const CHANNEL = 'dd-trace:bundler:load'
|
|
16
|
+
|
|
17
|
+
if (!dc.subscribe) {
|
|
18
|
+
dc.subscribe = (channel, cb) => {
|
|
19
|
+
dc.channel(channel).subscribe(cb)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (!dc.unsubscribe) {
|
|
23
|
+
dc.unsubscribe = (channel, cb) => {
|
|
24
|
+
if (dc.channel(channel).hasSubscribers) {
|
|
25
|
+
dc.channel(channel).unsubscribe(cb)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
dc.subscribe(CHANNEL, (payload) => {
|
|
31
|
+
try {
|
|
32
|
+
hooks[payload.package]()
|
|
33
|
+
} catch (err) {
|
|
34
|
+
log.error(`esbuild-wrapped ${payload.package} missing in list of hooks`)
|
|
35
|
+
throw err
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (!instrumentations[payload.package]) {
|
|
39
|
+
log.error(`esbuild-wrapped ${payload.package} missing in list of instrumentations`)
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
for (const { name, file, versions, hook } of instrumentations[payload.package]) {
|
|
44
|
+
if (payload.path !== filename(name, file)) continue
|
|
45
|
+
if (!matchVersion(payload.version, versions)) continue
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
loadChannel.publish({ name, version: payload.version, file })
|
|
49
|
+
payload.module = hook(payload.module, payload.version)
|
|
50
|
+
} catch (e) {
|
|
51
|
+
log.error(e)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
})
|
|
@@ -3,10 +3,9 @@
|
|
|
3
3
|
const path = require('path')
|
|
4
4
|
const iitm = require('../../../dd-trace/src/iitm')
|
|
5
5
|
const ritm = require('../../../dd-trace/src/ritm')
|
|
6
|
-
const dcitm = require('../../../dd-trace/src/dcitm')
|
|
7
6
|
|
|
8
7
|
/**
|
|
9
|
-
* This is called for every module that dd-trace supports instrumentation for
|
|
8
|
+
* This is called for every package/internal-module that dd-trace supports instrumentation for
|
|
10
9
|
* In practice, `modules` is always an array with a single entry.
|
|
11
10
|
*
|
|
12
11
|
* @param {string[]} modules list of modules to hook into
|
|
@@ -41,13 +40,11 @@ function Hook (modules, onrequire) {
|
|
|
41
40
|
return safeHook(moduleExports, moduleName, moduleBaseDir)
|
|
42
41
|
}
|
|
43
42
|
})
|
|
44
|
-
this._dcitmHook = dcitm(modules, {}, safeHook)
|
|
45
43
|
}
|
|
46
44
|
|
|
47
45
|
Hook.prototype.unhook = function () {
|
|
48
46
|
this._ritmHook.unhook()
|
|
49
47
|
this._iitmHook.unhook()
|
|
50
|
-
this._dcitmHook.unhook()
|
|
51
48
|
this._patched = Object.create(null)
|
|
52
49
|
}
|
|
53
50
|
|
|
@@ -11,6 +11,8 @@ module.exports = {
|
|
|
11
11
|
'@hapi/hapi': () => require('../hapi'),
|
|
12
12
|
'@jest/core': () => require('../jest'),
|
|
13
13
|
'@jest/reporters': () => require('../jest'),
|
|
14
|
+
'@jest/test-sequencer': () => require('../jest'),
|
|
15
|
+
'@jest/transform': () => require('../jest'),
|
|
14
16
|
'@koa/router': () => require('../koa'),
|
|
15
17
|
'@node-redis/client': () => require('../redis'),
|
|
16
18
|
'@opensearch-project/opensearch': () => require('../opensearch'),
|
|
@@ -38,6 +40,7 @@ module.exports = {
|
|
|
38
40
|
'find-my-way': () => require('../find-my-way'),
|
|
39
41
|
'fs': () => require('../fs'),
|
|
40
42
|
'node:fs': () => require('../fs'),
|
|
43
|
+
'generic-pool': () => require('../generic-pool'),
|
|
41
44
|
'graphql': () => require('../graphql'),
|
|
42
45
|
'grpc': () => require('../grpc'),
|
|
43
46
|
'hapi': () => require('../hapi'),
|
|
@@ -51,6 +54,7 @@ module.exports = {
|
|
|
51
54
|
'jest-environment-jsdom': () => require('../jest'),
|
|
52
55
|
'jest-jasmine2': () => require('../jest'),
|
|
53
56
|
'jest-worker': () => require('../jest'),
|
|
57
|
+
'knex': () => require('../knex'),
|
|
54
58
|
'koa': () => require('../koa'),
|
|
55
59
|
'koa-router': () => require('../koa'),
|
|
56
60
|
'kafkajs': () => require('../kafkajs'),
|
|
@@ -20,7 +20,9 @@ const disabledInstrumentations = new Set(
|
|
|
20
20
|
const loadChannel = channel('dd-trace:instrumentation:load')
|
|
21
21
|
|
|
22
22
|
// Globals
|
|
23
|
-
|
|
23
|
+
if (!disabledInstrumentations.has('fetch')) {
|
|
24
|
+
require('../fetch')
|
|
25
|
+
}
|
|
24
26
|
|
|
25
27
|
// TODO: make this more efficient
|
|
26
28
|
|
|
@@ -30,6 +32,7 @@ for (const packageName of names) {
|
|
|
30
32
|
Hook([packageName], (moduleExports, moduleName, moduleBaseDir, moduleVersion) => {
|
|
31
33
|
moduleName = moduleName.replace(pathSepExpr, '/')
|
|
32
34
|
|
|
35
|
+
// This executes the integration file thus adding its entries to `instrumentations`
|
|
33
36
|
hooks[packageName]()
|
|
34
37
|
|
|
35
38
|
if (!instrumentations[packageName]) {
|
|
@@ -74,5 +77,7 @@ function filename (name, file) {
|
|
|
74
77
|
|
|
75
78
|
module.exports = {
|
|
76
79
|
filename,
|
|
77
|
-
pathSepExpr
|
|
80
|
+
pathSepExpr,
|
|
81
|
+
loadChannel,
|
|
82
|
+
matchVersion
|
|
78
83
|
}
|