dd-trace 3.3.1 → 3.12.1

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 (198) hide show
  1. package/LICENSE-3rdparty.csv +8 -0
  2. package/README.md +108 -43
  3. package/ci/init.js +6 -1
  4. package/ext/exporters.d.ts +2 -1
  5. package/ext/exporters.js +2 -1
  6. package/index.d.ts +129 -36
  7. package/package.json +18 -9
  8. package/packages/datadog-instrumentations/src/body-parser.js +26 -0
  9. package/packages/datadog-instrumentations/src/cassandra-driver.js +7 -7
  10. package/packages/datadog-instrumentations/src/child-process.js +30 -0
  11. package/packages/datadog-instrumentations/src/connect.js +15 -15
  12. package/packages/datadog-instrumentations/src/cucumber.js +1 -3
  13. package/packages/datadog-instrumentations/src/elasticsearch.js +51 -47
  14. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +1 -1
  15. package/packages/datadog-instrumentations/src/helpers/hooks.js +9 -0
  16. package/packages/datadog-instrumentations/src/helpers/register.js +5 -0
  17. package/packages/datadog-instrumentations/src/http/server.js +20 -12
  18. package/packages/datadog-instrumentations/src/http2/server.js +67 -1
  19. package/packages/datadog-instrumentations/src/jest.js +182 -25
  20. package/packages/datadog-instrumentations/src/koa.js +32 -32
  21. package/packages/datadog-instrumentations/src/ldapjs.js +91 -0
  22. package/packages/datadog-instrumentations/src/mariadb.js +63 -0
  23. package/packages/datadog-instrumentations/src/memcached.js +1 -4
  24. package/packages/datadog-instrumentations/src/mocha.js +135 -24
  25. package/packages/datadog-instrumentations/src/next.js +10 -2
  26. package/packages/datadog-instrumentations/src/opensearch.js +10 -0
  27. package/packages/datadog-instrumentations/src/oracledb.js +8 -8
  28. package/packages/datadog-instrumentations/src/pg.js +7 -3
  29. package/packages/datadog-instrumentations/src/qs.js +24 -0
  30. package/packages/datadog-instrumentations/src/redis.js +12 -3
  31. package/packages/datadog-instrumentations/src/restify.js +5 -1
  32. package/packages/datadog-instrumentations/src/rhea.js +29 -15
  33. package/packages/datadog-instrumentations/src/router.js +23 -23
  34. package/packages/datadog-plugin-amqp10/src/consumer.js +32 -0
  35. package/packages/datadog-plugin-amqp10/src/index.js +11 -101
  36. package/packages/datadog-plugin-amqp10/src/producer.js +34 -0
  37. package/packages/datadog-plugin-amqp10/src/util.js +15 -0
  38. package/packages/datadog-plugin-amqplib/src/client.js +38 -0
  39. package/packages/datadog-plugin-amqplib/src/consumer.js +40 -0
  40. package/packages/datadog-plugin-amqplib/src/index.js +14 -102
  41. package/packages/datadog-plugin-amqplib/src/producer.js +37 -0
  42. package/packages/datadog-plugin-amqplib/src/util.js +14 -0
  43. package/packages/datadog-plugin-cassandra-driver/src/index.js +22 -60
  44. package/packages/datadog-plugin-cucumber/src/index.js +14 -33
  45. package/packages/datadog-plugin-cypress/src/plugin.js +2 -1
  46. package/packages/datadog-plugin-dns/src/index.js +16 -91
  47. package/packages/datadog-plugin-dns/src/lookup.js +40 -0
  48. package/packages/datadog-plugin-dns/src/lookup_service.js +24 -0
  49. package/packages/datadog-plugin-dns/src/resolve.js +24 -0
  50. package/packages/datadog-plugin-dns/src/reverse.js +21 -0
  51. package/packages/datadog-plugin-elasticsearch/src/index.js +24 -60
  52. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +24 -0
  53. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +41 -0
  54. package/packages/datadog-plugin-google-cloud-pubsub/src/index.js +14 -99
  55. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +33 -0
  56. package/packages/datadog-plugin-graphql/src/execute.js +73 -0
  57. package/packages/datadog-plugin-graphql/src/index.js +14 -176
  58. package/packages/datadog-plugin-graphql/src/parse.js +32 -0
  59. package/packages/datadog-plugin-graphql/src/resolve.js +70 -76
  60. package/packages/datadog-plugin-graphql/src/validate.js +28 -0
  61. package/packages/datadog-plugin-grpc/src/client.js +46 -55
  62. package/packages/datadog-plugin-grpc/src/index.js +7 -24
  63. package/packages/datadog-plugin-grpc/src/server.js +50 -52
  64. package/packages/datadog-plugin-grpc/src/util.js +15 -14
  65. package/packages/datadog-plugin-http/src/client.js +15 -5
  66. package/packages/datadog-plugin-http/src/index.js +7 -22
  67. package/packages/datadog-plugin-http/src/server.js +19 -3
  68. package/packages/datadog-plugin-http2/src/client.js +20 -1
  69. package/packages/datadog-plugin-http2/src/index.js +8 -26
  70. package/packages/datadog-plugin-http2/src/server.js +44 -0
  71. package/packages/datadog-plugin-jest/src/index.js +41 -65
  72. package/packages/datadog-plugin-kafkajs/src/consumer.js +42 -0
  73. package/packages/datadog-plugin-kafkajs/src/index.js +11 -87
  74. package/packages/datadog-plugin-kafkajs/src/producer.js +31 -0
  75. package/packages/datadog-plugin-mariadb/src/index.js +10 -0
  76. package/packages/datadog-plugin-memcached/src/index.js +17 -52
  77. package/packages/datadog-plugin-mocha/src/index.js +40 -60
  78. package/packages/datadog-plugin-moleculer/src/client.js +22 -36
  79. package/packages/datadog-plugin-moleculer/src/index.js +8 -26
  80. package/packages/datadog-plugin-moleculer/src/server.js +18 -30
  81. package/packages/datadog-plugin-mongodb-core/src/index.js +23 -51
  82. package/packages/datadog-plugin-mysql/src/index.js +23 -52
  83. package/packages/datadog-plugin-mysql2/src/index.js +1 -3
  84. package/packages/datadog-plugin-net/src/index.js +4 -0
  85. package/packages/datadog-plugin-net/src/ipc.js +21 -0
  86. package/packages/datadog-plugin-net/src/tcp.js +46 -0
  87. package/packages/datadog-plugin-next/src/index.js +3 -0
  88. package/packages/datadog-plugin-opensearch/src/index.js +11 -0
  89. package/packages/datadog-plugin-oracledb/src/index.js +29 -55
  90. package/packages/datadog-plugin-pg/src/index.js +27 -51
  91. package/packages/datadog-plugin-redis/src/index.js +29 -60
  92. package/packages/datadog-plugin-rhea/src/consumer.js +55 -0
  93. package/packages/datadog-plugin-rhea/src/index.js +11 -96
  94. package/packages/datadog-plugin-rhea/src/producer.js +45 -0
  95. package/packages/datadog-plugin-router/src/index.js +13 -2
  96. package/packages/datadog-plugin-sharedb/src/index.js +22 -39
  97. package/packages/datadog-plugin-tedious/src/index.js +20 -41
  98. package/packages/dd-trace/src/appsec/addresses.js +3 -1
  99. package/packages/dd-trace/src/appsec/blocking.js +44 -0
  100. package/packages/dd-trace/src/appsec/callbacks/ddwaf.js +8 -6
  101. package/packages/dd-trace/src/appsec/gateway/engine/engine.js +1 -1
  102. package/packages/dd-trace/src/appsec/gateway/engine/index.js +7 -2
  103. package/packages/dd-trace/src/appsec/gateway/engine/runner.js +0 -1
  104. package/packages/dd-trace/src/appsec/iast/analyzers/analyzers.js +4 -1
  105. package/packages/dd-trace/src/appsec/iast/analyzers/command-injection-analyzer.js +11 -0
  106. package/packages/dd-trace/src/appsec/iast/analyzers/injection-analyzer.js +19 -0
  107. package/packages/dd-trace/src/appsec/iast/analyzers/ldap-injection-analyzer.js +11 -0
  108. package/packages/dd-trace/src/appsec/iast/analyzers/sql-injection-analyzer.js +13 -0
  109. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +43 -5
  110. package/packages/dd-trace/src/appsec/iast/iast-context.js +3 -1
  111. package/packages/dd-trace/src/appsec/iast/index.js +24 -8
  112. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +20 -1
  113. package/packages/dd-trace/src/appsec/iast/path-line.js +17 -6
  114. package/packages/dd-trace/src/appsec/iast/taint-tracking/csi-methods.js +17 -0
  115. package/packages/dd-trace/src/appsec/iast/taint-tracking/filter.js +16 -0
  116. package/packages/dd-trace/src/appsec/iast/taint-tracking/index.js +18 -0
  117. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +98 -0
  118. package/packages/dd-trace/src/appsec/iast/taint-tracking/origin-types.js +4 -0
  119. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +38 -0
  120. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +67 -0
  121. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +103 -0
  122. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +98 -30
  123. package/packages/dd-trace/src/appsec/index.js +79 -25
  124. package/packages/dd-trace/src/{plugins/util → appsec}/ip_blocklist.js +0 -0
  125. package/packages/dd-trace/src/appsec/ip_extractor.js +98 -0
  126. package/packages/dd-trace/src/appsec/recommended.json +134 -53
  127. package/packages/dd-trace/src/appsec/remote_config/capabilities.js +7 -0
  128. package/packages/dd-trace/src/appsec/remote_config/index.js +56 -0
  129. package/packages/dd-trace/src/appsec/remote_config/manager.js +264 -0
  130. package/packages/dd-trace/src/{exporters → appsec/remote_config}/scheduler.js +9 -9
  131. package/packages/dd-trace/src/appsec/rule_manager.js +61 -1
  132. package/packages/dd-trace/src/appsec/templates/blocked.html +99 -0
  133. package/packages/dd-trace/src/appsec/templates/blocked.json +8 -0
  134. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +66 -0
  135. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +9 -5
  136. package/packages/dd-trace/src/ci-visibility/exporters/agentless/index.js +19 -51
  137. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +10 -5
  138. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +202 -0
  139. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +51 -62
  140. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-itr-configuration.js +89 -0
  141. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +82 -0
  142. package/packages/dd-trace/src/config.js +119 -35
  143. package/packages/dd-trace/src/constants.js +9 -1
  144. package/packages/dd-trace/src/dogstatsd.js +42 -10
  145. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +10 -2
  146. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +0 -1
  147. package/packages/dd-trace/src/exporter.js +3 -0
  148. package/packages/dd-trace/src/exporters/agent/index.js +10 -2
  149. package/packages/dd-trace/src/exporters/agent/writer.js +2 -9
  150. package/packages/dd-trace/src/exporters/common/agent-info-exporter.js +82 -0
  151. package/packages/dd-trace/src/exporters/common/request.js +51 -1
  152. package/packages/dd-trace/src/exporters/span-stats/index.js +6 -2
  153. package/packages/dd-trace/src/format.js +29 -10
  154. package/packages/dd-trace/src/lambda/handler.js +72 -0
  155. package/packages/dd-trace/src/lambda/index.js +5 -0
  156. package/packages/dd-trace/src/lambda/runtime/errors.js +20 -0
  157. package/packages/dd-trace/src/lambda/runtime/patch.js +74 -0
  158. package/packages/dd-trace/src/lambda/runtime/ritm.js +138 -0
  159. package/packages/dd-trace/src/metrics.js +15 -2
  160. package/packages/dd-trace/src/opentracing/propagation/text_map.js +1 -5
  161. package/packages/dd-trace/src/opentracing/span.js +2 -1
  162. package/packages/dd-trace/src/opentracing/span_context.js +9 -0
  163. package/packages/dd-trace/src/plugin_manager.js +11 -17
  164. package/packages/dd-trace/src/plugins/cache.js +9 -0
  165. package/packages/dd-trace/src/plugins/ci_plugin.js +97 -0
  166. package/packages/dd-trace/src/plugins/client.js +9 -0
  167. package/packages/dd-trace/src/plugins/composite.js +26 -0
  168. package/packages/dd-trace/src/plugins/consumer.js +9 -0
  169. package/packages/dd-trace/src/plugins/database.js +55 -0
  170. package/packages/dd-trace/src/plugins/incoming.js +7 -0
  171. package/packages/dd-trace/src/plugins/index.js +3 -0
  172. package/packages/dd-trace/src/plugins/log_plugin.js +2 -2
  173. package/packages/dd-trace/src/plugins/outgoing.js +31 -0
  174. package/packages/dd-trace/src/plugins/plugin.js +3 -0
  175. package/packages/dd-trace/src/plugins/producer.js +9 -0
  176. package/packages/dd-trace/src/plugins/server.js +9 -0
  177. package/packages/dd-trace/src/plugins/storage.js +21 -0
  178. package/packages/dd-trace/src/plugins/tracing.js +94 -0
  179. package/packages/dd-trace/src/plugins/util/ci.js +40 -4
  180. package/packages/dd-trace/src/plugins/util/git.js +58 -18
  181. package/packages/dd-trace/src/plugins/util/test.js +71 -8
  182. package/packages/dd-trace/src/plugins/util/user-provided-git.js +14 -1
  183. package/packages/dd-trace/src/plugins/util/web.js +11 -114
  184. package/packages/dd-trace/src/priority_sampler.js +6 -2
  185. package/packages/dd-trace/src/profiling/config.js +11 -6
  186. package/packages/dd-trace/src/profiling/exporters/agent.js +4 -0
  187. package/packages/dd-trace/src/profiling/index.js +2 -2
  188. package/packages/dd-trace/src/profiling/profiler.js +43 -7
  189. package/packages/dd-trace/src/proxy.js +8 -16
  190. package/packages/dd-trace/src/ritm.js +25 -14
  191. package/packages/dd-trace/src/span_processor.js +17 -0
  192. package/packages/dd-trace/src/span_sampler.js +77 -0
  193. package/packages/dd-trace/src/span_stats.js +2 -2
  194. package/packages/dd-trace/src/telemetry/dependencies.js +21 -7
  195. package/packages/dd-trace/src/telemetry/index.js +7 -1
  196. package/packages/dd-trace/src/telemetry/send-data.js +3 -1
  197. package/packages/dd-trace/src/tracer.js +10 -5
  198. package/packages/dd-trace/src/util.js +43 -1
@@ -0,0 +1,37 @@
1
+ 'use strict'
2
+
3
+ const { TEXT_MAP } = require('../../../ext/formats')
4
+ const ProducerPlugin = require('../../dd-trace/src/plugins/producer')
5
+ const { getResourceName } = require('./util')
6
+
7
+ class AmqplibProducerPlugin extends ProducerPlugin {
8
+ static get name () { return 'amqplib' }
9
+ static get operation () { return 'command' }
10
+
11
+ start ({ channel = {}, method, fields }) {
12
+ if (method !== 'basic.publish') return
13
+
14
+ const stream = (channel.connection && channel.connection.stream) || {}
15
+ const span = this.startSpan('amqp.command', {
16
+ service: this.config.service || `${this.tracer._service}-amqp`,
17
+ resource: getResourceName(method, fields),
18
+ kind: 'producer',
19
+ meta: {
20
+ 'out.host': stream._host,
21
+ 'out.port': stream.remotePort,
22
+ 'amqp.queue': fields.queue,
23
+ 'amqp.exchange': fields.exchange,
24
+ 'amqp.routingKey': fields.routingKey,
25
+ 'amqp.consumerTag': fields.consumerTag,
26
+ 'amqp.source': fields.source,
27
+ 'amqp.destination': fields.destination
28
+ }
29
+ })
30
+
31
+ fields.headers = fields.headers || {}
32
+
33
+ this.tracer.inject(span, TEXT_MAP, fields.headers)
34
+ }
35
+ }
36
+
37
+ module.exports = AmqplibProducerPlugin
@@ -0,0 +1,14 @@
1
+ 'use strict'
2
+
3
+ function getResourceName (method, fields = {}) {
4
+ return [
5
+ method,
6
+ fields.exchange,
7
+ fields.routingKey,
8
+ fields.queue,
9
+ fields.source,
10
+ fields.destination
11
+ ].filter(val => val).join(' ')
12
+ }
13
+
14
+ module.exports = { getResourceName }
@@ -1,66 +1,28 @@
1
1
  'use strict'
2
2
 
3
- const Plugin = require('../../dd-trace/src/plugins/plugin')
4
- const { storage } = require('../../datadog-core')
5
- const analyticsSampler = require('../../dd-trace/src/analytics_sampler')
6
-
7
- class CassandraDriverPlugin extends Plugin {
8
- static get name () {
9
- return 'cassandra-driver'
10
- }
11
- constructor (...args) {
12
- super(...args)
13
-
14
- this.addSub(`apm:cassandra:query:start`, ({ keyspace, query, connectionOptions }) => {
15
- const store = storage.getStore()
16
- const childOf = store ? store.span : store
17
-
18
- if (Array.isArray(query)) {
19
- query = combine(query)
20
- }
21
-
22
- const span = this.tracer.startSpan('cassandra.query', {
23
- childOf,
24
- tags: {
25
- 'service.name': this.config.service || `${this.tracer._service}-cassandra`,
26
- 'resource.name': trim(query, 5000),
27
- 'span.type': 'cassandra',
28
- 'span.kind': 'client',
29
- 'db.type': 'cassandra',
30
- 'cassandra.query': query,
31
- 'cassandra.keyspace': keyspace
32
- }
33
- })
34
-
35
- if (connectionOptions) {
36
- span.addTags({
37
- 'out.host': connectionOptions.host,
38
- 'out.port': connectionOptions.port
39
- })
40
- }
41
-
42
- analyticsSampler.sample(span, this.config.measured)
43
- this.enter(span, store)
44
- })
45
-
46
- this.addSub(`apm:cassandra:query:error`, err => {
47
- storage.getStore().span.setTag('error', err)
48
- })
49
-
50
- this.addSub(`apm:cassandra:query:finish`, () => {
51
- storage.getStore().span.finish()
52
- })
53
-
54
- this.addSub(`apm:cassandra:query:addConnection`, connectionOptions => {
55
- const store = storage.getStore()
56
- if (!store) {
57
- return
58
- }
59
- const span = store.span
60
- span.addTags({
61
- 'out.host': connectionOptions.address,
3
+ const DatabasePlugin = require('../../dd-trace/src/plugins/database')
4
+
5
+ class CassandraDriverPlugin extends DatabasePlugin {
6
+ static get name () { return 'cassandra-driver' }
7
+ static get system () { return 'cassandra' }
8
+
9
+ start ({ keyspace, query, connectionOptions = {} }) {
10
+ if (Array.isArray(query)) {
11
+ query = combine(query)
12
+ }
13
+
14
+ this.startSpan('cassandra.query', {
15
+ service: this.config.service,
16
+ resource: trim(query, 5000),
17
+ type: 'cassandra',
18
+ kind: 'client',
19
+ meta: {
20
+ 'db.type': 'cassandra',
21
+ 'cassandra.query': query,
22
+ 'cassandra.keyspace': keyspace,
23
+ 'out.host': connectionOptions.host,
62
24
  'out.port': connectionOptions.port
63
- })
25
+ }
64
26
  })
65
27
  }
66
28
  }
@@ -1,24 +1,18 @@
1
1
  'use strict'
2
2
 
3
- const Plugin = require('../../dd-trace/src/plugins/plugin')
3
+ const CiPlugin = require('../../dd-trace/src/plugins/ci_plugin')
4
4
  const { storage } = require('../../datadog-core')
5
5
 
6
6
  const {
7
- CI_APP_ORIGIN,
8
7
  TEST_SKIP_REASON,
9
- ERROR_MESSAGE,
10
8
  TEST_STATUS,
11
- TEST_CODE_OWNERS,
12
9
  finishAllTraceSpans,
13
- getTestEnvironmentMetadata,
14
- getTestSuitePath,
15
- getCodeOwnersFileEntries,
16
- getCodeOwnersForFilename,
17
- getTestCommonTags
10
+ getTestSuitePath
18
11
  } = require('../../dd-trace/src/plugins/util/test')
19
12
  const { RESOURCE_NAME } = require('../../../ext/tags')
13
+ const { COMPONENT, ERROR_MESSAGE } = require('../../dd-trace/src/constants')
20
14
 
21
- class CucumberPlugin extends Plugin {
15
+ class CucumberPlugin extends CiPlugin {
22
16
  static get name () {
23
17
  return 'cucumber'
24
18
  }
@@ -26,36 +20,18 @@ class CucumberPlugin extends Plugin {
26
20
  constructor (...args) {
27
21
  super(...args)
28
22
 
29
- const testEnvironmentMetadata = getTestEnvironmentMetadata('cucumber', this.config)
30
- const sourceRoot = process.cwd()
31
- const codeOwnersEntries = getCodeOwnersFileEntries(sourceRoot)
32
-
33
23
  this.addSub('ci:cucumber:session:finish', () => {
34
- this.tracer._exporter._writer.flush()
24
+ this.tracer._exporter.flush()
35
25
  })
36
26
 
37
- this.addSub('ci:cucumber:run:start', ({ pickleName, pickleUri }) => {
27
+ this.addSub('ci:cucumber:run:start', ({ testName, fullTestSuite }) => {
38
28
  const store = storage.getStore()
39
29
  const childOf = store ? store.span : store
40
- const testSuite = getTestSuitePath(pickleUri, sourceRoot)
41
-
42
- const commonTags = getTestCommonTags(pickleName, testSuite, this.tracer._version)
30
+ const testSuite = getTestSuitePath(fullTestSuite, process.cwd())
43
31
 
44
- const codeOwners = getCodeOwnersForFilename(testSuite, codeOwnersEntries)
45
- if (codeOwners) {
46
- commonTags[TEST_CODE_OWNERS] = codeOwners
47
- }
32
+ const testSpan = this.startTestSpan(testName, testSuite, childOf)
48
33
 
49
- const span = this.tracer.startSpan('cucumber.test', {
50
- childOf,
51
- tags: {
52
- ...commonTags,
53
- ...testEnvironmentMetadata
54
- }
55
- })
56
-
57
- span.context()._trace.origin = CI_APP_ORIGIN
58
- this.enter(span, store)
34
+ this.enter(testSpan, store)
59
35
  })
60
36
 
61
37
  this.addSub('ci:cucumber:run-step:start', ({ resource }) => {
@@ -64,6 +40,7 @@ class CucumberPlugin extends Plugin {
64
40
  const span = this.tracer.startSpan('cucumber.step', {
65
41
  childOf,
66
42
  tags: {
43
+ [COMPONENT]: this.constructor.name,
67
44
  'cucumber.step': resource,
68
45
  [RESOURCE_NAME]: resource
69
46
  }
@@ -98,6 +75,10 @@ class CucumberPlugin extends Plugin {
98
75
  }
99
76
  })
100
77
  }
78
+
79
+ startTestSpan (testName, testSuite, childOf) {
80
+ return super.startTestSpan(testName, testSuite, {}, childOf)
81
+ }
101
82
  }
102
83
 
103
84
  module.exports = CucumberPlugin
@@ -10,7 +10,7 @@ const {
10
10
  getTestCommonTags
11
11
  } = require('../../dd-trace/src/plugins/util/test')
12
12
 
13
- const { ORIGIN_KEY } = require('../../dd-trace/src/constants')
13
+ const { ORIGIN_KEY, COMPONENT } = require('../../dd-trace/src/constants')
14
14
 
15
15
  const CYPRESS_STATUS_TO_TEST_STATUS = {
16
16
  passed: 'pass',
@@ -62,6 +62,7 @@ module.exports = (on, config) => {
62
62
  activeSpan = tracer.startSpan('cypress.test', {
63
63
  childOf,
64
64
  tags: {
65
+ [COMPONENT]: 'cypress',
65
66
  [ORIGIN_KEY]: CI_APP_ORIGIN,
66
67
  ...testSpanMetadata,
67
68
  ...testEnvironmentMetadata
@@ -1,98 +1,23 @@
1
1
  'use strict'
2
2
 
3
- const analyticsSampler = require('../../dd-trace/src/analytics_sampler')
4
- const Plugin = require('../../dd-trace/src/plugins/plugin')
5
- const { storage } = require('../../datadog-core')
6
-
7
- class DNSPlugin extends Plugin {
8
- static get name () {
9
- return 'dns'
10
- }
11
-
12
- addSubs (func, start, finish = defaultFinish) {
13
- this.addSub(`apm:dns:${func}:start`, start)
14
- this.addSub(`apm:dns:${func}:error`, errorHandler)
15
- this.addSub(`apm:dns:${func}:finish`, finish)
16
- }
17
-
18
- startSpan (name, customTags, store) {
19
- const tags = {
20
- 'service.name': this.config.service || this.tracer._service,
21
- 'span.kind': 'client'
3
+ const CompositePlugin = require('../../dd-trace/src/plugins/composite')
4
+ const DNSLookupPlugin = require('./lookup')
5
+ const DNSLookupServicePlugin = require('./lookup_service')
6
+ const DNSResolvePlugin = require('./resolve')
7
+ const DNSReversePlugin = require('./reverse')
8
+
9
+ // TODO: Are DNS spans really client spans?
10
+
11
+ class DNSPlugin extends CompositePlugin {
12
+ static get name () { return 'dns' }
13
+ static get plugins () {
14
+ return {
15
+ lookup: DNSLookupPlugin,
16
+ lookup_service: DNSLookupServicePlugin,
17
+ resolve: DNSResolvePlugin,
18
+ reverse: DNSReversePlugin
22
19
  }
23
- for (const tag in customTags) {
24
- tags[tag] = customTags[tag]
25
- }
26
- const span = this.tracer.startSpan(name, {
27
- childOf: store ? store.span : null,
28
- tags
29
- })
30
- analyticsSampler.sample(span, this.config.measured)
31
- return span
32
20
  }
33
-
34
- constructor (...args) {
35
- super(...args)
36
-
37
- this.addSubs('lookup', ([hostname]) => {
38
- const store = storage.getStore()
39
- const span = this.startSpan('dns.lookup', {
40
- 'resource.name': hostname,
41
- 'dns.hostname': hostname
42
- }, store)
43
- this.enter(span, store)
44
- }, (result) => {
45
- const { span } = storage.getStore()
46
-
47
- if (Array.isArray(result)) {
48
- const addresses = Array.isArray(result)
49
- ? result.map(address => address.address).sort()
50
- : [result]
51
-
52
- span.setTag('dns.address', addresses[0])
53
- span.setTag('dns.addresses', addresses.join(','))
54
- } else {
55
- span.setTag('dns.address', result)
56
- }
57
-
58
- span.finish()
59
- })
60
-
61
- this.addSubs('lookup_service', ([address, port]) => {
62
- const store = storage.getStore()
63
- const span = this.startSpan('dns.lookup_service', {
64
- 'resource.name': `${address}:${port}`,
65
- 'dns.address': address,
66
- 'dns.port': port
67
- }, store)
68
- this.enter(span, store)
69
- })
70
-
71
- this.addSubs('resolve', ([hostname, maybeType]) => {
72
- const store = storage.getStore()
73
- const rrtype = typeof maybeType === 'string' ? maybeType : 'A'
74
- const span = this.startSpan('dns.resolve', {
75
- 'resource.name': `${rrtype} ${hostname}`,
76
- 'dns.hostname': hostname,
77
- 'dns.rrtype': rrtype
78
- }, store)
79
- this.enter(span, store)
80
- })
81
-
82
- this.addSubs('reverse', ([ip]) => {
83
- const store = storage.getStore()
84
- const span = this.startSpan('dns.reverse', { 'resource.name': ip, 'dns.ip': ip }, store)
85
- this.enter(span, store)
86
- })
87
- }
88
- }
89
-
90
- function defaultFinish () {
91
- storage.getStore().span.finish()
92
- }
93
-
94
- function errorHandler (error) {
95
- storage.getStore().span.setTag('error', error)
96
21
  }
97
22
 
98
23
  module.exports = DNSPlugin
@@ -0,0 +1,40 @@
1
+ 'use strict'
2
+
3
+ const ClientPlugin = require('../../dd-trace/src/plugins/client')
4
+
5
+ class DNSLookupPlugin extends ClientPlugin {
6
+ static get name () { return 'dns' }
7
+ static get operation () { return 'lookup' }
8
+
9
+ start ([hostname]) {
10
+ this.startSpan('dns.lookup', {
11
+ service: this.config.service,
12
+ resource: hostname,
13
+ kind: 'client',
14
+ meta: {
15
+ 'dns.hostname': hostname,
16
+ 'dns.address': '',
17
+ 'dns.addresses': ''
18
+ }
19
+ })
20
+ }
21
+
22
+ finish (result) {
23
+ const span = this.activeSpan
24
+
25
+ if (Array.isArray(result)) {
26
+ const addresses = Array.isArray(result)
27
+ ? result.map(address => address.address).sort()
28
+ : [result]
29
+
30
+ span.setTag('dns.address', addresses[0])
31
+ span.setTag('dns.addresses', addresses.join(','))
32
+ } else {
33
+ span.setTag('dns.address', result)
34
+ }
35
+
36
+ span.finish()
37
+ }
38
+ }
39
+
40
+ module.exports = DNSLookupPlugin
@@ -0,0 +1,24 @@
1
+ 'use strict'
2
+
3
+ const ClientPlugin = require('../../dd-trace/src/plugins/client')
4
+
5
+ class DNSLookupServicePlugin extends ClientPlugin {
6
+ static get name () { return 'dns' }
7
+ static get operation () { return 'lookup_service' }
8
+
9
+ start ([address, port]) {
10
+ this.startSpan('dns.lookup_service', {
11
+ service: this.config.service,
12
+ resource: `${address}:${port}`,
13
+ kind: 'client',
14
+ meta: {
15
+ 'dns.address': address
16
+ },
17
+ metrics: {
18
+ 'dns.port': port
19
+ }
20
+ })
21
+ }
22
+ }
23
+
24
+ module.exports = DNSLookupServicePlugin
@@ -0,0 +1,24 @@
1
+ 'use strict'
2
+
3
+ const ClientPlugin = require('../../dd-trace/src/plugins/client')
4
+
5
+ class DNSResolvePlugin extends ClientPlugin {
6
+ static get name () { return 'dns' }
7
+ static get operation () { return 'resolve' }
8
+
9
+ start ([hostname, maybeType]) {
10
+ const rrtype = typeof maybeType === 'string' ? maybeType : 'A'
11
+
12
+ this.startSpan('dns.resolve', {
13
+ service: this.config.service,
14
+ resource: `${rrtype} ${hostname}`,
15
+ kind: 'client',
16
+ meta: {
17
+ 'dns.hostname': hostname,
18
+ 'dns.rrtype': rrtype
19
+ }
20
+ })
21
+ }
22
+ }
23
+
24
+ module.exports = DNSResolvePlugin
@@ -0,0 +1,21 @@
1
+ 'use strict'
2
+
3
+ const ClientPlugin = require('../../dd-trace/src/plugins/client')
4
+
5
+ class DNSReversePlugin extends ClientPlugin {
6
+ static get name () { return 'dns' }
7
+ static get operation () { return 'reverse' }
8
+
9
+ start ([ip]) {
10
+ this.startSpan('dns.reverse', {
11
+ service: this.config.service,
12
+ resource: ip,
13
+ kind: 'client',
14
+ meta: {
15
+ 'dns.ip': ip
16
+ }
17
+ })
18
+ }
19
+ }
20
+
21
+ module.exports = DNSReversePlugin
@@ -1,71 +1,35 @@
1
1
  'use strict'
2
2
 
3
- const Plugin = require('../../dd-trace/src/plugins/plugin')
4
- const { storage } = require('../../datadog-core')
5
- const analyticsSampler = require('../../dd-trace/src/analytics_sampler')
6
-
7
- class ElasticsearchPlugin extends Plugin {
8
- static get name () {
9
- return 'elasticsearch'
10
- }
11
-
12
- constructor (...args) {
13
- super(...args)
14
-
15
- this.addSub('apm:elasticsearch:query:start', ({ params }) => {
16
- const store = storage.getStore()
17
- const childOf = store ? store.span : store
18
- const body = getBody(params.body || params.bulkBody)
19
- const span = this.tracer.startSpan('elasticsearch.query', {
20
- childOf,
21
- tags: {
22
- 'db.type': 'elasticsearch',
23
- 'span.kind': 'client',
24
- 'service.name': this.config.service || `${this.tracer._service}-elasticsearch`,
25
- 'resource.name': `${params.method} ${quantizePath(params.path)}`,
26
- 'span.type': 'elasticsearch',
27
- 'elasticsearch.url': params.path,
28
- 'elasticsearch.method': params.method,
29
- 'elasticsearch.body': body,
30
- 'elasticsearch.params': JSON.stringify(params.querystring || params.query)
31
- }
32
- })
33
- analyticsSampler.sample(span, this.config.measured)
34
- this.enter(span, store)
35
- })
36
-
37
- this.addSub('apm:elasticsearch:query:error', err => {
38
- const span = storage.getStore().span
39
- span.setTag('error', err)
40
- })
41
-
42
- this.addSub('apm:elasticsearch:query:finish', ({ params }) => {
43
- const span = storage.getStore().span
44
- this.config.hooks.query(span, params)
45
- span.finish()
3
+ const DatabasePlugin = require('../../dd-trace/src/plugins/database')
4
+
5
+ class ElasticsearchPlugin extends DatabasePlugin {
6
+ static get name () { return 'elasticsearch' }
7
+
8
+ start ({ params }) {
9
+ const body = getBody(params.body || params.bulkBody)
10
+
11
+ this.startSpan(`${this.system}.query`, {
12
+ service: this.config.service,
13
+ resource: `${params.method} ${quantizePath(params.path)}`,
14
+ type: 'elasticsearch',
15
+ kind: 'client',
16
+ meta: {
17
+ 'db.type': this.system,
18
+ [`${this.system}.url`]: params.path,
19
+ [`${this.system}.method`]: params.method,
20
+ [`${this.system}.body`]: body,
21
+ [`${this.system}.params`]: JSON.stringify(params.querystring || params.query)
22
+ }
46
23
  })
47
24
  }
48
25
 
49
- configure (config) {
50
- return super.configure(normalizeConfig(config))
26
+ finish ({ params }) {
27
+ const span = this.activeSpan
28
+ this.config.hooks.query(span, params)
29
+ super.finish({ params })
51
30
  }
52
31
  }
53
32
 
54
- function normalizeConfig (config) {
55
- const hooks = getHooks(config)
56
-
57
- return Object.assign({}, config, {
58
- hooks
59
- })
60
- }
61
-
62
- function getHooks (config) {
63
- const noop = () => {}
64
- const query = (config.hooks && config.hooks.query) || noop
65
-
66
- return { query }
67
- }
68
-
69
33
  function getBody (body) {
70
34
  return body && JSON.stringify(body)
71
35
  }
@@ -0,0 +1,24 @@
1
+ 'use strict'
2
+
3
+ const ClientPlugin = require('../../dd-trace/src/plugins/client')
4
+
5
+ class GoogleCloudPubsubClientPlugin extends ClientPlugin {
6
+ static get name () { return 'google-cloud-pubsub' }
7
+ static get operation () { return 'request' }
8
+
9
+ start ({ cfg, projectId }) {
10
+ if (cfg.method === 'publish') return
11
+
12
+ this.startSpan('pubsub.request', {
13
+ service: this.config.service || `${this.tracer._service}-pubsub`,
14
+ resource: [cfg.method, cfg.reqOpts.name].filter(x => x).join(' '),
15
+ kind: 'client',
16
+ meta: {
17
+ 'pubsub.method': cfg.method,
18
+ 'gcloud.project_id': projectId
19
+ }
20
+ })
21
+ }
22
+ }
23
+
24
+ module.exports = GoogleCloudPubsubClientPlugin
@@ -0,0 +1,41 @@
1
+ 'use strict'
2
+
3
+ const ConsumerPlugin = require('../../dd-trace/src/plugins/consumer')
4
+
5
+ class GoogleCloudPubsubConsumerPlugin extends ConsumerPlugin {
6
+ static get name () { return 'google-cloud-pubsub' }
7
+ static get operation () { return 'receive' }
8
+
9
+ start ({ message }) {
10
+ const subscription = message._subscriber._subscription
11
+ const topic = subscription.metadata && subscription.metadata.topic
12
+ const childOf = this.tracer.extract('text_map', message.attributes) || null
13
+
14
+ this.startSpan('pubsub.receive', {
15
+ childOf,
16
+ service: this.config.service,
17
+ resource: topic,
18
+ kind: 'consumer',
19
+ type: 'worker',
20
+ meta: {
21
+ 'gcloud.project_id': subscription.pubsub.projectId,
22
+ 'pubsub.topic': topic
23
+ },
24
+ metrics: {
25
+ 'pubsub.ack': 0
26
+ }
27
+ })
28
+ }
29
+
30
+ finish (message) {
31
+ const span = this.activeSpan
32
+
33
+ if (message.message._handled) {
34
+ span.setTag('pubsub.ack', 1)
35
+ }
36
+
37
+ span.finish()
38
+ }
39
+ }
40
+
41
+ module.exports = GoogleCloudPubsubConsumerPlugin