dd-trace 5.102.0 → 5.104.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.
- package/ext/exporters.js +1 -0
- package/index.d.ts +25 -3
- package/package.json +15 -13
- package/packages/datadog-esbuild/src/utils.js +2 -2
- package/packages/datadog-instrumentations/src/ai.js +1 -1
- package/packages/datadog-instrumentations/src/aws-sdk.js +2 -2
- package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -2
- package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +32 -15
- package/packages/datadog-instrumentations/src/couchbase.js +69 -220
- package/packages/datadog-instrumentations/src/cucumber.js +104 -31
- package/packages/datadog-instrumentations/src/elasticsearch.js +4 -4
- package/packages/datadog-instrumentations/src/electron/preload.js +42 -0
- package/packages/datadog-instrumentations/src/electron.js +240 -0
- package/packages/datadog-instrumentations/src/fetch.js +5 -5
- package/packages/datadog-instrumentations/src/graphql.js +13 -17
- package/packages/datadog-instrumentations/src/grpc/client.js +48 -32
- package/packages/datadog-instrumentations/src/helpers/callback-instrumentor.js +2 -2
- package/packages/datadog-instrumentations/src/helpers/hook.js +4 -1
- package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -0
- package/packages/datadog-instrumentations/src/helpers/instrument.js +2 -2
- package/packages/datadog-instrumentations/src/helpers/kafka.js +58 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/compiler.js +3 -2
- package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +19 -5
- package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +14 -13
- package/packages/datadog-instrumentations/src/http/client.js +2 -2
- package/packages/datadog-instrumentations/src/ioredis.js +18 -14
- package/packages/datadog-instrumentations/src/jest.js +382 -84
- package/packages/datadog-instrumentations/src/kafkajs.js +184 -174
- package/packages/datadog-instrumentations/src/mariadb.js +1 -1
- package/packages/datadog-instrumentations/src/memcached.js +2 -1
- package/packages/datadog-instrumentations/src/mocha/main.js +309 -56
- package/packages/datadog-instrumentations/src/mocha/utils.js +48 -8
- package/packages/datadog-instrumentations/src/mongodb-core.js +34 -9
- package/packages/datadog-instrumentations/src/mongoose.js +10 -12
- package/packages/datadog-instrumentations/src/mysql.js +2 -2
- package/packages/datadog-instrumentations/src/mysql2.js +1 -1
- package/packages/datadog-instrumentations/src/pg.js +25 -11
- package/packages/datadog-instrumentations/src/playwright.js +449 -60
- package/packages/datadog-instrumentations/src/redis.js +19 -10
- package/packages/datadog-instrumentations/src/router.js +4 -2
- package/packages/datadog-instrumentations/src/vitest.js +246 -149
- package/packages/datadog-plugin-apollo/src/gateway/request.js +1 -21
- package/packages/datadog-plugin-aws-sdk/src/base.js +18 -24
- package/packages/datadog-plugin-aws-sdk/src/services/cloudwatchlogs.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/s3.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/sns.js +2 -2
- package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
- package/packages/datadog-plugin-couchbase/src/index.js +58 -52
- package/packages/datadog-plugin-cucumber/src/index.js +1 -0
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +239 -40
- package/packages/datadog-plugin-cypress/src/support.js +13 -1
- package/packages/datadog-plugin-elasticsearch/src/index.js +28 -8
- package/packages/datadog-plugin-electron/src/index.js +17 -0
- package/packages/datadog-plugin-electron/src/ipc.js +143 -0
- package/packages/datadog-plugin-electron/src/net.js +82 -0
- package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +27 -18
- package/packages/datadog-plugin-graphql/src/execute.js +6 -28
- package/packages/datadog-plugin-graphql/src/resolve.js +30 -35
- package/packages/datadog-plugin-graphql/src/tools/signature.js +32 -7
- package/packages/datadog-plugin-graphql/src/tools/transforms.js +118 -100
- package/packages/datadog-plugin-graphql/src/utils.js +33 -1
- package/packages/datadog-plugin-grpc/src/client.js +6 -7
- package/packages/datadog-plugin-grpc/src/util.js +57 -22
- package/packages/datadog-plugin-http/src/client.js +2 -2
- package/packages/datadog-plugin-jest/src/index.js +92 -50
- package/packages/datadog-plugin-kafkajs/src/producer.js +32 -0
- package/packages/datadog-plugin-mocha/src/index.js +1 -0
- package/packages/datadog-plugin-mongodb-core/src/index.js +70 -69
- package/packages/datadog-plugin-mysql/src/index.js +1 -1
- package/packages/datadog-plugin-openai/src/services.js +2 -1
- package/packages/datadog-plugin-pg/src/index.js +3 -3
- package/packages/datadog-plugin-playwright/src/index.js +4 -0
- package/packages/datadog-plugin-redis/src/index.js +54 -24
- package/packages/datadog-plugin-undici/src/index.js +19 -0
- package/packages/datadog-plugin-vitest/src/index.js +19 -7
- package/packages/datadog-shimmer/src/shimmer.js +35 -0
- package/packages/dd-trace/src/aiguard/index.js +3 -1
- package/packages/dd-trace/src/aiguard/sdk.js +36 -30
- package/packages/dd-trace/src/aiguard/tags.js +20 -11
- package/packages/dd-trace/src/appsec/blocking.js +2 -2
- package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +2 -2
- package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +1 -1
- package/packages/dd-trace/src/appsec/index.js +10 -3
- package/packages/dd-trace/src/appsec/reporter.js +19 -5
- package/packages/dd-trace/src/azure_metadata.js +17 -6
- package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +4 -4
- package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +4 -2
- package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +6 -4
- package/packages/dd-trace/src/ci-visibility/requests/fs-cache.js +1 -1
- package/packages/dd-trace/src/ci-visibility/requests/request.js +3 -1
- package/packages/dd-trace/src/ci-visibility/test-api-manual/test-api-manual-plugin.js +5 -3
- package/packages/dd-trace/src/config/defaults.js +3 -14
- package/packages/dd-trace/src/config/generated-config-types.d.ts +4 -1
- package/packages/dd-trace/src/config/helper.js +4 -0
- package/packages/dd-trace/src/config/index.js +2 -2
- package/packages/dd-trace/src/config/major-overrides.js +98 -0
- package/packages/dd-trace/src/config/parsers.js +7 -1
- package/packages/dd-trace/src/config/supported-configurations.json +60 -38
- package/packages/dd-trace/src/crashtracking/crashtracker.js +15 -3
- package/packages/dd-trace/src/datastreams/checkpointer.js +2 -2
- package/packages/dd-trace/src/datastreams/context.js +4 -2
- package/packages/dd-trace/src/datastreams/manager.js +1 -1
- package/packages/dd-trace/src/datastreams/processor.js +2 -2
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +2 -2
- package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/state.js +2 -1
- package/packages/dd-trace/src/debugger/index.js +7 -7
- package/packages/dd-trace/src/dogstatsd.js +2 -2
- package/packages/dd-trace/src/encode/0.4.js +45 -54
- package/packages/dd-trace/src/encode/0.5.js +34 -3
- package/packages/dd-trace/src/encode/agentless-ci-visibility.js +26 -19
- package/packages/dd-trace/src/encode/agentless-json.js +1 -1
- package/packages/dd-trace/src/exporter.js +2 -0
- package/packages/dd-trace/src/exporters/agent/index.js +2 -1
- package/packages/dd-trace/src/exporters/agentless/index.js +3 -2
- package/packages/dd-trace/src/exporters/agentless/writer.js +2 -2
- package/packages/dd-trace/src/exporters/common/agents.js +3 -1
- package/packages/dd-trace/src/exporters/common/buffering-exporter.js +2 -1
- package/packages/dd-trace/src/exporters/common/request.js +4 -2
- package/packages/dd-trace/src/exporters/electron/index.js +49 -0
- package/packages/dd-trace/src/external-logger/src/index.js +2 -1
- package/packages/dd-trace/src/git_metadata.js +10 -8
- package/packages/dd-trace/src/id.js +17 -4
- package/packages/dd-trace/src/lambda/handler-paths.js +52 -0
- package/packages/dd-trace/src/lambda/handler.js +2 -4
- package/packages/dd-trace/src/lambda/index.js +62 -14
- package/packages/dd-trace/src/lambda/runtime/patch.js +21 -46
- package/packages/dd-trace/src/llmobs/index.js +13 -2
- package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +45 -15
- package/packages/dd-trace/src/llmobs/sdk.js +10 -0
- package/packages/dd-trace/src/llmobs/writers/base.js +2 -1
- package/packages/dd-trace/src/log/writer.js +3 -1
- package/packages/dd-trace/src/noop/span.js +3 -1
- package/packages/dd-trace/src/openfeature/writers/base.js +2 -1
- package/packages/dd-trace/src/openfeature/writers/exposures.js +51 -20
- package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +3 -2
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +20 -9
- package/packages/dd-trace/src/payload-tagging/config/index.js +2 -2
- package/packages/dd-trace/src/plugins/apollo.js +3 -1
- package/packages/dd-trace/src/plugins/ci_plugin.js +52 -17
- package/packages/dd-trace/src/plugins/database.js +54 -12
- package/packages/dd-trace/src/plugins/index.js +1 -0
- package/packages/dd-trace/src/plugins/log_plugin.js +3 -1
- package/packages/dd-trace/src/plugins/plugin.js +2 -4
- package/packages/dd-trace/src/plugins/tracing.js +5 -3
- package/packages/dd-trace/src/plugins/util/ci.js +8 -8
- package/packages/dd-trace/src/plugins/util/git-cache.js +20 -18
- package/packages/dd-trace/src/plugins/util/git.js +3 -1
- package/packages/dd-trace/src/plugins/util/stacktrace.js +2 -2
- package/packages/dd-trace/src/plugins/util/test.js +119 -5
- package/packages/dd-trace/src/plugins/util/user-provided-git.js +17 -15
- package/packages/dd-trace/src/plugins/util/web.js +11 -0
- package/packages/dd-trace/src/priority_sampler.js +1 -1
- package/packages/dd-trace/src/profiling/profiler.js +1 -1
- package/packages/dd-trace/src/profiling/profilers/wall.js +1 -1
- package/packages/dd-trace/src/profiling/ssi-heuristics.js +1 -1
- package/packages/dd-trace/src/rate_limiter.js +1 -1
- package/packages/dd-trace/src/remote_config/scheduler.js +1 -1
- package/packages/dd-trace/src/ritm.js +2 -1
- package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +5 -8
- package/packages/dd-trace/src/scope.js +7 -5
- package/packages/dd-trace/src/serverless.js +5 -2
- package/packages/dd-trace/src/service-naming/extra-services.js +14 -0
- package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +20 -0
- package/packages/dd-trace/src/service-naming/schemas/v0/web.js +4 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +20 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/web.js +4 -0
- package/packages/dd-trace/src/span_stats.js +1 -1
- package/packages/dd-trace/src/telemetry/dependencies.js +1 -1
- package/packages/dd-trace/src/telemetry/endpoints.js +1 -1
- package/packages/dd-trace/src/telemetry/telemetry.js +2 -2
- package/packages/dd-trace/src/lambda/runtime/ritm.js +0 -133
- package/vendor/dist/opentracing/LICENSE +0 -201
- package/vendor/dist/opentracing/binary_carrier.d.ts +0 -11
- package/vendor/dist/opentracing/constants.d.ts +0 -61
- package/vendor/dist/opentracing/examples/demo/demo.d.ts +0 -2
- package/vendor/dist/opentracing/ext/tags.d.ts +0 -90
- package/vendor/dist/opentracing/functions.d.ts +0 -20
- package/vendor/dist/opentracing/global_tracer.d.ts +0 -14
- package/vendor/dist/opentracing/index.d.ts +0 -12
- package/vendor/dist/opentracing/index.js +0 -1
- package/vendor/dist/opentracing/mock_tracer/index.d.ts +0 -5
- package/vendor/dist/opentracing/mock_tracer/mock_context.d.ts +0 -13
- package/vendor/dist/opentracing/mock_tracer/mock_report.d.ts +0 -16
- package/vendor/dist/opentracing/mock_tracer/mock_span.d.ts +0 -50
- package/vendor/dist/opentracing/mock_tracer/mock_tracer.d.ts +0 -26
- package/vendor/dist/opentracing/noop.d.ts +0 -8
- package/vendor/dist/opentracing/reference.d.ts +0 -33
- package/vendor/dist/opentracing/span.d.ts +0 -147
- package/vendor/dist/opentracing/span_context.d.ts +0 -26
- package/vendor/dist/opentracing/test/api_compatibility.d.ts +0 -16
- package/vendor/dist/opentracing/test/mocktracer_implemenation.d.ts +0 -3
- package/vendor/dist/opentracing/test/noop_implementation.d.ts +0 -4
- package/vendor/dist/opentracing/test/opentracing_api.d.ts +0 -3
- package/vendor/dist/opentracing/test/unittest.d.ts +0 -2
- package/vendor/dist/opentracing/tracer.d.ts +0 -127
|
@@ -163,8 +163,12 @@ const DD_CAPABILITIES_TEST_MANAGEMENT_DISABLE = '_dd.library_capabilities.test_m
|
|
|
163
163
|
const DD_CAPABILITIES_TEST_MANAGEMENT_ATTEMPT_TO_FIX = '_dd.library_capabilities.test_management.attempt_to_fix'
|
|
164
164
|
const DD_CAPABILITIES_FAILED_TEST_REPLAY = '_dd.library_capabilities.failed_test_replay'
|
|
165
165
|
|
|
166
|
-
// Library configuration request error
|
|
167
|
-
const
|
|
166
|
+
// Library configuration request error tags
|
|
167
|
+
const DD_CI_LIBRARY_CONFIGURATION_ERROR_SETTINGS = '_dd.ci.library_configuration_error.settings'
|
|
168
|
+
const DD_CI_LIBRARY_CONFIGURATION_ERROR_SKIPPABLE_TESTS = '_dd.ci.library_configuration_error.skippable_tests'
|
|
169
|
+
const DD_CI_LIBRARY_CONFIGURATION_ERROR_KNOWN_TESTS = '_dd.ci.library_configuration_error.known_tests'
|
|
170
|
+
const DD_CI_LIBRARY_CONFIGURATION_ERROR_TEST_MANAGEMENT_TESTS =
|
|
171
|
+
'_dd.ci.library_configuration_error.test_management_tests'
|
|
168
172
|
|
|
169
173
|
const UNSUPPORTED_TIA_FRAMEWORKS = new Set(['playwright', 'vitest'])
|
|
170
174
|
const MINIMUM_FRAMEWORK_VERSION_FOR_EFD = {
|
|
@@ -230,15 +234,120 @@ const BASE_LIKE_BRANCH_FILTER = /^(main|master|preprod|prod|dev|development|trun
|
|
|
230
234
|
*/
|
|
231
235
|
function getSessionRequestErrorTags (sessionSpan) {
|
|
232
236
|
const tags = sessionSpan?.context()._tags
|
|
237
|
+
const sessionRequestErrorTags = {}
|
|
233
238
|
if (!tags || typeof tags !== 'object') return {}
|
|
234
|
-
if (tags[
|
|
239
|
+
if (tags[DD_CI_LIBRARY_CONFIGURATION_ERROR_SETTINGS] === 'true') {
|
|
240
|
+
sessionRequestErrorTags[DD_CI_LIBRARY_CONFIGURATION_ERROR_SETTINGS] = 'true'
|
|
241
|
+
}
|
|
242
|
+
if (tags[DD_CI_LIBRARY_CONFIGURATION_ERROR_SKIPPABLE_TESTS] === 'true') {
|
|
243
|
+
sessionRequestErrorTags[DD_CI_LIBRARY_CONFIGURATION_ERROR_SKIPPABLE_TESTS] = 'true'
|
|
244
|
+
}
|
|
245
|
+
if (tags[DD_CI_LIBRARY_CONFIGURATION_ERROR_KNOWN_TESTS] === 'true') {
|
|
246
|
+
sessionRequestErrorTags[DD_CI_LIBRARY_CONFIGURATION_ERROR_KNOWN_TESTS] = 'true'
|
|
247
|
+
}
|
|
248
|
+
if (tags[DD_CI_LIBRARY_CONFIGURATION_ERROR_TEST_MANAGEMENT_TESTS] === 'true') {
|
|
249
|
+
sessionRequestErrorTags[DD_CI_LIBRARY_CONFIGURATION_ERROR_TEST_MANAGEMENT_TESTS] = 'true'
|
|
250
|
+
}
|
|
251
|
+
return sessionRequestErrorTags
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Returns ITR skipping-enabled tags from a test session span for propagation to child events.
|
|
256
|
+
* @param {{ context: () => { _tags?: Record<string, string> } } | undefined} sessionSpan
|
|
257
|
+
* @returns {Record<string, string>}
|
|
258
|
+
*/
|
|
259
|
+
function getSessionItrSkippingEnabledTags (sessionSpan) {
|
|
260
|
+
const tags = sessionSpan?.context()._tags
|
|
261
|
+
if (!tags || typeof tags !== 'object') return {}
|
|
262
|
+
if (tags[TEST_ITR_SKIPPING_ENABLED] !== undefined) {
|
|
235
263
|
return {
|
|
236
|
-
[
|
|
264
|
+
[TEST_ITR_SKIPPING_ENABLED]: tags[TEST_ITR_SKIPPING_ENABLED],
|
|
237
265
|
}
|
|
238
266
|
}
|
|
239
267
|
return {}
|
|
240
268
|
}
|
|
241
269
|
|
|
270
|
+
/**
|
|
271
|
+
* Starts supported test optimization requests together when each feature is enabled.
|
|
272
|
+
*
|
|
273
|
+
* @param {{
|
|
274
|
+
* isKnownTestsEnabled: boolean,
|
|
275
|
+
* isTestManagementTestsEnabled: boolean,
|
|
276
|
+
* isSuitesSkippingEnabled?: boolean,
|
|
277
|
+
* getKnownTests: () => Promise<object>,
|
|
278
|
+
* getTestManagementTests: () => Promise<object>,
|
|
279
|
+
* getSkippableSuites?: () => Promise<object>
|
|
280
|
+
* }} options - Test optimization request factories.
|
|
281
|
+
* @returns {Promise<{
|
|
282
|
+
* knownTestsResponse?: object,
|
|
283
|
+
* testManagementTestsResponse?: object,
|
|
284
|
+
* skippableSuitesResponse?: object
|
|
285
|
+
* }>}
|
|
286
|
+
*/
|
|
287
|
+
function getTestOptimizationRequestResults ({
|
|
288
|
+
isKnownTestsEnabled,
|
|
289
|
+
isTestManagementTestsEnabled,
|
|
290
|
+
isSuitesSkippingEnabled,
|
|
291
|
+
getKnownTests,
|
|
292
|
+
getTestManagementTests,
|
|
293
|
+
getSkippableSuites,
|
|
294
|
+
}) {
|
|
295
|
+
const requestPromises = []
|
|
296
|
+
const responseNames = []
|
|
297
|
+
|
|
298
|
+
if (isKnownTestsEnabled) {
|
|
299
|
+
addTestOptimizationRequest(requestPromises, responseNames, 'knownTestsResponse', getKnownTests)
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
if (isTestManagementTestsEnabled) {
|
|
303
|
+
addTestOptimizationRequest(
|
|
304
|
+
requestPromises,
|
|
305
|
+
responseNames,
|
|
306
|
+
'testManagementTestsResponse',
|
|
307
|
+
getTestManagementTests
|
|
308
|
+
)
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
if (isSuitesSkippingEnabled && getSkippableSuites) {
|
|
312
|
+
addTestOptimizationRequest(requestPromises, responseNames, 'skippableSuitesResponse', getSkippableSuites)
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
if (!requestPromises.length) {
|
|
316
|
+
return Promise.resolve({})
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
return Promise.allSettled(requestPromises).then(requestResults => {
|
|
320
|
+
const responses = {}
|
|
321
|
+
|
|
322
|
+
for (let index = 0; index < requestResults.length; index++) {
|
|
323
|
+
const requestResult = requestResults[index]
|
|
324
|
+
responses[responseNames[index]] = requestResult.status === 'fulfilled'
|
|
325
|
+
? requestResult.value
|
|
326
|
+
: { err: requestResult.reason }
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
return responses
|
|
330
|
+
})
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Starts a test optimization request.
|
|
335
|
+
*
|
|
336
|
+
* @param {Promise<object>[]} requestPromises - Test optimization request promises.
|
|
337
|
+
* @param {string[]} responseNames - Response keys matching request promises.
|
|
338
|
+
* @param {string} responseName - Response key for this request.
|
|
339
|
+
* @param {() => Promise<object>} getRequest - Test optimization request factory.
|
|
340
|
+
*/
|
|
341
|
+
function addTestOptimizationRequest (requestPromises, responseNames, responseName, getRequest) {
|
|
342
|
+
responseNames.push(responseName)
|
|
343
|
+
|
|
344
|
+
try {
|
|
345
|
+
requestPromises.push(Promise.resolve(getRequest()))
|
|
346
|
+
} catch (err) {
|
|
347
|
+
requestPromises.push(Promise.reject(err))
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
242
351
|
module.exports = {
|
|
243
352
|
TEST_CODE_OWNERS,
|
|
244
353
|
TEST_SESSION_NAME,
|
|
@@ -350,7 +459,12 @@ module.exports = {
|
|
|
350
459
|
TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED,
|
|
351
460
|
getLibraryCapabilitiesTags,
|
|
352
461
|
getSessionRequestErrorTags,
|
|
353
|
-
|
|
462
|
+
DD_CI_LIBRARY_CONFIGURATION_ERROR_SETTINGS,
|
|
463
|
+
DD_CI_LIBRARY_CONFIGURATION_ERROR_SKIPPABLE_TESTS,
|
|
464
|
+
DD_CI_LIBRARY_CONFIGURATION_ERROR_KNOWN_TESTS,
|
|
465
|
+
DD_CI_LIBRARY_CONFIGURATION_ERROR_TEST_MANAGEMENT_TESTS,
|
|
466
|
+
getSessionItrSkippingEnabledTags,
|
|
467
|
+
getTestOptimizationRequestResults,
|
|
354
468
|
checkShaDiscrepancies,
|
|
355
469
|
getPullRequestDiff,
|
|
356
470
|
getPullRequestBaseBranch,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const getConfig = require('../../config')
|
|
4
4
|
const {
|
|
5
5
|
GIT_COMMIT_SHA,
|
|
6
6
|
GIT_BRANCH,
|
|
@@ -46,20 +46,22 @@ function validateGitCommitSha (gitCommitSha) {
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
function getUserProviderGitMetadata () {
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
49
|
+
const {
|
|
50
|
+
DD_GIT_COMMIT_SHA,
|
|
51
|
+
DD_GIT_BRANCH,
|
|
52
|
+
DD_GIT_REPOSITORY_URL,
|
|
53
|
+
DD_GIT_TAG,
|
|
54
|
+
DD_GIT_COMMIT_MESSAGE,
|
|
55
|
+
DD_GIT_COMMIT_COMMITTER_NAME,
|
|
56
|
+
DD_GIT_COMMIT_COMMITTER_EMAIL,
|
|
57
|
+
DD_GIT_COMMIT_COMMITTER_DATE,
|
|
58
|
+
DD_GIT_COMMIT_AUTHOR_NAME,
|
|
59
|
+
DD_GIT_COMMIT_AUTHOR_EMAIL,
|
|
60
|
+
DD_GIT_COMMIT_AUTHOR_DATE,
|
|
61
|
+
DD_GIT_PULL_REQUEST_BASE_BRANCH,
|
|
62
|
+
DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA,
|
|
63
|
+
DD_GIT_COMMIT_HEAD_SHA,
|
|
64
|
+
} = getConfig()
|
|
63
65
|
|
|
64
66
|
const branch = normalizeRef(DD_GIT_BRANCH)
|
|
65
67
|
let tag = normalizeRef(DD_GIT_TAG)
|
|
@@ -400,6 +400,17 @@ function addRequestTags (context, spanType) {
|
|
|
400
400
|
}
|
|
401
401
|
}
|
|
402
402
|
|
|
403
|
+
// Datadog scan/test markers, tagged unconditionally so the API endpoint
|
|
404
|
+
// reducer can keep scan/test traffic out of the API inventory.
|
|
405
|
+
const endpointScan = req.headers['x-datadog-endpoint-scan']
|
|
406
|
+
if (endpointScan !== undefined) {
|
|
407
|
+
span.setTag(`${HTTP_REQUEST_HEADERS}.x-datadog-endpoint-scan`, endpointScan)
|
|
408
|
+
}
|
|
409
|
+
const securityTest = req.headers['x-datadog-security-test']
|
|
410
|
+
if (securityTest !== undefined) {
|
|
411
|
+
span.setTag(`${HTTP_REQUEST_HEADERS}.x-datadog-security-test`, securityTest)
|
|
412
|
+
}
|
|
413
|
+
|
|
403
414
|
addHeaders(context)
|
|
404
415
|
}
|
|
405
416
|
|
|
@@ -110,7 +110,7 @@ class PrioritySampler {
|
|
|
110
110
|
* Assigns a sampling priority to a span if not already set.
|
|
111
111
|
*
|
|
112
112
|
* @param {DatadogSpan} span
|
|
113
|
-
* @param {boolean} [auto
|
|
113
|
+
* @param {boolean} [auto] - Whether to use automatic sampling if no manual tags are present.
|
|
114
114
|
* @returns {void}
|
|
115
115
|
*/
|
|
116
116
|
sample (span, auto = true) {
|
|
@@ -260,7 +260,7 @@ class Profiler extends EventEmitter {
|
|
|
260
260
|
this.#lastStart = start
|
|
261
261
|
if (!this.#timer || timeout !== this._timeoutInterval) {
|
|
262
262
|
this.#timer = setTimeout(() => this._collect(snapshotKinds.PERIODIC), timeout)
|
|
263
|
-
this.#timer.unref()
|
|
263
|
+
this.#timer.unref?.()
|
|
264
264
|
} else {
|
|
265
265
|
this.#timer.refresh()
|
|
266
266
|
}
|
|
@@ -223,7 +223,7 @@ class NativeWallProfiler {
|
|
|
223
223
|
asyncContextsLiveGauge.mark(totalAsyncContextCount)
|
|
224
224
|
asyncContextsUsedGauge.mark(usedAsyncContextCount)
|
|
225
225
|
}, this.#telemetryHeartbeatIntervalMillis)
|
|
226
|
-
this._contextCountGaugeUpdater.unref()
|
|
226
|
+
this._contextCountGaugeUpdater.unref?.()
|
|
227
227
|
}
|
|
228
228
|
|
|
229
229
|
#enter () {
|
|
@@ -39,7 +39,7 @@ class SSIHeuristics {
|
|
|
39
39
|
setTimeout(() => {
|
|
40
40
|
this.shortLived = false
|
|
41
41
|
this._maybeTriggered()
|
|
42
|
-
}, this.longLivedThreshold).unref()
|
|
42
|
+
}, this.longLivedThreshold).unref?.()
|
|
43
43
|
|
|
44
44
|
this._onSpanCreated = this._onSpanCreated.bind(this)
|
|
45
45
|
dc.subscribe('dd-trace:span:start', this._onSpanCreated)
|
|
@@ -5,7 +5,7 @@ const limiter = require('../../../vendor/dist/limiter')
|
|
|
5
5
|
class RateLimiter {
|
|
6
6
|
/**
|
|
7
7
|
* @param {number} rateLimit - Allowed units per interval. Negative means unlimited, 0 disables.
|
|
8
|
-
* @param {'second'|'minute'|'hour'|'day'} [interval
|
|
8
|
+
* @param {'second'|'minute'|'hour'|'day'} [interval] - Time window for the limiter.
|
|
9
9
|
*/
|
|
10
10
|
constructor (rateLimit, interval = 'second') {
|
|
11
11
|
// TODO: Change rateLimit to integers. Right now these are sometimes strings, sometimes numbers.
|
|
@@ -31,6 +31,7 @@ const builtinModules = new Set(Module.builtinModules.map(stripNodePrefix))
|
|
|
31
31
|
|
|
32
32
|
function isBuiltinModuleName (name) {
|
|
33
33
|
if (typeof name !== 'string') return false
|
|
34
|
+
if (name === 'electron') return true
|
|
34
35
|
return builtinModules.has(stripNodePrefix(name))
|
|
35
36
|
}
|
|
36
37
|
|
|
@@ -101,7 +102,7 @@ function Hook (modules, options, onrequire) {
|
|
|
101
102
|
if (cache[moduleId]) {
|
|
102
103
|
// require.cache was potentially altered externally
|
|
103
104
|
const cacheEntry = require.cache[filename]
|
|
104
|
-
if (cacheEntry && cacheEntry.exports !== cache[
|
|
105
|
+
if (cacheEntry && cacheEntry.exports !== cache[moduleId].original) {
|
|
105
106
|
return cacheEntry.exports
|
|
106
107
|
}
|
|
107
108
|
|
|
@@ -8,14 +8,9 @@ const process = require('process')
|
|
|
8
8
|
const { performance, PerformanceObserver, monitorEventLoopDelay } = require('perf_hooks')
|
|
9
9
|
const { DogStatsDClient, MetricsAggregationClient } = require('../dogstatsd')
|
|
10
10
|
const log = require('../log')
|
|
11
|
-
const { getValueFromEnvSources } = require('../config/helper')
|
|
12
11
|
|
|
13
12
|
const { NODE_MAJOR } = require('../../../../version')
|
|
14
13
|
const processTags = require('../process-tags')
|
|
15
|
-
// TODO: This environment variable may not be changed, since the agent expects a flush every ten seconds.
|
|
16
|
-
// It is only a variable for testing. Think about alternatives.
|
|
17
|
-
const DD_RUNTIME_METRICS_FLUSH_INTERVAL = getValueFromEnvSources('DD_RUNTIME_METRICS_FLUSH_INTERVAL') ?? '10000'
|
|
18
|
-
const INTERVAL = Number.parseInt(DD_RUNTIME_METRICS_FLUSH_INTERVAL, 10)
|
|
19
14
|
|
|
20
15
|
const eventLoopDelayResolution = 4
|
|
21
16
|
|
|
@@ -40,6 +35,8 @@ module.exports = {
|
|
|
40
35
|
*/
|
|
41
36
|
start (config) {
|
|
42
37
|
this.stop()
|
|
38
|
+
// The agent expects a flush every ten seconds, so this is for tests only.
|
|
39
|
+
const flushIntervalMs = config.DD_RUNTIME_METRICS_FLUSH_INTERVAL
|
|
43
40
|
const clientConfig = DogStatsDClient.generateClientConfig(config)
|
|
44
41
|
|
|
45
42
|
if (config.DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED) {
|
|
@@ -81,7 +78,7 @@ module.exports = {
|
|
|
81
78
|
captureNativeMetrics(trackEventLoop, trackGc)
|
|
82
79
|
captureCommonMetrics(trackEventLoop)
|
|
83
80
|
client.flush()
|
|
84
|
-
},
|
|
81
|
+
}, flushIntervalMs)
|
|
85
82
|
} else {
|
|
86
83
|
lastCpuUsage = process.cpuUsage()
|
|
87
84
|
|
|
@@ -103,10 +100,10 @@ module.exports = {
|
|
|
103
100
|
captureEventLoopDelay()
|
|
104
101
|
}
|
|
105
102
|
client.flush()
|
|
106
|
-
},
|
|
103
|
+
}, flushIntervalMs)
|
|
107
104
|
}
|
|
108
105
|
|
|
109
|
-
interval.unref()
|
|
106
|
+
interval.unref?.()
|
|
110
107
|
},
|
|
111
108
|
|
|
112
109
|
stop () {
|
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
const { storage } = require('../../datadog-core')
|
|
4
4
|
|
|
5
|
+
const legacyStorage = storage('legacy')
|
|
6
|
+
|
|
5
7
|
// TODO: refactor bind to use shimmer once the new internal tracer lands
|
|
6
8
|
class Scope {
|
|
7
9
|
active () {
|
|
8
|
-
const store =
|
|
10
|
+
const store = legacyStorage.getStore()
|
|
9
11
|
|
|
10
12
|
return store?.span ?? null
|
|
11
13
|
}
|
|
@@ -13,10 +15,10 @@ class Scope {
|
|
|
13
15
|
activate (span, callback) {
|
|
14
16
|
if (typeof callback !== 'function') return callback
|
|
15
17
|
|
|
16
|
-
const oldStore =
|
|
17
|
-
const newStore = span ?
|
|
18
|
+
const oldStore = legacyStorage.getStore()
|
|
19
|
+
const newStore = span ? legacyStorage.getStore(span._store) : oldStore
|
|
18
20
|
|
|
19
|
-
|
|
21
|
+
legacyStorage.enterWith({ ...newStore, span })
|
|
20
22
|
|
|
21
23
|
try {
|
|
22
24
|
return callback()
|
|
@@ -27,7 +29,7 @@ class Scope {
|
|
|
27
29
|
|
|
28
30
|
throw e
|
|
29
31
|
} finally {
|
|
30
|
-
|
|
32
|
+
legacyStorage.enterWith(oldStore)
|
|
31
33
|
}
|
|
32
34
|
}
|
|
33
35
|
|
|
@@ -17,10 +17,13 @@ function getIsGCPFunction () {
|
|
|
17
17
|
/**
|
|
18
18
|
* Enable GCP Pub/Sub PUSH subscription tracing for Cloud Run (K_SERVICE present).
|
|
19
19
|
* PUSH: GCP sends HTTP POST requests to the service with message data in headers.
|
|
20
|
+
*
|
|
21
|
+
* Stays on the env helper to avoid closing the
|
|
22
|
+
* `config -> serverless -> config` import cycle.
|
|
20
23
|
*/
|
|
21
24
|
function enableGCPPubSubPushSubscription () {
|
|
22
|
-
|
|
23
|
-
|
|
25
|
+
return getEnvironmentVariable('K_SERVICE') !== undefined &&
|
|
26
|
+
!isFalse(getValueFromEnvSources('DD_TRACE_GCP_PUBSUB_PUSH_ENABLED'))
|
|
24
27
|
}
|
|
25
28
|
|
|
26
29
|
function getIsAzureFunction () {
|
|
@@ -1,13 +1,26 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const maxExtraServices = 64
|
|
4
|
+
/** @type {Set<string>} */
|
|
4
5
|
const extraServices = new Set()
|
|
5
6
|
|
|
7
|
+
// 1-element cache of the most-recent argument. The sole production caller
|
|
8
|
+
// (`span_format.js`) runs per span; without the cache every redis / mysql
|
|
9
|
+
// burst pays a `Set.add` hash + probe even though the value is already
|
|
10
|
+
// registered.
|
|
11
|
+
/** @type {string | null | undefined} */
|
|
12
|
+
let lastSeenService
|
|
13
|
+
|
|
6
14
|
function getExtraServices () {
|
|
7
15
|
return [...extraServices]
|
|
8
16
|
}
|
|
9
17
|
|
|
18
|
+
/**
|
|
19
|
+
* @param {string | null} [serviceName]
|
|
20
|
+
*/
|
|
10
21
|
function registerExtraService (serviceName) {
|
|
22
|
+
if (serviceName === lastSeenService) return
|
|
23
|
+
lastSeenService = serviceName
|
|
11
24
|
if (serviceName && extraServices.size < maxExtraServices) {
|
|
12
25
|
extraServices.add(serviceName)
|
|
13
26
|
}
|
|
@@ -15,6 +28,7 @@ function registerExtraService (serviceName) {
|
|
|
15
28
|
|
|
16
29
|
function clear () {
|
|
17
30
|
extraServices.clear()
|
|
31
|
+
lastSeenService = undefined
|
|
18
32
|
}
|
|
19
33
|
|
|
20
34
|
module.exports = {
|
|
@@ -32,6 +32,14 @@ const messaging = {
|
|
|
32
32
|
serviceName: ({ tracerService }) => `${tracerService}-azure-service-bus`,
|
|
33
33
|
serviceSource: integrationSource('azure-service-bus'),
|
|
34
34
|
},
|
|
35
|
+
'electron:ipc:main:send': {
|
|
36
|
+
opName: () => 'electron.main.send',
|
|
37
|
+
serviceName: identityService,
|
|
38
|
+
},
|
|
39
|
+
'electron:ipc:renderer:send': {
|
|
40
|
+
opName: () => 'electron.renderer.send',
|
|
41
|
+
serviceName: identityService,
|
|
42
|
+
},
|
|
35
43
|
'google-cloud-pubsub': {
|
|
36
44
|
opName: () => 'pubsub.request',
|
|
37
45
|
serviceName: ({ tracerService }) => `${tracerService}-pubsub`,
|
|
@@ -79,6 +87,18 @@ const messaging = {
|
|
|
79
87
|
serviceName: amqpServiceName,
|
|
80
88
|
serviceSource: integrationSource('amqp'),
|
|
81
89
|
},
|
|
90
|
+
'electron:ipc:main:receive': {
|
|
91
|
+
opName: () => 'electron.main.receive',
|
|
92
|
+
serviceName: identityService,
|
|
93
|
+
},
|
|
94
|
+
'electron:ipc:main:handle': {
|
|
95
|
+
opName: () => 'electron.main.handle',
|
|
96
|
+
serviceName: identityService,
|
|
97
|
+
},
|
|
98
|
+
'electron:ipc:renderer:receive': {
|
|
99
|
+
opName: () => 'electron.renderer.receive',
|
|
100
|
+
serviceName: identityService,
|
|
101
|
+
},
|
|
82
102
|
'google-cloud-pubsub': {
|
|
83
103
|
opName: () => 'pubsub.receive',
|
|
84
104
|
serviceName: ({ tracerService }) => `${tracerService}-pubsub`,
|
|
@@ -54,6 +54,10 @@ const web = {
|
|
|
54
54
|
serviceName: httpPluginClientService,
|
|
55
55
|
serviceSource: optionServiceSource,
|
|
56
56
|
},
|
|
57
|
+
'electron:net:request': {
|
|
58
|
+
opName: () => 'http.request',
|
|
59
|
+
serviceName: httpPluginClientService,
|
|
60
|
+
},
|
|
57
61
|
},
|
|
58
62
|
server: {
|
|
59
63
|
'apollo.gateway.request': {
|
|
@@ -24,6 +24,14 @@ const messaging = {
|
|
|
24
24
|
opName: () => 'azure.eventhubs.send',
|
|
25
25
|
serviceName: identityService,
|
|
26
26
|
},
|
|
27
|
+
'electron:ipc:main:send': {
|
|
28
|
+
opName: () => 'electron.main.send',
|
|
29
|
+
serviceName: identityService,
|
|
30
|
+
},
|
|
31
|
+
'electron:ipc:renderer:send': {
|
|
32
|
+
opName: () => 'electron.renderer.send',
|
|
33
|
+
serviceName: identityService,
|
|
34
|
+
},
|
|
27
35
|
'google-cloud-pubsub': {
|
|
28
36
|
opName: () => 'gcp.pubsub.send',
|
|
29
37
|
serviceName: identityService,
|
|
@@ -53,6 +61,18 @@ const messaging = {
|
|
|
53
61
|
consumer: {
|
|
54
62
|
amqplib: amqpInbound,
|
|
55
63
|
amqp10: amqpInbound,
|
|
64
|
+
'electron:ipc:main:receive': {
|
|
65
|
+
opName: () => 'electron.main.receive',
|
|
66
|
+
serviceName: identityService,
|
|
67
|
+
},
|
|
68
|
+
'electron:ipc:main:handle': {
|
|
69
|
+
opName: () => 'electron.main.handle',
|
|
70
|
+
serviceName: identityService,
|
|
71
|
+
},
|
|
72
|
+
'electron:ipc:renderer:receive': {
|
|
73
|
+
opName: () => 'electron.renderer.receive',
|
|
74
|
+
serviceName: identityService,
|
|
75
|
+
},
|
|
56
76
|
'google-cloud-pubsub': {
|
|
57
77
|
opName: () => 'gcp.pubsub.process',
|
|
58
78
|
serviceName: identityService,
|
|
@@ -48,6 +48,10 @@ const web = {
|
|
|
48
48
|
opName: () => 'undici.request',
|
|
49
49
|
serviceName: httpPluginClientService,
|
|
50
50
|
},
|
|
51
|
+
'electron:net:request': {
|
|
52
|
+
opName: () => 'http.client.request',
|
|
53
|
+
serviceName: httpPluginClientService,
|
|
54
|
+
},
|
|
51
55
|
},
|
|
52
56
|
server: {
|
|
53
57
|
'apollo.gateway.request': {
|
|
@@ -291,7 +291,7 @@ function heartbeat (config, application) {
|
|
|
291
291
|
|
|
292
292
|
const { reqType, payload } = createPayload('app-heartbeat')
|
|
293
293
|
sendData(config, application, host, reqType, payload, updateRetryData)
|
|
294
|
-
}, config.telemetry.heartbeatInterval).unref()
|
|
294
|
+
}, config.telemetry.heartbeatInterval).unref?.()
|
|
295
295
|
}
|
|
296
296
|
|
|
297
297
|
/** @param {import('../config/config-base')} config */
|
|
@@ -307,7 +307,7 @@ function extendedHeartbeat (config) {
|
|
|
307
307
|
heartbeatFailedDependencies = []
|
|
308
308
|
}
|
|
309
309
|
sendData(config, application, host, 'app-extended-heartbeat', appPayload)
|
|
310
|
-
}, config.telemetry.extendedHeartbeatInterval).unref()
|
|
310
|
+
}, config.telemetry.extendedHeartbeatInterval).unref?.()
|
|
311
311
|
}
|
|
312
312
|
|
|
313
313
|
/**
|