dd-trace 6.10.0 → 6.12.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 (173) hide show
  1. package/LICENSE-3rdparty.csv +5 -0
  2. package/README.md +0 -17
  3. package/index.d.ts +128 -6
  4. package/initialize.mjs +28 -17
  5. package/openfeature.js +2 -2
  6. package/package.json +27 -23
  7. package/packages/datadog-esbuild/index.js +0 -34
  8. package/packages/datadog-instrumentations/src/anthropic.js +210 -15
  9. package/packages/datadog-instrumentations/src/aws-sdk.js +9 -1
  10. package/packages/datadog-instrumentations/src/browser-bunyan.js +11 -0
  11. package/packages/datadog-instrumentations/src/bunyan.js +3 -16
  12. package/packages/datadog-instrumentations/src/cucumber.js +30 -15
  13. package/packages/datadog-instrumentations/src/cypress-config.js +182 -16
  14. package/packages/datadog-instrumentations/src/cypress-legacy-finalizers.js +30 -0
  15. package/packages/datadog-instrumentations/src/cypress.js +2 -0
  16. package/packages/datadog-instrumentations/src/fastify.js +2 -0
  17. package/packages/datadog-instrumentations/src/helpers/bunyan.js +22 -0
  18. package/packages/datadog-instrumentations/src/helpers/hooks.js +2 -1
  19. package/packages/datadog-instrumentations/src/helpers/pool-acquire.js +9 -4
  20. package/packages/datadog-instrumentations/src/helpers/register.js +10 -8
  21. package/packages/datadog-instrumentations/src/jest.js +25 -17
  22. package/packages/datadog-instrumentations/src/mariadb.js +278 -21
  23. package/packages/datadog-instrumentations/src/mocha/main.js +539 -55
  24. package/packages/datadog-instrumentations/src/mocha/utils.js +135 -19
  25. package/packages/datadog-instrumentations/src/playwright-reporter.js +247 -0
  26. package/packages/datadog-instrumentations/src/playwright.js +182 -35
  27. package/packages/datadog-instrumentations/src/router.js +2 -0
  28. package/packages/datadog-instrumentations/src/vitest-main-no-worker-init.js +6 -8
  29. package/packages/datadog-instrumentations/src/vitest-main.js +11 -3
  30. package/packages/datadog-plugin-aws-sdk/src/base.js +1 -0
  31. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +163 -44
  32. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +2 -8
  33. package/packages/datadog-plugin-azure-functions/src/index.js +1 -1
  34. package/packages/datadog-plugin-browser-bunyan/src/index.js +9 -0
  35. package/packages/datadog-plugin-bunyan/src/index.js +5 -8
  36. package/packages/datadog-plugin-cucumber/src/index.js +11 -0
  37. package/packages/datadog-plugin-cypress/src/after-run.js +5 -1
  38. package/packages/datadog-plugin-cypress/src/after-spec.js +5 -1
  39. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +81 -29
  40. package/packages/datadog-plugin-cypress/src/finalization.js +76 -0
  41. package/packages/datadog-plugin-cypress/src/index.js +12 -6
  42. package/packages/datadog-plugin-cypress/src/plugin.js +16 -3
  43. package/packages/datadog-plugin-dd-trace-api/src/index.js +4 -0
  44. package/packages/datadog-plugin-electron/src/index.js +2 -0
  45. package/packages/datadog-plugin-fs/src/index.js +1 -1
  46. package/packages/datadog-plugin-jest/src/index.js +6 -0
  47. package/packages/datadog-plugin-mocha/src/index.js +56 -1
  48. package/packages/datadog-plugin-nats/src/index.js +1 -1
  49. package/packages/datadog-plugin-openai/src/tracing.js +41 -30
  50. package/packages/datadog-plugin-openai-agents/src/integration.js +1 -0
  51. package/packages/datadog-plugin-playwright/src/index.js +46 -13
  52. package/packages/datadog-plugin-vitest/src/index.js +6 -0
  53. package/packages/datadog-webpack/index.js +0 -11
  54. package/packages/dd-trace/index.js +0 -1
  55. package/packages/dd-trace/src/agent/info.js +6 -5
  56. package/packages/dd-trace/src/aiguard/client.js +100 -1
  57. package/packages/dd-trace/src/aiguard/errors.js +41 -0
  58. package/packages/dd-trace/src/aiguard/evaluation.js +357 -0
  59. package/packages/dd-trace/src/aiguard/integrations/anthropic.js +70 -0
  60. package/packages/dd-trace/src/aiguard/integrations/index.js +4 -0
  61. package/packages/dd-trace/src/aiguard/messages/anthropic.js +423 -0
  62. package/packages/dd-trace/src/aiguard/messages/openai.js +1 -24
  63. package/packages/dd-trace/src/aiguard/messages/utils.js +28 -0
  64. package/packages/dd-trace/src/aiguard/messages/vercel-ai.js +1 -11
  65. package/packages/dd-trace/src/aiguard/sdk.js +22 -278
  66. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +9 -12
  67. package/packages/dd-trace/src/appsec/reporter.js +2 -0
  68. package/packages/dd-trace/src/appsec/telemetry/index.js +13 -0
  69. package/packages/dd-trace/src/appsec/telemetry/rasp.js +16 -0
  70. package/packages/dd-trace/src/appsec/telemetry/waf.js +24 -0
  71. package/packages/dd-trace/src/carrier.js +107 -48
  72. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +1 -0
  73. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +5 -5
  74. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +29 -3
  75. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +27 -9
  76. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +21 -5
  77. package/packages/dd-trace/src/ci-visibility/exporters/agentless/request-tracker.js +164 -0
  78. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +26 -8
  79. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +365 -32
  80. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +6 -4
  81. package/packages/dd-trace/src/ci-visibility/exporters/request.js +201 -0
  82. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +5 -3
  83. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +9 -5
  84. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +7 -4
  85. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +4 -2
  86. package/packages/dd-trace/src/ci-visibility/requests/rate-limit.js +39 -0
  87. package/packages/dd-trace/src/ci-visibility/requests/request.js +3 -6
  88. package/packages/dd-trace/src/ci-visibility/requests/upload-coverage-report.js +4 -2
  89. package/packages/dd-trace/src/ci-visibility/requests/upload-test-screenshot.js +10 -4
  90. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +5 -5
  91. package/packages/dd-trace/src/config/generated-config-types.d.ts +4 -0
  92. package/packages/dd-trace/src/config/index.js +13 -2
  93. package/packages/dd-trace/src/config/major-overrides.js +7 -0
  94. package/packages/dd-trace/src/config/supported-configurations.json +14 -0
  95. package/packages/dd-trace/src/datastreams/index.js +2 -0
  96. package/packages/dd-trace/src/datastreams/manager.js +9 -2
  97. package/packages/dd-trace/src/datastreams/processor.js +15 -13
  98. package/packages/dd-trace/src/datastreams/size.js +5 -0
  99. package/packages/dd-trace/src/debugger/constants.js +1 -0
  100. package/packages/dd-trace/src/debugger/devtools_client/condition.js +1 -1
  101. package/packages/dd-trace/src/debugger/devtools_client/index.js +5 -11
  102. package/packages/dd-trace/src/debugger/index.js +4 -2
  103. package/packages/dd-trace/src/debugger/inspect-segment.js +154 -0
  104. package/packages/dd-trace/src/evp_proxy/constants.js +8 -0
  105. package/packages/dd-trace/src/evp_proxy/direct.js +64 -0
  106. package/packages/dd-trace/src/evp_proxy/discovery.js +133 -0
  107. package/packages/dd-trace/src/evp_proxy/path.js +22 -0
  108. package/packages/dd-trace/src/exporters/agent/writer.js +49 -9
  109. package/packages/dd-trace/src/exporters/common/buffering-exporter.js +6 -4
  110. package/packages/dd-trace/src/exporters/common/request.js +5 -2
  111. package/packages/dd-trace/src/exporters/common/writer.js +11 -6
  112. package/packages/dd-trace/src/llmobs/experiments/client.js +167 -5
  113. package/packages/dd-trace/src/llmobs/experiments/dataset.js +484 -92
  114. package/packages/dd-trace/src/llmobs/experiments/experiment.js +302 -29
  115. package/packages/dd-trace/src/llmobs/experiments/index.js +75 -64
  116. package/packages/dd-trace/src/llmobs/experiments/noop.js +135 -7
  117. package/packages/dd-trace/src/llmobs/experiments/result.js +1 -0
  118. package/packages/dd-trace/src/llmobs/experiments/util.js +101 -9
  119. package/packages/dd-trace/src/llmobs/plugins/ai/util.js +12 -3
  120. package/packages/dd-trace/src/llmobs/plugins/base.js +4 -2
  121. package/packages/dd-trace/src/noop/proxy.js +3 -4
  122. package/packages/dd-trace/src/openfeature/constants/constants.js +0 -18
  123. package/packages/dd-trace/src/openfeature/flagging_provider.js +18 -2
  124. package/packages/dd-trace/src/openfeature/index.js +7 -4
  125. package/packages/dd-trace/src/openfeature/remote_config.js +1 -1
  126. package/packages/dd-trace/src/openfeature/writers/base.js +153 -11
  127. package/packages/dd-trace/src/openfeature/writers/exposures.js +62 -14
  128. package/packages/dd-trace/src/openfeature/writers/util.js +97 -15
  129. package/packages/dd-trace/src/opentelemetry/context_manager.js +7 -7
  130. package/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +2 -1
  131. package/packages/dd-trace/src/opentelemetry/logs/logger.js +67 -11
  132. package/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +14 -3
  133. package/packages/dd-trace/src/opentelemetry/metrics/index.js +25 -12
  134. package/packages/dd-trace/src/opentelemetry/metrics/otlp_span_stats_exporter.js +2 -5
  135. package/packages/dd-trace/src/opentelemetry/metrics/otlp_span_stats_transformer.js +96 -43
  136. package/packages/dd-trace/src/opentracing/propagation/text_map.js +22 -13
  137. package/packages/dd-trace/src/opentracing/tracer.js +5 -2
  138. package/packages/dd-trace/src/otel-thread-ctx.js +387 -0
  139. package/packages/dd-trace/src/plugin_manager.js +3 -3
  140. package/packages/dd-trace/src/plugins/ci_plugin.js +6 -1
  141. package/packages/dd-trace/src/plugins/index.js +1 -0
  142. package/packages/dd-trace/src/plugins/util/jest.js +4 -3
  143. package/packages/dd-trace/src/plugins/util/test.js +9 -9
  144. package/packages/dd-trace/src/plugins/util/web.js +3 -0
  145. package/packages/dd-trace/src/profiling/profiler.js +1 -1
  146. package/packages/dd-trace/src/profiling/profilers/space.js +1 -3
  147. package/packages/dd-trace/src/profiling/profilers/wall.js +37 -90
  148. package/packages/dd-trace/src/profiling/webspan-utils.js +45 -0
  149. package/packages/dd-trace/src/proxy.js +38 -29
  150. package/packages/dd-trace/src/ritm.js +9 -2
  151. package/packages/dd-trace/src/serverless.js +37 -0
  152. package/packages/dd-trace/src/span_format.js +1 -0
  153. package/packages/dd-trace/src/span_stats.js +30 -3
  154. package/packages/dd-trace/src/storage-channels.js +86 -0
  155. package/packages/dd-trace/src/telemetry/metrics.js +62 -8
  156. package/packages/dd-trace/src/telemetry/send-data.js +1 -0
  157. package/packages/dd-trace/src/tracer.js +9 -2
  158. package/packages/dd-trace/src/tracer_metadata.js +14 -1
  159. package/packages/dd-trace/src/web-tags-cache.js +132 -0
  160. package/vendor/dist/@datadog/openfeature-node-server/LICENSE +201 -0
  161. package/vendor/dist/@datadog/openfeature-node-server/index.js +1 -0
  162. package/vendor/dist/@datadog/sketches-js/index.js +1 -1
  163. package/vendor/dist/https-proxy-agent/LICENSE +22 -0
  164. package/vendor/dist/https-proxy-agent/index.js +4 -0
  165. package/vendor/dist/protobufjs/index.js +1 -1
  166. package/vendor/dist/protobufjs/minimal/index.js +1 -1
  167. package/vendor/dist/proxy-from-env/LICENSE +20 -0
  168. package/vendor/dist/proxy-from-env/index.js +1 -0
  169. package/packages/datadog-instrumentations/src/helpers/optional-peer-bundler.js +0 -65
  170. package/packages/datadog-webpack/src/optional-peer-loader.js +0 -17
  171. package/packages/dd-trace/src/feature-registry.js +0 -29
  172. package/packages/dd-trace/src/openfeature/register.js +0 -35
  173. package/packages/dd-trace/src/openfeature/require-provider.js +0 -18
@@ -1,7 +1,19 @@
1
1
  'use strict'
2
2
 
3
+ const { performance } = require('node:perf_hooks')
4
+
3
5
  const shimmer = require('../../datadog-shimmer')
4
6
  const { channel, addHook } = require('./helpers/instrument')
7
+ const {
8
+ acquireWait,
9
+ clearPoolWaitTime,
10
+ isPoolQueryAcquire,
11
+ runOutsidePoolQueryAcquire,
12
+ runPoolAcquireError,
13
+ runWithPoolWait,
14
+ takePoolWaitTime,
15
+ wrapPoolQueryMethod,
16
+ } = require('./helpers/pool-acquire')
5
17
 
6
18
  const commandAddCh = channel('apm:mariadb:command:add')
7
19
  const connectionStartCh = channel('apm:mariadb:connection:start')
@@ -10,11 +22,37 @@ const startCh = channel('apm:mariadb:query:start')
10
22
  const finishCh = channel('apm:mariadb:query:finish')
11
23
  const errorCh = channel('apm:mariadb:query:error')
12
24
  const skipCh = channel('apm:mariadb:pool:skip')
25
+ const acquireStartCh = channel('apm:mariadb:pool:acquire:start')
26
+ const acquireFinishCh = channel('apm:mariadb:pool:acquire:finish')
27
+ const poolAcquireChannels = {
28
+ connectionFinishCh,
29
+ acquireStartCh,
30
+ acquireFinishCh,
31
+ }
32
+ const wrappedPools = new WeakSet()
33
+
34
+ /**
35
+ * @typedef {object} PoolAcquireTiming
36
+ * @property {number} [poolAcquireStart]
37
+ * @property {number} [poolAcquireStartedAt]
38
+ * @property {number} [poolWaitTime]
39
+ */
40
+
41
+ /** @typedef {{ length: number, [index: number]: unknown } & Iterable<unknown>} ArgumentsLike */
42
+
43
+ /** @type {PoolAcquireTiming|undefined} */
44
+ let currentPoolAcquireTiming
45
+ let explicitPoolAcquire = false
13
46
 
14
47
  function wrapCommandStart (start, ctx) {
15
48
  return shimmer.wrapFunction(start, start => function (...args) {
16
49
  if (!startCh.hasSubscribers) return start.apply(this, args)
17
50
 
51
+ const poolWaitTime = takePoolWaitTime(args[0])
52
+ if (poolWaitTime !== undefined) {
53
+ ctx.poolWaitTime = poolWaitTime
54
+ }
55
+
18
56
  const { reject, resolve } = this
19
57
  shimmer.wrap(this, 'resolve', function wrapResolve () {
20
58
  return function (...args) {
@@ -133,43 +171,262 @@ function wrapPoolMethod (createConnection) {
133
171
  }
134
172
  }
135
173
 
174
+ /**
175
+ * @param {Function} getConnection
176
+ * @returns {Function}
177
+ */
178
+ function wrapExplicitPoolGetConnection (getConnection) {
179
+ return function wrappedExplicitPoolGetConnection () {
180
+ if (!connectionStartCh.hasSubscribers) {
181
+ return getConnection.apply(this, arguments)
182
+ }
183
+
184
+ const previous = explicitPoolAcquire
185
+ explicitPoolAcquire = true
186
+ try {
187
+ return runOutsidePoolQueryAcquire(getConnection, this, arguments)
188
+ } finally {
189
+ explicitPoolAcquire = previous
190
+ }
191
+ }
192
+ }
193
+
194
+ /**
195
+ * @param {Function} method
196
+ * @returns {Function}
197
+ */
198
+ function wrapPoolQuery (method) {
199
+ return wrapPoolQueryMethod(method, connectionStartCh)
200
+ }
201
+
202
+ /**
203
+ * @param {Function} Pool
204
+ * @returns {boolean}
205
+ */
206
+ function claimPoolWrap (Pool) {
207
+ if (wrappedPools.has(Pool)) return false
208
+ wrappedPools.add(Pool)
209
+ return true
210
+ }
211
+
212
+ /**
213
+ * @param {Function} Pool
214
+ * @returns {Function}
215
+ */
216
+ function wrapPublicPool (Pool) {
217
+ if (!claimPoolWrap(Pool)) return Pool
218
+
219
+ shimmer.wrap(Pool.prototype, 'getConnection', wrapExplicitPoolGetConnection)
220
+ shimmer.wrap(Pool.prototype, 'query', wrapPoolQuery)
221
+ shimmer.wrap(Pool.prototype, 'execute', wrapPoolQuery)
222
+ return Pool
223
+ }
224
+
225
+ /**
226
+ * @param {Function} Pool
227
+ * @returns {Function}
228
+ */
229
+ function wrapInternalPool (Pool) {
230
+ if (!claimPoolWrap(Pool)) return Pool
231
+
232
+ // The idle callback must be replaced before validation and observed before the method returns,
233
+ // which cannot be expressed by Orchestrion's subscriber lifecycle.
234
+ shimmer.wrap(Pool.prototype, '_acquireIdleConnection', wrapPoolAcquireIdleMethod)
235
+ shimmer.wrap(Pool.prototype, 'getConnection', wrapPoolGetConnectionMethod)
236
+ shimmer.wrap(Pool.prototype, '_createPoolConnection', wrapPoolMethod)
237
+ return Pool
238
+ }
239
+
240
+ /**
241
+ * @param {Record<string, unknown>} acquireCtx
242
+ * @param {Function} callback
243
+ * @param {unknown} thisArg
244
+ * @param {ArgumentsLike} args
245
+ * @returns {unknown}
246
+ */
247
+ function finishExplicitPoolAcquire (acquireCtx, callback, thisArg, args) {
248
+ acquireFinishCh.publish(acquireCtx)
249
+ return callback.apply(thisArg, args)
250
+ }
251
+
252
+ /**
253
+ * @param {PoolAcquireTiming} timing
254
+ */
255
+ function startPoolAcquireTiming (timing) {
256
+ const start = performance.now()
257
+ timing.poolAcquireStart = start
258
+ timing.poolAcquireStartedAt ??= start
259
+ }
260
+
261
+ /**
262
+ * @param {PoolAcquireTiming} timing
263
+ * @returns {number}
264
+ */
265
+ function finishPoolAcquireTiming (timing) {
266
+ const poolWaitTime = (timing.poolWaitTime ?? 0) + acquireWait(timing.poolAcquireStart)
267
+ timing.poolAcquireStart = undefined
268
+ timing.poolWaitTime = poolWaitTime
269
+ return poolWaitTime
270
+ }
271
+
272
+ /**
273
+ * @param {Function} acquireIdleConnection
274
+ * @returns {Function}
275
+ */
276
+ function wrapPoolAcquireIdleMethod (acquireIdleConnection) {
277
+ return function wrappedAcquireIdleConnection (callback) {
278
+ const timing = currentPoolAcquireTiming
279
+ if (timing === undefined) {
280
+ return acquireIdleConnection.apply(this, arguments)
281
+ }
282
+ currentPoolAcquireTiming = undefined
283
+
284
+ let completed = false
285
+ let synchronous = true
286
+
287
+ /**
288
+ * @param {unknown} error
289
+ * @returns {unknown}
290
+ */
291
+ arguments[0] = function wrappedCallback (error) {
292
+ completed = true
293
+ if (error) {
294
+ if (synchronous) {
295
+ startPoolAcquireTiming(timing)
296
+ }
297
+ } else if (synchronous) {
298
+ timing.poolWaitTime = 0
299
+ } else {
300
+ finishPoolAcquireTiming(timing)
301
+ }
302
+ return callback.apply(this, arguments)
303
+ }
304
+
305
+ const result = acquireIdleConnection.apply(this, arguments)
306
+ synchronous = false
307
+ if (!completed) {
308
+ startPoolAcquireTiming(timing)
309
+ }
310
+ return result
311
+ }
312
+ }
313
+
314
+ /**
315
+ * @param {Function} getConnection
316
+ * @returns {Function}
317
+ */
136
318
  function wrapPoolGetConnectionMethod (getConnection) {
137
- return function wrappedGetConnection (...args) {
138
- const cb = args.at(-1)
139
- if (typeof cb !== 'function') return getConnection.apply(this, args)
319
+ const poolWaitTransfer = { deferred: false }
320
+
321
+ return function wrappedGetConnection (cmdParam, callback) {
322
+ if (!connectionStartCh.hasSubscribers) {
323
+ return getConnection.apply(this, arguments)
324
+ }
140
325
 
141
326
  const ctx = {}
327
+ const poolQueryAcquire = isPoolQueryAcquire()
328
+ const acquireCtx = !poolQueryAcquire && explicitPoolAcquire && acquireStartCh.hasSubscribers
329
+ ? { conf: this.opts.connOptions }
330
+ : undefined
331
+ const pool = this
332
+
333
+ if (acquireCtx !== undefined) {
334
+ acquireStartCh.publish(acquireCtx)
335
+ }
142
336
 
143
- args[args.length - 1] = function (...args) {
144
- return connectionFinishCh.runStores(ctx, cb, this, ...args)
337
+ /**
338
+ * @param {unknown} error
339
+ * @param {{ streamOut: object }|undefined} connection
340
+ * @returns {unknown}
341
+ */
342
+ arguments[1] = function wrappedCallback (error, connection) {
343
+ const poolWaitTime = poolQueryAcquire || acquireCtx !== undefined
344
+ ? finishPoolAcquireTiming(ctx)
345
+ : undefined
346
+
347
+ if (poolQueryAcquire) {
348
+ if (error) {
349
+ return runPoolAcquireError(
350
+ ctx.poolAcquireStartedAt,
351
+ error,
352
+ { conf: pool.opts.connOptions },
353
+ poolAcquireChannels,
354
+ ctx,
355
+ callback,
356
+ this,
357
+ arguments,
358
+ poolWaitTime
359
+ )
360
+ }
361
+
362
+ return runWithPoolWait(
363
+ poolWaitTransfer,
364
+ connection.streamOut,
365
+ poolWaitTime,
366
+ connectionFinishCh,
367
+ ctx,
368
+ callback,
369
+ this,
370
+ arguments
371
+ )
372
+ }
373
+
374
+ if (acquireCtx !== undefined) {
375
+ if (!error && connection !== undefined) {
376
+ clearPoolWaitTime(connection.streamOut)
377
+ }
378
+ acquireCtx.error = error
379
+ acquireCtx.poolWaitTime = poolWaitTime
380
+ return connectionFinishCh.runStores(
381
+ ctx,
382
+ finishExplicitPoolAcquire,
383
+ undefined,
384
+ acquireCtx,
385
+ callback,
386
+ this,
387
+ arguments
388
+ )
389
+ }
390
+ return connectionFinishCh.runStores(ctx, callback, this, ...arguments)
145
391
  }
146
392
 
147
393
  connectionStartCh.publish(ctx)
148
394
 
149
- return getConnection.apply(this, args)
395
+ if (!poolQueryAcquire && acquireCtx === undefined) {
396
+ return getConnection.apply(pool, arguments)
397
+ }
398
+
399
+ const previousTiming = currentPoolAcquireTiming
400
+ const previousExplicitPoolAcquire = explicitPoolAcquire
401
+ currentPoolAcquireTiming = ctx
402
+ if (previousExplicitPoolAcquire) explicitPoolAcquire = false
403
+ try {
404
+ return poolQueryAcquire
405
+ ? runOutsidePoolQueryAcquire(getConnection, pool, arguments)
406
+ : getConnection.apply(pool, arguments)
407
+ } finally {
408
+ currentPoolAcquireTiming = previousTiming
409
+ if (previousExplicitPoolAcquire) explicitPoolAcquire = true
410
+ }
150
411
  }
151
412
  }
152
413
 
153
414
  const name = 'mariadb'
154
415
 
155
- addHook({ name, file: 'lib/cmd/query.js', versions: ['>=3'] }, (Query) => {
156
- return wrapCommand(Query)
157
- })
416
+ addHook({ name, file: 'lib/cmd/query.js', versions: ['>=3'], patchDefault: true }, wrapCommand)
417
+ addHook({ name, file: 'lib/cmd/execute.js', versions: ['>=3'], patchDefault: true }, wrapCommand)
158
418
 
159
- addHook({ name, file: 'lib/cmd/execute.js', versions: ['>=3'] }, (Execute) => {
160
- return wrapCommand(Execute)
161
- })
419
+ // mariadb 3.4.1 switched its internal getConnection from promises to callbacks. That exposes synchronous
420
+ // recent-idle reuse without a clock read while still letting us time validation and queueing.
421
+ // The same release renamed _createConnection to _createPoolConnection.
422
+ addHook({ name, file: 'lib/pool.js', versions: ['>=3.4.1'], patchDefault: true }, wrapInternalPool)
162
423
 
163
- // mariadb 3.4.1 refactored the pool: getConnection switched from promises to
164
- // callbacks and _createConnection was renamed to _createPoolConnection.
165
- addHook({ name, file: 'lib/pool.js', versions: ['>=3.4.1'] }, (Pool) => {
166
- shimmer.wrap(Pool.prototype, 'getConnection', wrapPoolGetConnectionMethod)
167
- shimmer.wrap(Pool.prototype, '_createPoolConnection', wrapPoolMethod)
168
-
169
- return Pool
170
- })
424
+ // Orchestrion completion follows the returned Promise, but operation classification must end as
425
+ // soon as the facade calls its private internal pool, so these methods need a synchronous bracket.
426
+ addHook({ name, file: 'lib/pool-promise.js', versions: ['>=3.4.1'], patchDefault: true }, wrapPublicPool)
427
+ addHook({ name, file: 'lib/pool-callback.js', versions: ['>=3.4.1'], patchDefault: true }, wrapPublicPool)
171
428
 
172
- addHook({ name, file: 'lib/pool.js', versions: ['>=3 <3.4.1'] }, (Pool) => {
429
+ addHook({ name, file: 'lib/pool.js', versions: ['>=3 <3.4.1'], patchDefault: true }, (Pool) => {
173
430
  shimmer.wrap(Pool.prototype, '_createConnection', wrapPoolMethod)
174
431
 
175
432
  return Pool