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.
@@ -0,0 +1,3 @@
1
+ require('../init')
2
+
3
+ module.exports = require('../../packages/datadog-plugin-cypress/src/plugin')
@@ -0,0 +1 @@
1
+ require('../../packages/datadog-plugin-cypress/src/support')
package/ci/init.js ADDED
@@ -0,0 +1,9 @@
1
+ const tracer = require('../packages/dd-trace')
2
+
3
+ tracer.init({
4
+ startupLogs: false
5
+ })
6
+
7
+ tracer.use('fs', false)
8
+
9
+ module.exports = tracer
package/ci/jest/env.js ADDED
@@ -0,0 +1,10 @@
1
+ const tracer = require('../../packages/dd-trace')
2
+
3
+ tracer.init({
4
+ startupLogs: false,
5
+ flushInterval: 400000
6
+ })
7
+
8
+ tracer.use('fs', false)
9
+
10
+ module.exports = tracer
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.5.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.1",
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": "^10.12.18",
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: { ...commonSpanTags, [TEST_SUITE]: testSuite }
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.5.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
- CI_COMMIT_BRANCH,
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]: CI_COMMIT_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 = `https://github.com/${GITHUB_REPOSITORY}.git`
197
- const pipelineURL = `https://github.com/${GITHUB_REPOSITORY}/commit/${GITHUB_SHA}/checks`
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]: pipelineURL,
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
- DD_GIT_REPOSITORY_URL || repositoryUrl || sanitizedExec('git ls-remote --get-url', { stdio: 'pipe' }),
44
+ repositoryUrl || sanitizedExec('git ls-remote --get-url', { stdio: 'pipe' }),
59
45
  [GIT_COMMIT_MESSAGE]:
60
- DD_GIT_COMMIT_MESSAGE || commitMessage || sanitizedExec('git show -s --format=%s', { stdio: 'pipe' }),
61
- [GIT_COMMIT_AUTHOR_DATE]: DD_GIT_COMMIT_AUTHOR_DATE || authorDate,
62
- [GIT_COMMIT_AUTHOR_NAME]: DD_GIT_COMMIT_AUTHOR_NAME || ciAuthorName || authorName,
63
- [GIT_COMMIT_AUTHOR_EMAIL]: DD_GIT_COMMIT_AUTHOR_EMAIL || ciAuthorEmail || authorEmail,
64
- [GIT_COMMIT_COMMITTER_DATE]: DD_GIT_COMMIT_COMMITTER_DATE || committerDate,
65
- [GIT_COMMIT_COMMITTER_NAME]: DD_GIT_COMMIT_COMMITTER_NAME || committerName,
66
- [GIT_COMMIT_COMMITTER_EMAIL]: DD_GIT_COMMIT_COMMITTER_EMAIL || committerEmail,
67
- [GIT_BRANCH]: DD_GIT_BRANCH || branch || sanitizedExec('git rev-parse --abbrev-ref HEAD', { stdio: 'pipe' }),
68
- [GIT_COMMIT_SHA]: DD_GIT_COMMIT_SHA || commitSHA || sanitizedExec('git rev-parse HEAD', { stdio: 'pipe' }),
69
- [GIT_TAG]: DD_GIT_TAG || 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
  }
@@ -25,8 +25,6 @@ const redis = {
25
25
  'span.type': 'redis',
26
26
  'db.type': 'redis',
27
27
  'db.name': db || '0',
28
- 'out.host': '127.0.0.1',
29
- 'out.port': String(6379),
30
28
  'redis.raw_command': formatCommand(command, args)
31
29
  }
32
30
  })
@@ -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 context = this._getContext(span)
37
- const rule = this._findRule(context)
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._getPriority(context._tags)
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.isSampled(root) ? AUTO_KEEP : AUTO_REJECT
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
- _getPriority (tags) {
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
- _isSampledByRule (context, rule) {
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
- _isSampledByAgent (context) {
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(this._backoffTime, attempt)
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
- ]