dd-trace 2.33.0 → 2.34.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.
Files changed (47) hide show
  1. package/index.d.ts +8 -1
  2. package/package.json +4 -3
  3. package/packages/datadog-instrumentations/src/helpers/register.js +4 -0
  4. package/packages/datadog-instrumentations/src/jest.js +20 -17
  5. package/packages/datadog-instrumentations/src/next.js +6 -1
  6. package/packages/datadog-plugin-aws-sdk/src/base.js +3 -0
  7. package/packages/datadog-plugin-aws-sdk/src/services/cloudwatchlogs.js +2 -1
  8. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +4 -2
  9. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +4 -3
  10. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +2 -1
  11. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -0
  12. package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +2 -1
  13. package/packages/datadog-plugin-aws-sdk/src/services/s3.js +2 -1
  14. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +8 -1
  15. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +7 -1
  16. package/packages/datadog-plugin-http/src/client.js +2 -1
  17. package/packages/datadog-plugin-http2/src/client.js +2 -1
  18. package/packages/datadog-plugin-jest/src/util.js +10 -1
  19. package/packages/dd-trace/src/appsec/iast/analyzers/command-injection-analyzer.js +2 -1
  20. package/packages/dd-trace/src/appsec/iast/analyzers/ldap-injection-analyzer.js +2 -1
  21. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +22 -5
  22. package/packages/dd-trace/src/appsec/iast/analyzers/sql-injection-analyzer.js +40 -4
  23. package/packages/dd-trace/src/appsec/iast/analyzers/weak-cipher-analyzer.js +2 -1
  24. package/packages/dd-trace/src/appsec/iast/analyzers/weak-hash-analyzer.js +2 -1
  25. package/packages/dd-trace/src/appsec/iast/index.js +1 -1
  26. package/packages/dd-trace/src/appsec/iast/path-line.js +2 -1
  27. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/range-utils.js +37 -0
  28. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +29 -0
  29. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +35 -0
  30. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +95 -0
  31. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +144 -0
  32. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +113 -0
  33. package/packages/dd-trace/src/appsec/iast/vulnerabilities.js +8 -0
  34. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +4 -76
  35. package/packages/dd-trace/src/config.js +58 -8
  36. package/packages/dd-trace/src/constants.js +3 -1
  37. package/packages/dd-trace/src/git_metadata_tagger.js +17 -0
  38. package/packages/dd-trace/src/git_properties.js +32 -0
  39. package/packages/dd-trace/src/plugins/util/ci.js +62 -7
  40. package/packages/dd-trace/src/plugins/util/tags.js +5 -1
  41. package/packages/dd-trace/src/profiling/constants.js +0 -1
  42. package/packages/dd-trace/src/profiling/profilers/space.js +1 -3
  43. package/packages/dd-trace/src/proxy.js +4 -0
  44. package/packages/dd-trace/src/serverless.js +25 -0
  45. package/packages/dd-trace/src/span_processor.js +3 -0
  46. package/packages/dd-trace/src/tracer.js +3 -2
  47. package/version.js +9 -0
@@ -20,7 +20,9 @@ const {
20
20
  CI_STAGE_NAME,
21
21
  CI_ENV_VARS,
22
22
  GIT_COMMIT_COMMITTER_NAME,
23
- GIT_COMMIT_COMMITTER_EMAIL
23
+ GIT_COMMIT_COMMITTER_EMAIL,
24
+ CI_NODE_LABELS,
25
+ CI_NODE_NAME
24
26
  } = require('./tags')
25
27
 
26
28
  // Receives a string with the form 'John Doe <john.doe@gmail.com>'
@@ -108,7 +110,9 @@ module.exports = {
108
110
  GIT_COMMIT: JENKINS_GIT_COMMIT,
109
111
  GIT_URL: JENKINS_GIT_REPOSITORY_URL,
110
112
  GIT_URL_1: JENKINS_GIT_REPOSITORY_URL_1,
111
- DD_CUSTOM_TRACE_ID
113
+ DD_CUSTOM_TRACE_ID,
114
+ NODE_NAME,
115
+ NODE_LABELS
112
116
  } = env
113
117
 
114
118
  tags = {
@@ -119,7 +123,18 @@ module.exports = {
119
123
  [GIT_COMMIT_SHA]: JENKINS_GIT_COMMIT,
120
124
  [GIT_REPOSITORY_URL]: JENKINS_GIT_REPOSITORY_URL || JENKINS_GIT_REPOSITORY_URL_1,
121
125
  [CI_WORKSPACE_PATH]: WORKSPACE,
122
- [CI_ENV_VARS]: JSON.stringify({ DD_CUSTOM_TRACE_ID })
126
+ [CI_ENV_VARS]: JSON.stringify({ DD_CUSTOM_TRACE_ID }),
127
+ [CI_NODE_NAME]: NODE_NAME
128
+ }
129
+
130
+ if (NODE_LABELS) {
131
+ let nodeLabels
132
+ try {
133
+ nodeLabels = JSON.stringify(NODE_LABELS.split(' '))
134
+ tags[CI_NODE_LABELS] = nodeLabels
135
+ } catch (e) {
136
+ // ignore errors
137
+ }
123
138
  }
124
139
 
125
140
  const isTag = JENKINS_GIT_BRANCH && JENKINS_GIT_BRANCH.includes('tags/')
@@ -159,7 +174,9 @@ module.exports = {
159
174
  CI_COMMIT_TIMESTAMP,
160
175
  CI_COMMIT_AUTHOR,
161
176
  CI_PROJECT_URL: GITLAB_PROJECT_URL,
162
- CI_JOB_ID: GITLAB_CI_JOB_ID
177
+ CI_JOB_ID: GITLAB_CI_JOB_ID,
178
+ CI_RUNNER_ID,
179
+ CI_RUNNER_TAGS
163
180
  } = env
164
181
 
165
182
  const { name, email } = parseEmailAndName(CI_COMMIT_AUTHOR)
@@ -186,7 +203,9 @@ module.exports = {
186
203
  CI_PROJECT_URL: GITLAB_PROJECT_URL,
187
204
  CI_PIPELINE_ID: GITLAB_PIPELINE_ID,
188
205
  CI_JOB_ID: GITLAB_CI_JOB_ID
189
- })
206
+ }),
207
+ [CI_NODE_LABELS]: CI_RUNNER_TAGS,
208
+ [CI_NODE_NAME]: CI_RUNNER_ID
190
209
  }
191
210
  }
192
211
 
@@ -448,9 +467,17 @@ module.exports = {
448
467
  BUILDKITE_BUILD_CHECKOUT_PATH,
449
468
  BUILDKITE_BUILD_AUTHOR,
450
469
  BUILDKITE_BUILD_AUTHOR_EMAIL,
451
- BUILDKITE_MESSAGE
470
+ BUILDKITE_MESSAGE,
471
+ BUILDKITE_AGENT_ID
452
472
  } = env
453
473
 
474
+ const extraTags = Object.keys(env).filter(envVar =>
475
+ envVar.startsWith('BUILDKITE_AGENT_META_DATA_')
476
+ ).map((metadataKey) => {
477
+ const key = metadataKey.replace('BUILDKITE_AGENT_META_DATA_', '').toLowerCase()
478
+ return `${key}:${env[metadataKey]}`
479
+ })
480
+
454
481
  tags = {
455
482
  [CI_PROVIDER_NAME]: 'buildkite',
456
483
  [CI_PIPELINE_ID]: BUILDKITE_BUILD_ID,
@@ -469,7 +496,9 @@ module.exports = {
469
496
  [CI_ENV_VARS]: JSON.stringify({
470
497
  BUILDKITE_BUILD_ID,
471
498
  BUILDKITE_JOB_ID
472
- })
499
+ }),
500
+ [CI_NODE_NAME]: BUILDKITE_AGENT_ID,
501
+ [CI_NODE_LABELS]: JSON.stringify(extraTags)
473
502
  }
474
503
  }
475
504
 
@@ -546,6 +575,32 @@ module.exports = {
546
575
  }
547
576
  }
548
577
 
578
+ if (env.CF_BUILD_ID) {
579
+ const {
580
+ CF_BUILD_ID,
581
+ CF_PIPELINE_NAME,
582
+ CF_BUILD_URL,
583
+ CF_STEP_NAME,
584
+ CF_BRANCH
585
+ } = env
586
+ tags = {
587
+ [CI_PROVIDER_NAME]: 'codefresh',
588
+ [CI_PIPELINE_ID]: CF_BUILD_ID,
589
+ [CI_PIPELINE_NAME]: CF_PIPELINE_NAME,
590
+ [CI_PIPELINE_URL]: CF_BUILD_URL,
591
+ [CI_JOB_NAME]: CF_STEP_NAME,
592
+ [CI_ENV_VARS]: JSON.stringify({
593
+ CF_BUILD_ID
594
+ })
595
+ }
596
+
597
+ const isTag = CF_BRANCH && CF_BRANCH.includes('tags/')
598
+ const refKey = isTag ? GIT_TAG : GIT_BRANCH
599
+ const ref = normalizeRef(CF_BRANCH)
600
+
601
+ tags[refKey] = ref
602
+ }
603
+
549
604
  normalizeTag(tags, CI_WORKSPACE_PATH, resolveTilde)
550
605
  normalizeTag(tags, GIT_REPOSITORY_URL, filterSensitiveInfoFromRepository)
551
606
  normalizeTag(tags, GIT_BRANCH, normalizeRef)
@@ -19,6 +19,8 @@ const CI_WORKSPACE_PATH = 'ci.workspace_path'
19
19
  const CI_JOB_URL = 'ci.job.url'
20
20
  const CI_JOB_NAME = 'ci.job.name'
21
21
  const CI_STAGE_NAME = 'ci.stage.name'
22
+ const CI_NODE_NAME = 'ci.node.name'
23
+ const CI_NODE_LABELS = 'ci.node.labels'
22
24
 
23
25
  const CI_ENV_VARS = '_dd.ci.env_vars'
24
26
 
@@ -43,5 +45,7 @@ module.exports = {
43
45
  CI_JOB_URL,
44
46
  CI_JOB_NAME,
45
47
  CI_STAGE_NAME,
46
- CI_ENV_VARS
48
+ CI_ENV_VARS,
49
+ CI_NODE_NAME,
50
+ CI_NODE_LABELS
47
51
  }
@@ -9,7 +9,6 @@ const snapshotKinds = Object.freeze({
9
9
  const oomExportStrategies = Object.freeze({
10
10
  PROCESS: 'process',
11
11
  ASYNC_CALLBACK: 'async',
12
- INTERRUPT_CALLBACK: 'interrupt',
13
12
  LOGS: 'logs'
14
13
  })
15
14
 
@@ -3,9 +3,7 @@
3
3
  const { oomExportStrategies } = require('../constants')
4
4
 
5
5
  function strategiesToCallbackMode (strategies, callbackMode) {
6
- const hasInterrupt = strategies.includes(oomExportStrategies.INTERRUPT_CALLBACK) ? callbackMode.Interrupt : 0
7
- const hasCallback = strategies.includes(oomExportStrategies.ASYNC_CALLBACK) ? callbackMode.Async : 0
8
- return hasInterrupt | hasCallback
6
+ return strategies.includes(oomExportStrategies.ASYNC_CALLBACK) ? callbackMode.Async : 0
9
7
  }
10
8
 
11
9
  class NativeSpaceProfiler {
@@ -30,6 +30,10 @@ class Tracer extends NoopProxy {
30
30
  remoteConfig.enable(config)
31
31
  }
32
32
 
33
+ if (config.isGCPFunction) {
34
+ require('./serverless').maybeStartServerlessMiniAgent()
35
+ }
36
+
33
37
  if (config.profiling.enabled) {
34
38
  // do not stop tracer initialization if the profiler fails to be imported
35
39
  try {
@@ -0,0 +1,25 @@
1
+ 'use strict'
2
+
3
+ function maybeStartServerlessMiniAgent () {
4
+ let rustBinaryPath =
5
+ '/workspace/node_modules/@datadog/sma/datadog-serverless-agent-linux-amd64/datadog-serverless-trace-mini-agent'
6
+ if (process.env.DD_MINI_AGENT_PATH !== undefined) {
7
+ rustBinaryPath = process.env.DD_MINI_AGENT_PATH
8
+ }
9
+ const log = require('./log')
10
+ const fs = require('fs')
11
+
12
+ // trying to spawn with an invalid path will return a non-descriptive error, so we want to catch
13
+ // invalid paths and log our own error.
14
+ if (!fs.existsSync(rustBinaryPath)) {
15
+ log.error('Serverless Mini Agent did not start. Could not find mini agent binary.')
16
+ return
17
+ }
18
+ try {
19
+ require('child_process').spawn(rustBinaryPath, { stdio: 'inherit' })
20
+ } catch (err) {
21
+ log.error(`Error spawning mini agent process: ${err}`)
22
+ }
23
+ }
24
+
25
+ module.exports = { maybeStartServerlessMiniAgent }
@@ -3,6 +3,7 @@
3
3
  const log = require('./log')
4
4
  const format = require('./format')
5
5
  const SpanSampler = require('./span_sampler')
6
+ const GitMetadataTagger = require('./git_metadata_tagger')
6
7
 
7
8
  const { SpanStatsProcessor } = require('./span_stats')
8
9
 
@@ -18,6 +19,7 @@ class SpanProcessor {
18
19
 
19
20
  this._stats = new SpanStatsProcessor(config)
20
21
  this._spanSampler = new SpanSampler(config.sampler)
22
+ this._gitMetadataTagger = new GitMetadataTagger(config)
21
23
  }
22
24
 
23
25
  process (span) {
@@ -32,6 +34,7 @@ class SpanProcessor {
32
34
  if (started.length === finished.length || finished.length >= flushMinSpans) {
33
35
  this._prioritySampler.sample(spanContext)
34
36
  this._spanSampler.sample(spanContext)
37
+ this._gitMetadataTagger.tagGitMetadata(spanContext)
35
38
 
36
39
  for (const span of started) {
37
40
  if (span._duration !== undefined) {
@@ -7,6 +7,7 @@ const { storage } = require('../../datadog-core')
7
7
  const { isError } = require('./util')
8
8
  const { setStartupLogConfig } = require('./startup-log')
9
9
  const { ERROR_MESSAGE, ERROR_TYPE, ERROR_STACK } = require('../../dd-trace/src/constants')
10
+ const { MAJOR } = require('../../../version')
10
11
 
11
12
  const SPAN_TYPE = tags.SPAN_TYPE
12
13
  const RESOURCE_NAME = tags.RESOURCE_NAME
@@ -26,7 +27,7 @@ class DatadogTracer extends Tracer {
26
27
  childOf: this.scope().active()
27
28
  }, options)
28
29
 
29
- if (!options.childOf && options.orphanable === false) {
30
+ if (!options.childOf && options.orphanable === false && MAJOR < 4) {
30
31
  return fn(null, () => {})
31
32
  }
32
33
 
@@ -81,7 +82,7 @@ class DatadogTracer extends Tracer {
81
82
  optionsObj = optionsObj.apply(this, arguments)
82
83
  }
83
84
 
84
- if (optionsObj && optionsObj.orphanable === false && !tracer.scope().active()) {
85
+ if (optionsObj && optionsObj.orphanable === false && !tracer.scope().active() && MAJOR < 4) {
85
86
  return fn.apply(this, arguments)
86
87
  }
87
88
 
package/version.js ADDED
@@ -0,0 +1,9 @@
1
+ 'use strict'
2
+
3
+ const matches = require('./package.json').version.match(/^(\d+)\.(\d+)\.(\d+)/)
4
+
5
+ module.exports = {
6
+ MAJOR: parseInt(matches[1]),
7
+ MINOR: parseInt(matches[2]),
8
+ PATCH: parseInt(matches[3])
9
+ }