dd-trace 1.5.1 → 1.6.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/ci/cypress/plugin.js +3 -0
- package/ci/cypress/support.js +1 -0
- package/ci/init.js +9 -0
- package/ci/jest/env.js +10 -0
- package/index.d.ts +4 -4
- package/package.json +3 -3
- package/packages/datadog-plugin-cucumber/src/index.js +2 -0
- package/packages/datadog-plugin-cypress/src/plugin.js +5 -3
- package/packages/datadog-plugin-jest/src/jest-environment.js +5 -1
- package/packages/datadog-plugin-jest/src/jest-jasmine2.js +11 -2
- package/packages/datadog-plugin-mocha/src/index.js +3 -1
- package/packages/datadog-plugin-redis/src/index.js +31 -1
- package/packages/dd-trace/lib/version.js +1 -1
- package/packages/dd-trace/src/plugins/util/ci.js +22 -9
- package/packages/dd-trace/src/plugins/util/git.js +11 -25
- package/packages/dd-trace/src/plugins/util/redis.js +0 -2
- package/packages/dd-trace/src/plugins/util/test.js +9 -0
- package/packages/dd-trace/src/plugins/util/user-provided-git.js +72 -0
- package/packages/dd-trace/src/priority_sampler.js +20 -15
- package/packages/dd-trace/src/profiling/exporters/agent.js +3 -3
- package/packages/dd-trace/src/.DS_Store +0 -0
- package/packages/dd-trace/src/plugins/util/ci-app-spec.json +0 -35
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require('../../packages/datadog-plugin-cypress/src/support')
|
package/ci/init.js
ADDED
package/ci/jest/env.js
ADDED
package/index.d.ts
CHANGED
|
@@ -978,12 +978,12 @@ declare namespace plugins {
|
|
|
978
978
|
/**
|
|
979
979
|
* Configuration for HTTP clients.
|
|
980
980
|
*/
|
|
981
|
-
client?: HttpClient,
|
|
981
|
+
client?: HttpClient | boolean,
|
|
982
982
|
|
|
983
983
|
/**
|
|
984
984
|
* Configuration for HTTP servers.
|
|
985
985
|
*/
|
|
986
|
-
server?: HttpServer
|
|
986
|
+
server?: HttpServer | boolean
|
|
987
987
|
|
|
988
988
|
/**
|
|
989
989
|
* Hooks to run before spans are finished.
|
|
@@ -1012,12 +1012,12 @@ declare namespace plugins {
|
|
|
1012
1012
|
/**
|
|
1013
1013
|
* Configuration for HTTP clients.
|
|
1014
1014
|
*/
|
|
1015
|
-
client?: Http2Client,
|
|
1015
|
+
client?: Http2Client | boolean,
|
|
1016
1016
|
|
|
1017
1017
|
/**
|
|
1018
1018
|
* Configuration for HTTP servers.
|
|
1019
1019
|
*/
|
|
1020
|
-
server?: Http2Server
|
|
1020
|
+
server?: Http2Server | boolean
|
|
1021
1021
|
}
|
|
1022
1022
|
|
|
1023
1023
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dd-trace",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "Datadog APM tracing client for JavaScript",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"typings": "index.d.ts",
|
|
@@ -56,10 +56,10 @@
|
|
|
56
56
|
"node": ">=12"
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@datadog/native-metrics": "^1.0
|
|
59
|
+
"@datadog/native-metrics": "^1.1.0",
|
|
60
60
|
"@datadog/pprof": "^0.3.0",
|
|
61
61
|
"@datadog/sketches-js": "^1.0.4",
|
|
62
|
-
"@types/node": "
|
|
62
|
+
"@types/node": ">=12",
|
|
63
63
|
"crypto-randomuuid": "^1.0.0",
|
|
64
64
|
"form-data": "^3.0.0",
|
|
65
65
|
"import-in-the-middle": "^1.1.2",
|
|
@@ -5,6 +5,7 @@ const {
|
|
|
5
5
|
TEST_NAME,
|
|
6
6
|
TEST_SUITE,
|
|
7
7
|
TEST_STATUS,
|
|
8
|
+
TEST_FRAMEWORK_VERSION,
|
|
8
9
|
TEST_SKIP_REASON,
|
|
9
10
|
CI_APP_ORIGIN,
|
|
10
11
|
ERROR_MESSAGE,
|
|
@@ -52,6 +53,7 @@ function createWrapRun (tracer, testEnvironmentMetadata, sourceRoot, setStatus)
|
|
|
52
53
|
[TEST_NAME]: testName,
|
|
53
54
|
[TEST_SUITE]: testSuite,
|
|
54
55
|
[SAMPLING_RULE_DECISION]: 1,
|
|
56
|
+
[TEST_FRAMEWORK_VERSION]: tracer._version,
|
|
55
57
|
...testEnvironmentMetadata
|
|
56
58
|
}
|
|
57
59
|
|
|
@@ -3,6 +3,7 @@ const {
|
|
|
3
3
|
TEST_NAME,
|
|
4
4
|
TEST_SUITE,
|
|
5
5
|
TEST_STATUS,
|
|
6
|
+
TEST_FRAMEWORK_VERSION,
|
|
6
7
|
getTestEnvironmentMetadata,
|
|
7
8
|
CI_APP_ORIGIN,
|
|
8
9
|
getTestParentSpan
|
|
@@ -19,7 +20,7 @@ const CYPRESS_STATUS_TO_TEST_STATUS = {
|
|
|
19
20
|
skipped: 'skip'
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
function getTestSpanMetadata (tracer, testName, testSuite) {
|
|
23
|
+
function getTestSpanMetadata (tracer, testName, testSuite, cypressConfig) {
|
|
23
24
|
const childOf = getTestParentSpan(tracer)
|
|
24
25
|
|
|
25
26
|
return {
|
|
@@ -29,7 +30,8 @@ function getTestSpanMetadata (tracer, testName, testSuite) {
|
|
|
29
30
|
[TEST_NAME]: testName,
|
|
30
31
|
[TEST_SUITE]: testSuite,
|
|
31
32
|
[SAMPLING_RULE_DECISION]: 1,
|
|
32
|
-
[SAMPLING_PRIORITY]: AUTO_KEEP
|
|
33
|
+
[SAMPLING_PRIORITY]: AUTO_KEEP,
|
|
34
|
+
[TEST_FRAMEWORK_VERSION]: cypressConfig.version
|
|
33
35
|
}
|
|
34
36
|
}
|
|
35
37
|
|
|
@@ -50,7 +52,7 @@ module.exports = (on, config) => {
|
|
|
50
52
|
childOf,
|
|
51
53
|
resource,
|
|
52
54
|
...testSpanMetadata
|
|
53
|
-
} = getTestSpanMetadata(tracer, testName, testSuite)
|
|
55
|
+
} = getTestSpanMetadata(tracer, testName, testSuite, config)
|
|
54
56
|
|
|
55
57
|
if (!activeSpan) {
|
|
56
58
|
activeSpan = tracer.startSpan('cypress.test', {
|
|
@@ -5,6 +5,8 @@ const {
|
|
|
5
5
|
TEST_NAME,
|
|
6
6
|
TEST_SUITE,
|
|
7
7
|
TEST_STATUS,
|
|
8
|
+
TEST_FRAMEWORK_VERSION,
|
|
9
|
+
JEST_TEST_RUNNER,
|
|
8
10
|
ERROR_MESSAGE,
|
|
9
11
|
ERROR_TYPE,
|
|
10
12
|
TEST_PARAMETERS,
|
|
@@ -138,7 +140,9 @@ function createHandleTestEvent (tracer, testEnvironmentMetadata, instrumenter) {
|
|
|
138
140
|
const spanTags = {
|
|
139
141
|
...commonSpanTags,
|
|
140
142
|
[TEST_NAME]: testName,
|
|
141
|
-
[TEST_SUITE]: this.testSuite
|
|
143
|
+
[TEST_SUITE]: this.testSuite,
|
|
144
|
+
[TEST_FRAMEWORK_VERSION]: tracer._version,
|
|
145
|
+
[JEST_TEST_RUNNER]: 'jest-circus'
|
|
142
146
|
}
|
|
143
147
|
|
|
144
148
|
const testParametersString = getTestParametersString(nameToParams, event.test.name)
|
|
@@ -5,6 +5,8 @@ const {
|
|
|
5
5
|
TEST_NAME,
|
|
6
6
|
TEST_SUITE,
|
|
7
7
|
TEST_STATUS,
|
|
8
|
+
TEST_FRAMEWORK_VERSION,
|
|
9
|
+
JEST_TEST_RUNNER,
|
|
8
10
|
CI_APP_ORIGIN,
|
|
9
11
|
getTestEnvironmentMetadata,
|
|
10
12
|
finishAllTraceSpans,
|
|
@@ -29,7 +31,12 @@ function createWrapIt (tracer, globalConfig, globalInput, testEnvironmentMetadat
|
|
|
29
31
|
{
|
|
30
32
|
type: 'test',
|
|
31
33
|
childOf,
|
|
32
|
-
tags: {
|
|
34
|
+
tags: {
|
|
35
|
+
...commonSpanTags,
|
|
36
|
+
[TEST_SUITE]: testSuite,
|
|
37
|
+
[TEST_FRAMEWORK_VERSION]: tracer._version,
|
|
38
|
+
[JEST_TEST_RUNNER]: 'jest-jasmine2'
|
|
39
|
+
}
|
|
33
40
|
},
|
|
34
41
|
async (done) => {
|
|
35
42
|
const testSpan = tracer.scope().active()
|
|
@@ -124,7 +131,9 @@ function createWrapItSkip (tracer, globalConfig, globalInput, testEnvironmentMet
|
|
|
124
131
|
[RESOURCE_NAME]: resource,
|
|
125
132
|
[TEST_NAME]: testName,
|
|
126
133
|
[TEST_SUITE]: testSuite,
|
|
127
|
-
[TEST_STATUS]: 'skip'
|
|
134
|
+
[TEST_STATUS]: 'skip',
|
|
135
|
+
[TEST_FRAMEWORK_VERSION]: tracer._version,
|
|
136
|
+
[JEST_TEST_RUNNER]: 'jest-jasmine2'
|
|
128
137
|
}
|
|
129
138
|
}
|
|
130
139
|
)
|
|
@@ -9,6 +9,7 @@ const {
|
|
|
9
9
|
TEST_SUITE,
|
|
10
10
|
TEST_STATUS,
|
|
11
11
|
TEST_PARAMETERS,
|
|
12
|
+
TEST_FRAMEWORK_VERSION,
|
|
12
13
|
CI_APP_ORIGIN,
|
|
13
14
|
getTestEnvironmentMetadata,
|
|
14
15
|
getTestParametersString,
|
|
@@ -31,7 +32,8 @@ function getTestSpanMetadata (tracer, test, sourceRoot) {
|
|
|
31
32
|
[TEST_NAME]: fullTestName,
|
|
32
33
|
[TEST_SUITE]: testSuite,
|
|
33
34
|
[SAMPLING_RULE_DECISION]: 1,
|
|
34
|
-
[SAMPLING_PRIORITY]: AUTO_KEEP
|
|
35
|
+
[SAMPLING_PRIORITY]: AUTO_KEEP,
|
|
36
|
+
[TEST_FRAMEWORK_VERSION]: tracer._version
|
|
35
37
|
}
|
|
36
38
|
}
|
|
37
39
|
|
|
@@ -1,7 +1,25 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
+
// TODO: always use uppercase for command names
|
|
4
|
+
|
|
3
5
|
const tx = require('../../dd-trace/src/plugins/util/redis')
|
|
4
6
|
|
|
7
|
+
function createWrapAddCommand (tracer, config) {
|
|
8
|
+
return function wrapAddCommand (addCommand) {
|
|
9
|
+
return function addCommandWithTrace (command) {
|
|
10
|
+
const name = command[0]
|
|
11
|
+
const args = command.slice(1)
|
|
12
|
+
|
|
13
|
+
if (!config.filter(name)) return addCommand.apply(this, arguments)
|
|
14
|
+
|
|
15
|
+
const scope = tracer.scope()
|
|
16
|
+
const span = startSpan(tracer, config, this, name, args)
|
|
17
|
+
|
|
18
|
+
return tx.wrap(span, scope.bind(addCommand, span).apply(this, arguments))
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
5
23
|
function createWrapInternalSendCommand (tracer, config) {
|
|
6
24
|
return function wrapInternalSendCommand (internalSendCommand) {
|
|
7
25
|
return function internalSendCommandWithTrace (options) {
|
|
@@ -49,9 +67,21 @@ function startSpan (tracer, config, client, command, args) {
|
|
|
49
67
|
}
|
|
50
68
|
|
|
51
69
|
module.exports = [
|
|
70
|
+
{
|
|
71
|
+
name: '@node-redis/client',
|
|
72
|
+
versions: ['>=1'],
|
|
73
|
+
file: 'dist/lib/client/commands-queue.js',
|
|
74
|
+
patch (redis, tracer, config) {
|
|
75
|
+
config = tx.normalizeConfig(config)
|
|
76
|
+
this.wrap(redis.default.prototype, 'addCommand', createWrapAddCommand(tracer, config))
|
|
77
|
+
},
|
|
78
|
+
unpatch (redis) {
|
|
79
|
+
this.unwrap(redis.default.prototype, 'addCommand')
|
|
80
|
+
}
|
|
81
|
+
},
|
|
52
82
|
{
|
|
53
83
|
name: 'redis',
|
|
54
|
-
versions: ['>=2.6'],
|
|
84
|
+
versions: ['>=2.6 <4'],
|
|
55
85
|
patch (redis, tracer, config) {
|
|
56
86
|
config = tx.normalizeConfig(config)
|
|
57
87
|
this.wrap(redis.RedisClient.prototype, 'internal_send_command', createWrapInternalSendCommand(tracer, config))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
module.exports = '1.
|
|
1
|
+
module.exports = '1.6.0'
|
|
@@ -70,6 +70,7 @@ function resolveTilde (filePath) {
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
module.exports = {
|
|
73
|
+
normalizeRef,
|
|
73
74
|
getCIMetadata () {
|
|
74
75
|
const { env } = process
|
|
75
76
|
|
|
@@ -124,7 +125,7 @@ module.exports = {
|
|
|
124
125
|
CI_PIPELINE_IID,
|
|
125
126
|
CI_PIPELINE_URL: GITLAB_PIPELINE_URL,
|
|
126
127
|
CI_PROJECT_DIR,
|
|
127
|
-
|
|
128
|
+
CI_COMMIT_REF_NAME,
|
|
128
129
|
CI_COMMIT_TAG,
|
|
129
130
|
CI_COMMIT_SHA,
|
|
130
131
|
CI_REPOSITORY_URL,
|
|
@@ -143,7 +144,7 @@ module.exports = {
|
|
|
143
144
|
[GIT_REPOSITORY_URL]: CI_REPOSITORY_URL,
|
|
144
145
|
[CI_JOB_URL]: GITLAB_CI_JOB_URL,
|
|
145
146
|
[GIT_TAG]: CI_COMMIT_TAG,
|
|
146
|
-
[GIT_BRANCH]:
|
|
147
|
+
[GIT_BRANCH]: CI_COMMIT_REF_NAME,
|
|
147
148
|
[CI_WORKSPACE_PATH]: CI_PROJECT_DIR,
|
|
148
149
|
[CI_PIPELINE_URL]: GITLAB_PIPELINE_URL && GITLAB_PIPELINE_URL.replace('/-/pipelines/', '/pipelines/'),
|
|
149
150
|
[CI_STAGE_NAME]: CI_JOB_STAGE,
|
|
@@ -190,11 +191,19 @@ module.exports = {
|
|
|
190
191
|
GITHUB_HEAD_REF,
|
|
191
192
|
GITHUB_REF,
|
|
192
193
|
GITHUB_SHA,
|
|
193
|
-
GITHUB_REPOSITORY
|
|
194
|
+
GITHUB_REPOSITORY,
|
|
195
|
+
GITHUB_SERVER_URL,
|
|
196
|
+
GITHUB_RUN_ATTEMPT
|
|
194
197
|
} = env
|
|
195
198
|
|
|
196
|
-
const repositoryURL =
|
|
197
|
-
|
|
199
|
+
const repositoryURL = `${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git`
|
|
200
|
+
let pipelineURL = `${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}`
|
|
201
|
+
|
|
202
|
+
if (GITHUB_RUN_ATTEMPT) {
|
|
203
|
+
pipelineURL = `${pipelineURL}/attempts/${GITHUB_RUN_ATTEMPT}`
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const jobUrl = `${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/commit/${GITHUB_SHA}/checks`
|
|
198
207
|
|
|
199
208
|
const ref = GITHUB_HEAD_REF || GITHUB_REF || ''
|
|
200
209
|
const refKey = ref.includes('tags') ? GIT_TAG : GIT_BRANCH
|
|
@@ -207,7 +216,7 @@ module.exports = {
|
|
|
207
216
|
[CI_PROVIDER_NAME]: 'github',
|
|
208
217
|
[GIT_COMMIT_SHA]: GITHUB_SHA,
|
|
209
218
|
[GIT_REPOSITORY_URL]: repositoryURL,
|
|
210
|
-
[CI_JOB_URL]:
|
|
219
|
+
[CI_JOB_URL]: jobUrl,
|
|
211
220
|
[CI_WORKSPACE_PATH]: GITHUB_WORKSPACE,
|
|
212
221
|
[refKey]: ref
|
|
213
222
|
}
|
|
@@ -274,11 +283,13 @@ module.exports = {
|
|
|
274
283
|
BUILD_SOURCEVERSION,
|
|
275
284
|
BUILD_REQUESTEDFORID,
|
|
276
285
|
BUILD_REQUESTEDFOREMAIL,
|
|
277
|
-
BUILD_SOURCEVERSIONMESSAGE
|
|
286
|
+
BUILD_SOURCEVERSIONMESSAGE,
|
|
287
|
+
SYSTEM_STAGEDISPLAYNAME,
|
|
288
|
+
SYSTEM_JOBDISPLAYNAME
|
|
278
289
|
} = env
|
|
279
290
|
|
|
280
291
|
const ref = SYSTEM_PULLREQUEST_SOURCEBRANCH || BUILD_SOURCEBRANCH || BUILD_SOURCEBRANCHNAME
|
|
281
|
-
const refKey = ref.includes('tags') ? GIT_TAG : GIT_BRANCH
|
|
292
|
+
const refKey = (ref || '').includes('tags') ? GIT_TAG : GIT_BRANCH
|
|
282
293
|
|
|
283
294
|
tags = {
|
|
284
295
|
[CI_PROVIDER_NAME]: 'azurepipelines',
|
|
@@ -291,7 +302,9 @@ module.exports = {
|
|
|
291
302
|
[refKey]: ref,
|
|
292
303
|
[GIT_COMMIT_AUTHOR_NAME]: BUILD_REQUESTEDFORID,
|
|
293
304
|
[GIT_COMMIT_AUTHOR_EMAIL]: BUILD_REQUESTEDFOREMAIL,
|
|
294
|
-
[GIT_COMMIT_MESSAGE]: BUILD_SOURCEVERSIONMESSAGE
|
|
305
|
+
[GIT_COMMIT_MESSAGE]: BUILD_SOURCEVERSIONMESSAGE,
|
|
306
|
+
[CI_STAGE_NAME]: SYSTEM_STAGEDISPLAYNAME,
|
|
307
|
+
[CI_JOB_NAME]: SYSTEM_JOBDISPLAYNAME
|
|
295
308
|
}
|
|
296
309
|
|
|
297
310
|
if (SYSTEM_TEAMFOUNDATIONSERVERURI && SYSTEM_TEAMPROJECTID && BUILD_BUILDID) {
|
|
@@ -39,34 +39,20 @@ function getGitMetadata (ciMetadata) {
|
|
|
39
39
|
committerDate
|
|
40
40
|
] = sanitizedExec('git show -s --format=%an,%ae,%ad,%cn,%ce,%cd', { stdio: 'pipe' }).split(',')
|
|
41
41
|
|
|
42
|
-
const {
|
|
43
|
-
DD_GIT_REPOSITORY_URL,
|
|
44
|
-
DD_GIT_COMMIT_SHA,
|
|
45
|
-
DD_GIT_BRANCH,
|
|
46
|
-
DD_GIT_TAG,
|
|
47
|
-
DD_GIT_COMMIT_MESSAGE,
|
|
48
|
-
DD_GIT_COMMIT_AUTHOR_NAME,
|
|
49
|
-
DD_GIT_COMMIT_AUTHOR_EMAIL,
|
|
50
|
-
DD_GIT_COMMIT_AUTHOR_DATE,
|
|
51
|
-
DD_GIT_COMMIT_COMMITTER_NAME,
|
|
52
|
-
DD_GIT_COMMIT_COMMITTER_EMAIL,
|
|
53
|
-
DD_GIT_COMMIT_COMMITTER_DATE
|
|
54
|
-
} = process.env
|
|
55
|
-
|
|
56
42
|
return {
|
|
57
43
|
[GIT_REPOSITORY_URL]:
|
|
58
|
-
|
|
44
|
+
repositoryUrl || sanitizedExec('git ls-remote --get-url', { stdio: 'pipe' }),
|
|
59
45
|
[GIT_COMMIT_MESSAGE]:
|
|
60
|
-
|
|
61
|
-
[GIT_COMMIT_AUTHOR_DATE]:
|
|
62
|
-
[GIT_COMMIT_AUTHOR_NAME]:
|
|
63
|
-
[GIT_COMMIT_AUTHOR_EMAIL]:
|
|
64
|
-
[GIT_COMMIT_COMMITTER_DATE]:
|
|
65
|
-
[GIT_COMMIT_COMMITTER_NAME]:
|
|
66
|
-
[GIT_COMMIT_COMMITTER_EMAIL]:
|
|
67
|
-
[GIT_BRANCH]:
|
|
68
|
-
[GIT_COMMIT_SHA]:
|
|
69
|
-
[GIT_TAG]:
|
|
46
|
+
commitMessage || sanitizedExec('git show -s --format=%s', { stdio: 'pipe' }),
|
|
47
|
+
[GIT_COMMIT_AUTHOR_DATE]: authorDate,
|
|
48
|
+
[GIT_COMMIT_AUTHOR_NAME]: ciAuthorName || authorName,
|
|
49
|
+
[GIT_COMMIT_AUTHOR_EMAIL]: ciAuthorEmail || authorEmail,
|
|
50
|
+
[GIT_COMMIT_COMMITTER_DATE]: committerDate,
|
|
51
|
+
[GIT_COMMIT_COMMITTER_NAME]: committerName,
|
|
52
|
+
[GIT_COMMIT_COMMITTER_EMAIL]: committerEmail,
|
|
53
|
+
[GIT_BRANCH]: branch || sanitizedExec('git rev-parse --abbrev-ref HEAD', { stdio: 'pipe' }),
|
|
54
|
+
[GIT_COMMIT_SHA]: commitSHA || sanitizedExec('git rev-parse HEAD', { stdio: 'pipe' }),
|
|
55
|
+
[GIT_TAG]: tag,
|
|
70
56
|
[CI_WORKSPACE_PATH]: ciWorkspacePath || sanitizedExec('git rev-parse --show-toplevel', { stdio: 'pipe' })
|
|
71
57
|
}
|
|
72
58
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const path = require('path')
|
|
2
2
|
|
|
3
3
|
const { getGitMetadata } = require('./git')
|
|
4
|
+
const { getUserProviderGitMetadata } = require('./user-provided-git')
|
|
4
5
|
const { getCIMetadata } = require('./ci')
|
|
5
6
|
const { getRuntimeAndOSMetadata } = require('./env')
|
|
6
7
|
const {
|
|
@@ -16,6 +17,7 @@ const {
|
|
|
16
17
|
const id = require('../../id')
|
|
17
18
|
|
|
18
19
|
const TEST_FRAMEWORK = 'test.framework'
|
|
20
|
+
const TEST_FRAMEWORK_VERSION = 'test.framework_version'
|
|
19
21
|
const TEST_TYPE = 'test.type'
|
|
20
22
|
const TEST_NAME = 'test.name'
|
|
21
23
|
const TEST_SUITE = 'test.suite'
|
|
@@ -29,8 +31,12 @@ const ERROR_STACK = 'error.stack'
|
|
|
29
31
|
|
|
30
32
|
const CI_APP_ORIGIN = 'ciapp-test'
|
|
31
33
|
|
|
34
|
+
const JEST_TEST_RUNNER = 'test.jest.test_runner'
|
|
35
|
+
|
|
32
36
|
module.exports = {
|
|
33
37
|
TEST_FRAMEWORK,
|
|
38
|
+
TEST_FRAMEWORK_VERSION,
|
|
39
|
+
JEST_TEST_RUNNER,
|
|
34
40
|
TEST_TYPE,
|
|
35
41
|
TEST_NAME,
|
|
36
42
|
TEST_SUITE,
|
|
@@ -73,12 +79,15 @@ function getTestEnvironmentMetadata (testFramework) {
|
|
|
73
79
|
ciWorkspacePath
|
|
74
80
|
})
|
|
75
81
|
|
|
82
|
+
const userProvidedGitMetadata = getUserProviderGitMetadata()
|
|
83
|
+
|
|
76
84
|
const runtimeAndOSMetadata = getRuntimeAndOSMetadata()
|
|
77
85
|
|
|
78
86
|
return {
|
|
79
87
|
[TEST_FRAMEWORK]: testFramework,
|
|
80
88
|
...gitMetadata,
|
|
81
89
|
...ciMetadata,
|
|
90
|
+
...userProvidedGitMetadata,
|
|
82
91
|
...runtimeAndOSMetadata
|
|
83
92
|
}
|
|
84
93
|
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
const {
|
|
2
|
+
GIT_COMMIT_SHA,
|
|
3
|
+
GIT_BRANCH,
|
|
4
|
+
GIT_REPOSITORY_URL,
|
|
5
|
+
GIT_TAG,
|
|
6
|
+
GIT_COMMIT_MESSAGE,
|
|
7
|
+
GIT_COMMIT_COMMITTER_DATE,
|
|
8
|
+
GIT_COMMIT_COMMITTER_EMAIL,
|
|
9
|
+
GIT_COMMIT_COMMITTER_NAME,
|
|
10
|
+
GIT_COMMIT_AUTHOR_DATE,
|
|
11
|
+
GIT_COMMIT_AUTHOR_EMAIL,
|
|
12
|
+
GIT_COMMIT_AUTHOR_NAME
|
|
13
|
+
} = require('./tags')
|
|
14
|
+
|
|
15
|
+
const { normalizeRef } = require('./ci')
|
|
16
|
+
|
|
17
|
+
function removeEmptyValues (tags) {
|
|
18
|
+
return Object.keys(tags).reduce((filteredTags, tag) => {
|
|
19
|
+
if (!tags[tag]) {
|
|
20
|
+
return filteredTags
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
...filteredTags,
|
|
24
|
+
[tag]: tags[tag]
|
|
25
|
+
}
|
|
26
|
+
}, {})
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function getUserProviderGitMetadata () {
|
|
30
|
+
const {
|
|
31
|
+
DD_GIT_COMMIT_SHA,
|
|
32
|
+
DD_GIT_BRANCH,
|
|
33
|
+
DD_GIT_REPOSITORY_URL,
|
|
34
|
+
DD_GIT_TAG,
|
|
35
|
+
DD_GIT_COMMIT_MESSAGE,
|
|
36
|
+
DD_GIT_COMMIT_COMMITTER_NAME,
|
|
37
|
+
DD_GIT_COMMIT_COMMITTER_EMAIL,
|
|
38
|
+
DD_GIT_COMMIT_COMMITTER_DATE,
|
|
39
|
+
DD_GIT_COMMIT_AUTHOR_NAME,
|
|
40
|
+
DD_GIT_COMMIT_AUTHOR_EMAIL,
|
|
41
|
+
DD_GIT_COMMIT_AUTHOR_DATE
|
|
42
|
+
} = process.env
|
|
43
|
+
|
|
44
|
+
let branch = normalizeRef(DD_GIT_BRANCH)
|
|
45
|
+
let tag = normalizeRef(DD_GIT_TAG)
|
|
46
|
+
|
|
47
|
+
if (DD_GIT_TAG) {
|
|
48
|
+
branch = undefined
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// if DD_GIT_BRANCH is a tag, we associate its value to TAG instead of BRANCH
|
|
52
|
+
if ((DD_GIT_BRANCH || '').includes('origin/tags') || (DD_GIT_BRANCH || '').includes('refs/heads/tags')) {
|
|
53
|
+
branch = undefined
|
|
54
|
+
tag = normalizeRef(DD_GIT_BRANCH)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return removeEmptyValues({
|
|
58
|
+
[GIT_COMMIT_SHA]: DD_GIT_COMMIT_SHA,
|
|
59
|
+
[GIT_BRANCH]: branch,
|
|
60
|
+
[GIT_REPOSITORY_URL]: DD_GIT_REPOSITORY_URL,
|
|
61
|
+
[GIT_TAG]: tag,
|
|
62
|
+
[GIT_COMMIT_MESSAGE]: DD_GIT_COMMIT_MESSAGE,
|
|
63
|
+
[GIT_COMMIT_COMMITTER_NAME]: DD_GIT_COMMIT_COMMITTER_NAME,
|
|
64
|
+
[GIT_COMMIT_COMMITTER_DATE]: DD_GIT_COMMIT_COMMITTER_DATE,
|
|
65
|
+
[GIT_COMMIT_COMMITTER_EMAIL]: DD_GIT_COMMIT_COMMITTER_EMAIL,
|
|
66
|
+
[GIT_COMMIT_AUTHOR_NAME]: DD_GIT_COMMIT_AUTHOR_NAME,
|
|
67
|
+
[GIT_COMMIT_AUTHOR_EMAIL]: DD_GIT_COMMIT_AUTHOR_EMAIL,
|
|
68
|
+
[GIT_COMMIT_AUTHOR_DATE]: DD_GIT_COMMIT_AUTHOR_DATE
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
module.exports = { getUserProviderGitMetadata }
|
|
@@ -33,12 +33,8 @@ class PrioritySampler {
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
isSampled (span) {
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
return rule
|
|
40
|
-
? this._isSampledByRule(context, rule) && this._isSampledByRateLimit(context)
|
|
41
|
-
: this._isSampledByAgent(context)
|
|
36
|
+
const priority = this._getPriorityFromAuto(span)
|
|
37
|
+
return priority === USER_KEEP || priority === AUTO_KEEP
|
|
42
38
|
}
|
|
43
39
|
|
|
44
40
|
sample (span, auto = true) {
|
|
@@ -50,7 +46,7 @@ class PrioritySampler {
|
|
|
50
46
|
if (context._sampling.priority !== undefined) return
|
|
51
47
|
if (!root) return // noop span
|
|
52
48
|
|
|
53
|
-
const tag = this.
|
|
49
|
+
const tag = this._getPriorityFromTags(context._tags)
|
|
54
50
|
|
|
55
51
|
if (this.validate(tag)) {
|
|
56
52
|
context._sampling.priority = tag
|
|
@@ -58,7 +54,7 @@ class PrioritySampler {
|
|
|
58
54
|
}
|
|
59
55
|
|
|
60
56
|
if (auto) {
|
|
61
|
-
context._sampling.priority = this.
|
|
57
|
+
context._sampling.priority = this._getPriorityFromAuto(root)
|
|
62
58
|
}
|
|
63
59
|
}
|
|
64
60
|
|
|
@@ -93,7 +89,16 @@ class PrioritySampler {
|
|
|
93
89
|
return typeof span.context === 'function' ? span.context() : span
|
|
94
90
|
}
|
|
95
91
|
|
|
96
|
-
|
|
92
|
+
_getPriorityFromAuto (span) {
|
|
93
|
+
const context = this._getContext(span)
|
|
94
|
+
const rule = this._findRule(context)
|
|
95
|
+
|
|
96
|
+
return rule
|
|
97
|
+
? this._getPriorityByRule(context, rule)
|
|
98
|
+
: this._getPriorityByAgent(context)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
_getPriorityFromTags (tags) {
|
|
97
102
|
if (tags.hasOwnProperty(MANUAL_KEEP) && tags[MANUAL_KEEP] !== false) {
|
|
98
103
|
return USER_KEEP
|
|
99
104
|
} else if (tags.hasOwnProperty(MANUAL_DROP) && tags[MANUAL_DROP] !== false) {
|
|
@@ -109,10 +114,10 @@ class PrioritySampler {
|
|
|
109
114
|
}
|
|
110
115
|
}
|
|
111
116
|
|
|
112
|
-
|
|
117
|
+
_getPriorityByRule (context, rule) {
|
|
113
118
|
context._trace[SAMPLING_RULE_DECISION] = rule.sampleRate
|
|
114
119
|
|
|
115
|
-
return rule.sampler.isSampled(context)
|
|
120
|
+
return rule.sampler.isSampled(context) && this._isSampledByRateLimit(context) ? USER_KEEP : USER_REJECT
|
|
116
121
|
}
|
|
117
122
|
|
|
118
123
|
_isSampledByRateLimit (context) {
|
|
@@ -123,13 +128,13 @@ class PrioritySampler {
|
|
|
123
128
|
return allowed
|
|
124
129
|
}
|
|
125
130
|
|
|
126
|
-
|
|
131
|
+
_getPriorityByAgent (context) {
|
|
127
132
|
const key = `service:${context._tags[SERVICE_NAME]},env:${this._env}`
|
|
128
133
|
const sampler = this._samplers[key] || this._samplers[DEFAULT_KEY]
|
|
129
134
|
|
|
130
135
|
context._trace[SAMPLING_AGENT_DECISION] = sampler.rate()
|
|
131
136
|
|
|
132
|
-
return sampler.isSampled(context)
|
|
137
|
+
return sampler.isSampled(context) ? AUTO_KEEP : AUTO_REJECT
|
|
133
138
|
}
|
|
134
139
|
|
|
135
140
|
_normalizeRules (rules, sampleRate) {
|
|
@@ -151,9 +156,9 @@ class PrioritySampler {
|
|
|
151
156
|
const service = context._tags['service.name']
|
|
152
157
|
|
|
153
158
|
if (rule.name instanceof RegExp && !rule.name.test(name)) return false
|
|
154
|
-
if (rule.name && rule.name !== name) return false
|
|
159
|
+
if (typeof rule.name === 'string' && rule.name !== name) return false
|
|
155
160
|
if (rule.service instanceof RegExp && !rule.service.test(service)) return false
|
|
156
|
-
if (rule.service && rule.service !== service) return false
|
|
161
|
+
if (typeof rule.service === 'string' && rule.service !== service) return false
|
|
157
162
|
|
|
158
163
|
return true
|
|
159
164
|
}
|
|
@@ -40,7 +40,7 @@ function computeRetries (uploadTimeout) {
|
|
|
40
40
|
tries++
|
|
41
41
|
uploadTimeout /= 2
|
|
42
42
|
}
|
|
43
|
-
return [tries, uploadTimeout]
|
|
43
|
+
return [tries, Math.floor(uploadTimeout)]
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
class AgentExporter {
|
|
@@ -131,7 +131,7 @@ class AgentExporter {
|
|
|
131
131
|
})
|
|
132
132
|
|
|
133
133
|
operation.attempt((attempt) => {
|
|
134
|
-
const timeout = Math.pow(
|
|
134
|
+
const timeout = this._backoffTime * Math.pow(2, attempt)
|
|
135
135
|
sendRequest({ ...options, timeout }, form, (err, response) => {
|
|
136
136
|
if (operation.retry(err)) {
|
|
137
137
|
this._logger.error(`Error from the agent: ${err.message}`)
|
|
@@ -159,4 +159,4 @@ class AgentExporter {
|
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
161
|
|
|
162
|
-
module.exports = { AgentExporter }
|
|
162
|
+
module.exports = { AgentExporter, computeRetries }
|
|
Binary file
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
"test.type",
|
|
3
|
-
"test.status",
|
|
4
|
-
"test.framework",
|
|
5
|
-
"test.suite",
|
|
6
|
-
"test.name",
|
|
7
|
-
"test.skip_reason",
|
|
8
|
-
"ci.pipeline.id",
|
|
9
|
-
"ci.pipeline.name",
|
|
10
|
-
"ci.pipeline.number",
|
|
11
|
-
"ci.pipeline.url",
|
|
12
|
-
"ci.provider.name",
|
|
13
|
-
"ci.workspace_path",
|
|
14
|
-
"git.repository_url",
|
|
15
|
-
"ci.job.url",
|
|
16
|
-
"ci.job.name",
|
|
17
|
-
"ci.stage.name",
|
|
18
|
-
"git.commit.sha",
|
|
19
|
-
"git.branch",
|
|
20
|
-
"git.tag",
|
|
21
|
-
"git.commit.message",
|
|
22
|
-
"git.commit.committer.date",
|
|
23
|
-
"git.commit.committer.email",
|
|
24
|
-
"git.commit.committer.name",
|
|
25
|
-
"git.commit.author.date",
|
|
26
|
-
"git.commit.author.email",
|
|
27
|
-
"git.commit.author.name",
|
|
28
|
-
"os.platform",
|
|
29
|
-
"os.version",
|
|
30
|
-
"os.architecture",
|
|
31
|
-
"runtime.name",
|
|
32
|
-
"runtime.version",
|
|
33
|
-
"test.parameters",
|
|
34
|
-
"_dd.origin"
|
|
35
|
-
]
|