dd-trace 2.43.0 → 2.45.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 (45) hide show
  1. package/CONTRIBUTING.md +66 -0
  2. package/package.json +1 -1
  3. package/packages/datadog-instrumentations/src/couchbase.js +42 -6
  4. package/packages/datadog-instrumentations/src/http2/client.js +2 -0
  5. package/packages/datadog-plugin-aws-sdk/src/base.js +22 -10
  6. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +16 -0
  7. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +18 -0
  8. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +23 -0
  9. package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -1
  10. package/packages/datadog-plugin-couchbase/src/index.js +32 -30
  11. package/packages/datadog-plugin-elasticsearch/src/index.js +1 -1
  12. package/packages/datadog-plugin-http/src/client.js +14 -23
  13. package/packages/datadog-plugin-http/src/server.js +10 -2
  14. package/packages/datadog-plugin-http2/src/client.js +2 -16
  15. package/packages/datadog-plugin-http2/src/server.js +10 -1
  16. package/packages/datadog-plugin-memcached/src/index.js +1 -1
  17. package/packages/datadog-plugin-mongodb-core/src/index.js +1 -1
  18. package/packages/datadog-plugin-mysql/src/index.js +1 -1
  19. package/packages/datadog-plugin-next/src/index.js +2 -2
  20. package/packages/datadog-plugin-oracledb/src/index.js +1 -1
  21. package/packages/datadog-plugin-pg/src/index.js +2 -2
  22. package/packages/datadog-plugin-redis/src/index.js +1 -1
  23. package/packages/datadog-plugin-tedious/src/index.js +1 -1
  24. package/packages/dd-trace/src/appsec/remote_config/index.js +2 -0
  25. package/packages/dd-trace/src/appsec/remote_config/manager.js +9 -4
  26. package/packages/dd-trace/src/config.js +138 -16
  27. package/packages/dd-trace/src/noop/tracer.js +2 -0
  28. package/packages/dd-trace/src/plugin_manager.js +2 -0
  29. package/packages/dd-trace/src/plugins/database.js +12 -0
  30. package/packages/dd-trace/src/plugins/tracing.js +16 -9
  31. package/packages/dd-trace/src/plugins/util/web.js +6 -4
  32. package/packages/dd-trace/src/priority_sampler.js +6 -3
  33. package/packages/dd-trace/src/proxy.js +18 -3
  34. package/packages/dd-trace/src/service-naming/index.js +7 -11
  35. package/packages/dd-trace/src/service-naming/schemas/definition.js +4 -4
  36. package/packages/dd-trace/src/service-naming/schemas/util.js +21 -3
  37. package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +20 -8
  38. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +33 -23
  39. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +41 -1
  40. package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +14 -2
  41. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +12 -9
  42. package/packages/dd-trace/src/service-naming/schemas/v1/web.js +33 -1
  43. package/packages/dd-trace/src/startup-log.js +1 -1
  44. package/packages/dd-trace/src/telemetry/index.js +31 -3
  45. package/packages/dd-trace/src/tracer.js +4 -0
@@ -1,37 +1,37 @@
1
- function getRedisService (config, connectionName) {
2
- if (config.splitByInstance && connectionName) {
3
- return config.service
4
- ? `${config.service}-${connectionName}`
1
+ function getRedisService (pluginConfig, connectionName) {
2
+ if (pluginConfig.splitByInstance && connectionName) {
3
+ return pluginConfig.service
4
+ ? `${pluginConfig.service}-${connectionName}`
5
5
  : connectionName
6
6
  }
7
7
 
8
- return config.service
8
+ return pluginConfig.service
9
9
  }
10
10
 
11
- function fromSystem (service, system) {
12
- return system ? `${service}-${system}` : undefined
11
+ function fromSystem (tracerService, system) {
12
+ return system ? `${tracerService}-${system}` : undefined
13
13
  }
14
14
 
15
- function mysqlServiceName (service, config, dbConfig, system) {
16
- if (typeof config.service === 'function') {
17
- return config.service(dbConfig)
15
+ function mysqlServiceName ({ tracerService, pluginConfig, dbConfig, system }) {
16
+ if (typeof pluginConfig.service === 'function') {
17
+ return pluginConfig.service(dbConfig)
18
18
  }
19
- return config.service || fromSystem(service, system)
19
+ return pluginConfig.service || fromSystem(tracerService, system)
20
20
  }
21
21
 
22
22
  function withSuffixFunction (suffix) {
23
- return (service, config, params) => {
24
- if (typeof config.service === 'function') {
25
- return config.service(params)
23
+ return ({ tracerService, pluginConfig, params }) => {
24
+ if (typeof pluginConfig.service === 'function') {
25
+ return pluginConfig.service(params)
26
26
  }
27
- return config.service || `${service}-${suffix}`
27
+ return pluginConfig.service || `${tracerService}-${suffix}`
28
28
  }
29
29
  }
30
30
 
31
31
  const redisConfig = {
32
32
  opName: () => 'redis.command',
33
- serviceName: (service, config, system, connectionName) => {
34
- return getRedisService(config, connectionName) || fromSystem(service, system)
33
+ serviceName: ({ tracerService, pluginConfig, system, connectionName }) => {
34
+ return getRedisService(pluginConfig, connectionName) || fromSystem(tracerService, system)
35
35
  }
36
36
  }
37
37
 
@@ -39,11 +39,17 @@ const storage = {
39
39
  client: {
40
40
  'cassandra-driver': {
41
41
  opName: () => 'cassandra.query',
42
- serviceName: (service, config, system) => config.service || fromSystem(service, system)
42
+ serviceName: ({ tracerService, pluginConfig, system }) =>
43
+ pluginConfig.service || fromSystem(tracerService, system)
44
+ },
45
+ couchbase: {
46
+ opName: ({ operation }) => `couchbase.${operation}`,
47
+ serviceName: ({ tracerService, pluginConfig }) => pluginConfig.service || `${tracerService}-couchbase`
43
48
  },
44
49
  elasticsearch: {
45
50
  opName: () => 'elasticsearch.query',
46
- serviceName: (service, config) => config.service || `${service}-elasticsearch`
51
+ serviceName: ({ tracerService, pluginConfig }) =>
52
+ pluginConfig.service || `${tracerService}-elasticsearch`
47
53
  },
48
54
  ioredis: redisConfig,
49
55
  mariadb: {
@@ -52,11 +58,13 @@ const storage = {
52
58
  },
53
59
  memcached: {
54
60
  opName: () => 'memcached.command',
55
- serviceName: (service, config, system) => config.service || fromSystem(service, system)
61
+ serviceName: ({ tracerService, pluginConfig, system }) =>
62
+ pluginConfig.service || fromSystem(tracerService, system)
56
63
  },
57
64
  'mongodb-core': {
58
65
  opName: () => 'mongodb.query',
59
- serviceName: (service, config) => config.service || `${service}-mongodb`
66
+ serviceName: ({ tracerService, pluginConfig }) =>
67
+ pluginConfig.service || `${tracerService}-mongodb`
60
68
  },
61
69
  mysql: {
62
70
  opName: () => 'mysql.query',
@@ -68,7 +76,8 @@ const storage = {
68
76
  },
69
77
  opensearch: {
70
78
  opName: () => 'opensearch.query',
71
- serviceName: (service, config) => config.service || `${service}-opensearch`
79
+ serviceName: ({ tracerService, pluginConfig }) =>
80
+ pluginConfig.service || `${tracerService}-opensearch`
72
81
  },
73
82
  oracledb: {
74
83
  opName: () => 'oracle.query',
@@ -81,7 +90,8 @@ const storage = {
81
90
  redis: redisConfig,
82
91
  tedious: {
83
92
  opName: () => 'tedious.request',
84
- serviceName: (service, config, system) => config.service || fromSystem(service, system)
93
+ serviceName: ({ tracerService, pluginConfig, system }) =>
94
+ pluginConfig.service || fromSystem(tracerService, system)
85
95
  }
86
96
  }
87
97
  }
@@ -1,6 +1,14 @@
1
- const { identityService } = require('../util')
1
+ const { identityService, httpPluginClientService, awsServiceV0 } = require('../util')
2
2
  const { DD_MAJOR } = require('../../../../../../version')
3
3
 
4
+ function withTracerV2Suffix (argsObj, fn, suffix) {
5
+ const { tracerService } = argsObj
6
+ if (DD_MAJOR <= 2) {
7
+ return fn({ ...argsObj, tracerService: `${tracerService}${suffix}` })
8
+ }
9
+ return fn(argsObj)
10
+ }
11
+
4
12
  const web = {
5
13
  client: {
6
14
  grpc: {
@@ -10,6 +18,26 @@ const web = {
10
18
  moleculer: {
11
19
  opName: () => 'moleculer.call',
12
20
  serviceName: identityService
21
+ },
22
+ http: {
23
+ opName: () => 'http.request',
24
+ serviceName: argsObj => withTracerV2Suffix(argsObj, httpPluginClientService, '-http-client')
25
+ },
26
+ fetch: {
27
+ opName: () => 'http.request',
28
+ serviceName: argsObj => withTracerV2Suffix(argsObj, httpPluginClientService, '-http-client')
29
+ },
30
+ http2: {
31
+ opName: () => 'http.request',
32
+ serviceName: argsObj => withTracerV2Suffix(argsObj, httpPluginClientService, '-http-client')
33
+ },
34
+ aws: {
35
+ opName: () => 'aws.request',
36
+ serviceName: awsServiceV0
37
+ },
38
+ lambda: {
39
+ opName: () => 'aws.request',
40
+ serviceName: awsServiceV0
13
41
  }
14
42
  },
15
43
  server: {
@@ -20,6 +48,18 @@ const web = {
20
48
  moleculer: {
21
49
  opName: () => 'moleculer.action',
22
50
  serviceName: identityService
51
+ },
52
+ http: {
53
+ opName: () => DD_MAJOR <= 2 ? 'http.request' : 'web.request',
54
+ serviceName: identityService
55
+ },
56
+ http2: {
57
+ opName: () => 'web.request',
58
+ serviceName: identityService
59
+ },
60
+ next: {
61
+ opName: () => 'next.request',
62
+ serviceName: identityService
23
63
  }
24
64
  }
25
65
  }
@@ -22,7 +22,15 @@ const messaging = {
22
22
  opName: () => 'kafka.send',
23
23
  serviceName: identityService
24
24
  },
25
- rhea: amqpOutbound
25
+ rhea: amqpOutbound,
26
+ sqs: {
27
+ opName: () => 'aws.sqs.send',
28
+ serviceName: identityService
29
+ },
30
+ sns: {
31
+ opName: () => 'aws.sns.send',
32
+ serviceName: identityService
33
+ }
26
34
  },
27
35
  consumer: {
28
36
  amqplib: amqpInbound,
@@ -35,7 +43,11 @@ const messaging = {
35
43
  opName: () => 'kafka.process',
36
44
  serviceName: identityService
37
45
  },
38
- rhea: amqpInbound
46
+ rhea: amqpInbound,
47
+ sqs: {
48
+ opName: () => 'aws.sqs.process',
49
+ serviceName: identityService
50
+ }
39
51
  },
40
52
  client: {
41
53
  amqplib: {
@@ -1,7 +1,6 @@
1
- const { identityService } = require('../util')
2
1
 
3
- function configWithFallback (service, config) {
4
- return config.service || service
2
+ function configWithFallback ({ tracerService, pluginConfig }) {
3
+ return pluginConfig.service || tracerService
5
4
  }
6
5
 
7
6
  const redisNaming = {
@@ -11,14 +10,14 @@ const redisNaming = {
11
10
 
12
11
  const mySQLNaming = {
13
12
  opName: () => 'mysql.query',
14
- serviceName: identityService
13
+ serviceName: withFunction
15
14
  }
16
15
 
17
- function withFunction (service, config, params) {
18
- if (typeof config.service === 'function') {
19
- return config.service(params)
16
+ function withFunction ({ tracerService, pluginConfig, params }) {
17
+ if (typeof pluginConfig.service === 'function') {
18
+ return pluginConfig.service(params)
20
19
  }
21
- return configWithFallback(service, config)
20
+ return configWithFallback({ tracerService, pluginConfig })
22
21
  }
23
22
 
24
23
  const storage = {
@@ -27,6 +26,10 @@ const storage = {
27
26
  opName: () => 'cassandra.query',
28
27
  serviceName: configWithFallback
29
28
  },
29
+ couchbase: {
30
+ opName: () => 'couchbase.query',
31
+ serviceName: configWithFallback
32
+ },
30
33
  elasticsearch: {
31
34
  opName: () => 'elasticsearch.query',
32
35
  serviceName: configWithFallback
@@ -34,7 +37,7 @@ const storage = {
34
37
  ioredis: redisNaming,
35
38
  mariadb: {
36
39
  opName: () => 'mariadb.query',
37
- serviceName: identityService
40
+ serviceName: withFunction
38
41
  },
39
42
  memcached: {
40
43
  opName: () => 'memcached.command',
@@ -1,4 +1,4 @@
1
- const { identityService } = require('../util')
1
+ const { identityService, httpPluginClientService } = require('../util')
2
2
 
3
3
  const web = {
4
4
  client: {
@@ -9,6 +9,26 @@ const web = {
9
9
  moleculer: {
10
10
  opName: () => 'moleculer.client.request',
11
11
  serviceName: identityService
12
+ },
13
+ http: {
14
+ opName: () => 'http.client.request',
15
+ serviceName: httpPluginClientService
16
+ },
17
+ fetch: {
18
+ opName: () => 'http.client.request',
19
+ serviceName: httpPluginClientService
20
+ },
21
+ http2: {
22
+ opName: () => 'http.client.request',
23
+ serviceName: httpPluginClientService
24
+ },
25
+ aws: {
26
+ opName: ({ awsService }) => `aws.${awsService}.request`,
27
+ serviceName: identityService
28
+ },
29
+ lambda: {
30
+ opName: () => 'aws.lambda.invoke',
31
+ serviceName: identityService
12
32
  }
13
33
  },
14
34
  server: {
@@ -19,6 +39,18 @@ const web = {
19
39
  moleculer: {
20
40
  opName: () => 'moleculer.server.request',
21
41
  serviceName: identityService
42
+ },
43
+ http: {
44
+ opName: () => 'http.server.request',
45
+ serviceName: identityService
46
+ },
47
+ http2: {
48
+ opName: () => 'http.server.request',
49
+ serviceName: identityService
50
+ },
51
+ next: {
52
+ opName: () => 'http.server.request',
53
+ serviceName: identityService
22
54
  }
23
55
  }
24
56
  }
@@ -62,7 +62,7 @@ function startupLog ({ agentError } = {}) {
62
62
  out.agent_error = agentError.message
63
63
  }
64
64
  out.debug = !!config.debug
65
- out.sample_rate = config.sampleRate
65
+ out.sample_rate = config.sampler.sampleRate
66
66
  out.sampling_rules = samplingRules
67
67
  out.tags = config.tags
68
68
  if (config.tags && config.tags.version) {
@@ -66,7 +66,7 @@ function onBeforeExit () {
66
66
  sendData(config, application, host, 'app-closing')
67
67
  }
68
68
 
69
- function createAppObject () {
69
+ function createAppObject (config) {
70
70
  return {
71
71
  service_name: config.service,
72
72
  env: config.env,
@@ -116,7 +116,7 @@ function start (aConfig, thePluginManager) {
116
116
  }
117
117
  config = aConfig
118
118
  pluginManager = thePluginManager
119
- application = createAppObject()
119
+ application = createAppObject(config)
120
120
  host = createHostObject()
121
121
  heartbeatInterval = config.telemetry.heartbeatInterval
122
122
 
@@ -155,8 +155,36 @@ function updateIntegrations () {
155
155
  sendData(config, application, host, 'app-integrations-change', { integrations })
156
156
  }
157
157
 
158
+ function updateConfig (changes, config) {
159
+ if (!config.telemetry.enabled) return
160
+ if (changes.length === 0) return
161
+
162
+ // Hack to make system tests happy until we ship telemetry v2
163
+ if (process.env.DD_INTERNAL_TELEMETRY_V2_ENABLED !== '1') return
164
+
165
+ const application = createAppObject(config)
166
+ const host = createHostObject()
167
+
168
+ const names = {
169
+ sampleRate: 'DD_TRACE_SAMPLE_RATE',
170
+ logInjection: 'DD_LOG_INJECTION',
171
+ headerTags: 'DD_TRACE_HEADER_TAGS'
172
+ }
173
+
174
+ const configuration = changes.map(change => ({
175
+ name: names[change.name],
176
+ value: Array.isArray(change.value) ? change.value.join(',') : change.value,
177
+ origin: change.origin
178
+ }))
179
+
180
+ sendData(config, application, host, 'app-client-configuration-change', {
181
+ configuration
182
+ })
183
+ }
184
+
158
185
  module.exports = {
159
186
  start,
160
187
  stop,
161
- updateIntegrations
188
+ updateIntegrations,
189
+ updateConfig
162
190
  }
@@ -25,6 +25,10 @@ class DatadogTracer extends Tracer {
25
25
  setStartupLogConfig(config)
26
26
  }
27
27
 
28
+ configure ({ env, sampler }) {
29
+ this._prioritySampler.configure(env, sampler)
30
+ }
31
+
28
32
  // todo[piochelepiotr] These two methods are not related to the tracer, but to data streams monitoring.
29
33
  // They should be moved outside of the tracer in the future.
30
34
  setCheckpoint (edgeTags) {