dd-trace 5.98.0 → 5.99.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/LICENSE-3rdparty.csv +0 -1
- package/ext/tags.js +1 -0
- package/index.d.ts +9 -1
- package/package.json +48 -46
- package/packages/datadog-instrumentations/src/crypto.js +45 -0
- package/packages/datadog-instrumentations/src/cypress-config.js +122 -16
- package/packages/datadog-instrumentations/src/dns.js +24 -56
- package/packages/datadog-instrumentations/src/graphql.js +1 -1
- package/packages/datadog-instrumentations/src/helpers/callback-instrumentor.js +74 -0
- package/packages/datadog-instrumentations/src/helpers/check-require-cache.js +4 -1
- package/packages/datadog-instrumentations/src/helpers/hooks.js +2 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/compiler.js +10 -3
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +1 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/modelcontextprotocol-sdk.js +59 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +11 -2
- package/packages/datadog-instrumentations/src/modelcontextprotocol-sdk.js +7 -0
- package/packages/datadog-instrumentations/src/pino.js +4 -28
- package/packages/datadog-instrumentations/src/playwright-browser-scripts.js +27 -0
- package/packages/datadog-instrumentations/src/playwright.js +5 -17
- package/packages/datadog-instrumentations/src/stripe.js +38 -24
- package/packages/datadog-instrumentations/src/vitest.js +32 -4
- package/packages/datadog-instrumentations/src/zlib.js +29 -0
- package/packages/datadog-plugin-aws-sdk/src/base.js +1 -2
- package/packages/datadog-plugin-azure-event-hubs/src/producer.js +8 -15
- package/packages/datadog-plugin-azure-service-bus/src/producer.js +4 -9
- package/packages/datadog-plugin-cucumber/src/index.js +2 -2
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +5 -5
- package/packages/datadog-plugin-cypress/src/source-map-utils.js +48 -1
- package/packages/datadog-plugin-http/src/server.js +11 -11
- package/packages/datadog-plugin-jest/src/index.js +2 -2
- package/packages/datadog-plugin-mocha/src/index.js +1 -2
- package/packages/datadog-plugin-modelcontextprotocol-sdk/src/index.js +24 -0
- package/packages/datadog-plugin-modelcontextprotocol-sdk/src/tracing.js +55 -0
- package/packages/datadog-plugin-mongodb-core/src/index.js +1 -6
- package/packages/datadog-plugin-playwright/src/index.js +2 -3
- package/packages/datadog-plugin-vitest/src/index.js +14 -6
- package/packages/datadog-plugin-ws/src/close.js +2 -0
- package/packages/datadog-plugin-ws/src/producer.js +2 -0
- package/packages/datadog-plugin-ws/src/receiver.js +1 -0
- package/packages/dd-trace/src/aiguard/channels.js +8 -0
- package/packages/dd-trace/src/aiguard/index.js +7 -3
- package/packages/dd-trace/src/aiguard/sdk.js +44 -0
- package/packages/dd-trace/src/aiguard/tags.js +1 -0
- package/packages/dd-trace/src/appsec/graphql.js +6 -6
- package/packages/dd-trace/src/appsec/index.js +9 -11
- package/packages/dd-trace/src/appsec/rasp/command_injection.js +4 -5
- package/packages/dd-trace/src/appsec/rasp/lfi.js +8 -4
- package/packages/dd-trace/src/appsec/rasp/sql_injection.js +5 -10
- package/packages/dd-trace/src/appsec/rasp/ssrf.js +5 -6
- package/packages/dd-trace/src/appsec/recommended.json +2438 -13
- package/packages/dd-trace/src/appsec/reporter.js +6 -5
- package/packages/dd-trace/src/appsec/sdk/user_blocking.js +4 -8
- package/packages/dd-trace/src/appsec/store.js +50 -0
- package/packages/dd-trace/src/appsec/waf/index.js +3 -5
- package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +2 -2
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +2 -2
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +2 -2
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +2 -2
- package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +3 -4
- package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +2 -2
- package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +4 -5
- package/packages/dd-trace/src/ci-visibility/requests/fs-cache.js +3 -4
- package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +6 -6
- package/packages/dd-trace/src/ci-visibility/requests/upload-coverage-report.js +2 -2
- package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +2 -2
- package/packages/dd-trace/src/config/config-types.d.ts +0 -4
- package/packages/dd-trace/src/config/defaults.js +10 -10
- package/packages/dd-trace/src/config/generated-config-types.d.ts +13 -12
- package/packages/dd-trace/src/config/index.js +25 -35
- package/packages/dd-trace/src/config/parsers.js +26 -9
- package/packages/dd-trace/src/config/supported-configurations.json +32 -36
- package/packages/dd-trace/src/debugger/config.js +2 -0
- package/packages/dd-trace/src/debugger/devtools_client/send.js +25 -5
- package/packages/dd-trace/src/encode/0.4.js +4 -5
- package/packages/dd-trace/src/exporters/agent/index.js +0 -1
- package/packages/dd-trace/src/exporters/agent/writer.js +1 -2
- package/packages/dd-trace/src/exporters/agentless/writer.js +3 -3
- package/packages/dd-trace/src/exporters/common/util.js +2 -2
- package/packages/dd-trace/src/id.js +2 -0
- package/packages/dd-trace/src/index.js +2 -5
- package/packages/dd-trace/src/lambda/handler.js +1 -3
- package/packages/dd-trace/src/llmobs/plugins/{anthropic.js → anthropic/index.js} +5 -63
- package/packages/dd-trace/src/llmobs/plugins/anthropic/util.js +106 -0
- package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +3 -2
- package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -2
- package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/embedding.js +2 -1
- package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/index.js +0 -49
- package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/vectorstore.js +2 -1
- package/packages/dd-trace/src/llmobs/plugins/langchain/messages.js +76 -0
- package/packages/dd-trace/src/llmobs/plugins/langgraph/index.js +1 -26
- package/packages/dd-trace/src/llmobs/plugins/modelcontextprotocol-sdk/index.js +68 -0
- package/packages/dd-trace/src/llmobs/plugins/modelcontextprotocol-sdk/utils.js +57 -0
- package/packages/dd-trace/src/llmobs/sdk.js +2 -2
- package/packages/dd-trace/src/openfeature/eval-metrics-hook.js +103 -0
- package/packages/dd-trace/src/openfeature/flagging_provider.js +3 -0
- package/packages/dd-trace/src/opentelemetry/logs/index.js +1 -1
- package/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +3 -2
- package/packages/dd-trace/src/opentelemetry/metrics/index.js +1 -1
- package/packages/dd-trace/src/opentelemetry/metrics/otlp_http_metric_exporter.js +3 -2
- package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +19 -66
- package/packages/dd-trace/src/opentelemetry/trace/index.js +11 -16
- package/packages/dd-trace/src/opentelemetry/trace/otlp_http_trace_exporter.js +11 -3
- package/packages/dd-trace/src/opentelemetry/trace/otlp_transformer.js +51 -41
- package/packages/dd-trace/src/opentelemetry/tracer.js +9 -11
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +17 -10
- package/packages/dd-trace/src/opentracing/span.js +1 -1
- package/packages/dd-trace/src/opentracing/tracer.js +12 -5
- package/packages/dd-trace/src/plugins/index.js +1 -0
- package/packages/dd-trace/src/plugins/util/test.js +126 -5
- package/packages/dd-trace/src/plugins/util/url.js +2 -1
- package/packages/dd-trace/src/profiling/profilers/event_plugins/crypto.js +32 -0
- package/packages/dd-trace/src/profiling/profilers/event_plugins/zlib.js +19 -0
- package/packages/dd-trace/src/profiling/profilers/events.js +35 -0
- package/packages/dd-trace/src/proxy.js +2 -8
- package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +2 -2
- package/packages/dd-trace/src/service-naming/schemas/v0/web.js +4 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/web.js +4 -0
- package/packages/dd-trace/src/span_processor.js +1 -2
- package/packages/dd-trace/src/tagger.js +2 -2
- package/packages/dd-trace/src/telemetry/send-data.js +5 -7
- package/packages/dd-trace/src/tracer.js +2 -2
- package/vendor/dist/ignore/LICENSE +0 -21
- package/vendor/dist/ignore/index.js +0 -1
|
@@ -9,7 +9,6 @@ const { getEnvironmentVariable } = require('../../config/helper')
|
|
|
9
9
|
const satisfies = require('../../../../../vendor/dist/semifies')
|
|
10
10
|
|
|
11
11
|
const istanbul = require('../../../../../vendor/dist/istanbul-lib-coverage')
|
|
12
|
-
const ignore = require('../../../../../vendor/dist/ignore')
|
|
13
12
|
|
|
14
13
|
const id = require('../../id')
|
|
15
14
|
const {
|
|
@@ -671,24 +670,146 @@ function getCodeOwnersFileEntries (rootDir) {
|
|
|
671
670
|
const trimmed = content.trim()
|
|
672
671
|
if (trimmed === '') continue
|
|
673
672
|
const [pattern, ...owners] = trimmed.split(/\s+/)
|
|
674
|
-
entries.push({ pattern, owners })
|
|
673
|
+
entries.push(setCodeOwnersPatternRegex({ pattern, owners }))
|
|
675
674
|
}
|
|
676
675
|
// Reverse because rules defined last take precedence
|
|
677
676
|
return entries.reverse()
|
|
678
677
|
}
|
|
679
678
|
|
|
680
|
-
const
|
|
679
|
+
const codeOwnersPerEntries = new WeakMap()
|
|
680
|
+
|
|
681
|
+
/**
|
|
682
|
+
* @param {string} character
|
|
683
|
+
* @returns {string}
|
|
684
|
+
*/
|
|
685
|
+
function escapeRegexCharacter (character) {
|
|
686
|
+
return character.replaceAll(/[|\\{}()[\]^$+*?.]/g, String.raw`\$&`)
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
/**
|
|
690
|
+
* @param {string} pattern
|
|
691
|
+
* @returns {boolean}
|
|
692
|
+
*/
|
|
693
|
+
function hasUnescapedWildcard (pattern) {
|
|
694
|
+
for (let i = 0; i < pattern.length; i++) {
|
|
695
|
+
const character = pattern[i]
|
|
696
|
+
if (character === '\\') {
|
|
697
|
+
i++
|
|
698
|
+
} else if (character === '*' || character === '?') {
|
|
699
|
+
return true
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
return false
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
/**
|
|
706
|
+
* @param {string} pattern
|
|
707
|
+
* @returns {string}
|
|
708
|
+
*/
|
|
709
|
+
function codeOwnersPatternToRegexSource (pattern) {
|
|
710
|
+
let source = ''
|
|
711
|
+
for (let i = 0; i < pattern.length; i++) {
|
|
712
|
+
const character = pattern[i]
|
|
713
|
+
|
|
714
|
+
if (character === '\\') {
|
|
715
|
+
const escapedCharacter = pattern[i + 1]
|
|
716
|
+
source += escapedCharacter === undefined
|
|
717
|
+
? escapeRegexCharacter(character)
|
|
718
|
+
: escapeRegexCharacter(escapedCharacter)
|
|
719
|
+
i++
|
|
720
|
+
} else if (character === '*') {
|
|
721
|
+
if (pattern[i + 1] === '*') {
|
|
722
|
+
if (pattern[i + 2] === '/') {
|
|
723
|
+
source += '(?:.*/)?'
|
|
724
|
+
i += 2
|
|
725
|
+
} else {
|
|
726
|
+
source += '.*'
|
|
727
|
+
i++
|
|
728
|
+
}
|
|
729
|
+
} else {
|
|
730
|
+
source += '[^/]*'
|
|
731
|
+
}
|
|
732
|
+
} else if (character === '?') {
|
|
733
|
+
source += '[^/]'
|
|
734
|
+
} else {
|
|
735
|
+
source += escapeRegexCharacter(character)
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
return source
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
/**
|
|
742
|
+
* @param {string} pattern
|
|
743
|
+
* @returns {RegExp|null}
|
|
744
|
+
*/
|
|
745
|
+
function getCodeOwnersPatternRegex (pattern) {
|
|
746
|
+
if (!pattern || pattern[0] === '!') {
|
|
747
|
+
return null
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
const directoryOnly = pattern.endsWith('/')
|
|
751
|
+
const normalizedPattern = pattern.replace(/^\/+/, '').replace(/\/+$/, '')
|
|
752
|
+
const anchored = pattern.startsWith('/') || normalizedPattern.includes('/')
|
|
753
|
+
|
|
754
|
+
if (!normalizedPattern) {
|
|
755
|
+
return null
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
const lastSlashIndex = normalizedPattern.lastIndexOf('/')
|
|
759
|
+
const lastSegment = lastSlashIndex === -1 ? normalizedPattern : normalizedPattern.slice(lastSlashIndex + 1)
|
|
760
|
+
const descendantSuffix = directoryOnly || !hasUnescapedWildcard(lastSegment) ? '(?:/.*)?' : ''
|
|
761
|
+
const patternSource = codeOwnersPatternToRegexSource(normalizedPattern)
|
|
762
|
+
const regexSource = anchored
|
|
763
|
+
? `^${patternSource}${descendantSuffix}$`
|
|
764
|
+
: `(?:^|/)${patternSource}${descendantSuffix}$`
|
|
765
|
+
|
|
766
|
+
return new RegExp(regexSource)
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
function setCodeOwnersPatternRegex (entry) {
|
|
770
|
+
Object.defineProperty(entry, 'regex', {
|
|
771
|
+
configurable: true,
|
|
772
|
+
value: getCodeOwnersPatternRegex(entry.pattern),
|
|
773
|
+
writable: true,
|
|
774
|
+
})
|
|
775
|
+
return entry
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
/**
|
|
779
|
+
* Match a repository-relative filename against a CODEOWNERS pattern.
|
|
780
|
+
* See GitHub's CODEOWNERS pattern rules:
|
|
781
|
+
* https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
|
|
782
|
+
*
|
|
783
|
+
* @param {RegExp|null} regex
|
|
784
|
+
* @param {string} filename
|
|
785
|
+
* @returns {boolean}
|
|
786
|
+
*/
|
|
787
|
+
function isCodeOwnersPatternMatch (regex, filename) {
|
|
788
|
+
if (!regex || !filename) {
|
|
789
|
+
return false
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
const normalizedFilename = filename.replaceAll('\\', '/').replace(/^\/+/, '')
|
|
793
|
+
return regex.test(normalizedFilename)
|
|
794
|
+
}
|
|
681
795
|
|
|
682
796
|
function getCodeOwnersForFilename (filename, entries) {
|
|
683
797
|
if (!entries) {
|
|
684
798
|
return null
|
|
685
799
|
}
|
|
686
|
-
|
|
800
|
+
let codeOwnersPerFileName = codeOwnersPerEntries.get(entries)
|
|
801
|
+
|
|
802
|
+
if (!codeOwnersPerFileName) {
|
|
803
|
+
codeOwnersPerFileName = new Map()
|
|
804
|
+
codeOwnersPerEntries.set(entries, codeOwnersPerFileName)
|
|
805
|
+
} else if (codeOwnersPerFileName.has(filename)) {
|
|
687
806
|
return codeOwnersPerFileName.get(filename)
|
|
688
807
|
}
|
|
808
|
+
|
|
689
809
|
for (const entry of entries) {
|
|
690
810
|
try {
|
|
691
|
-
const
|
|
811
|
+
const regex = entry.regex === undefined ? setCodeOwnersPatternRegex(entry).regex : entry.regex
|
|
812
|
+
const isResponsible = isCodeOwnersPatternMatch(regex, filename)
|
|
692
813
|
if (isResponsible) {
|
|
693
814
|
const codeOwners = JSON.stringify(entry.owners)
|
|
694
815
|
codeOwnersPerFileName.set(filename, codeOwners)
|
|
@@ -31,7 +31,8 @@ function extractURL (req) {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
function getProtocol (req) {
|
|
34
|
-
|
|
34
|
+
// Do not check deprecated `req.connection` property.
|
|
35
|
+
return req.socket?.encrypted ? 'https' : 'http'
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
/**
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const EventPlugin = require('./event')
|
|
4
|
+
|
|
5
|
+
// Params captured on the instrumentation context that are safe to forward as pprof labels. Must be
|
|
6
|
+
// a subset of the names declared in asyncParamsByMethod in datadog-instrumentations/src/crypto.js.
|
|
7
|
+
const allowedParams = new Set([
|
|
8
|
+
'algorithm', 'digest', 'iterations', 'keylen', 'offset', 'operation', 'size', 'type',
|
|
9
|
+
])
|
|
10
|
+
|
|
11
|
+
class CryptoPlugin extends EventPlugin {
|
|
12
|
+
static id = 'crypto'
|
|
13
|
+
|
|
14
|
+
static operation = 'operation'
|
|
15
|
+
|
|
16
|
+
static entryType = 'crypto'
|
|
17
|
+
|
|
18
|
+
extendEvent (event, ctx) {
|
|
19
|
+
const detail = {}
|
|
20
|
+
for (const name of allowedParams) {
|
|
21
|
+
const value = ctx[name]
|
|
22
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
23
|
+
detail[name] = value
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
event.detail = detail
|
|
27
|
+
|
|
28
|
+
return event
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
module.exports = CryptoPlugin
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const EventPlugin = require('./event')
|
|
4
|
+
|
|
5
|
+
class ZlibPlugin extends EventPlugin {
|
|
6
|
+
static id = 'zlib'
|
|
7
|
+
|
|
8
|
+
static operation = 'operation'
|
|
9
|
+
|
|
10
|
+
static entryType = 'zlib'
|
|
11
|
+
|
|
12
|
+
extendEvent (event, ctx) {
|
|
13
|
+
event.detail = { operation: ctx.operation }
|
|
14
|
+
|
|
15
|
+
return event
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
module.exports = ZlibPlugin
|
|
@@ -194,13 +194,46 @@ class FilesystemDecorator {
|
|
|
194
194
|
}
|
|
195
195
|
}
|
|
196
196
|
|
|
197
|
+
class ZlibDecorator {
|
|
198
|
+
constructor (stringTable) {
|
|
199
|
+
this.stringTable = stringTable
|
|
200
|
+
this.operationNameLabelKey = stringTable.dedup('operation')
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
decorateSample (sampleInput, item) {
|
|
204
|
+
sampleInput.label.push(labelFromStr(this.stringTable, this.operationNameLabelKey, item.detail.operation))
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
class CryptoDecorator {
|
|
209
|
+
constructor (stringTable) {
|
|
210
|
+
this.stringTable = stringTable
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
decorateSample (sampleInput, item) {
|
|
214
|
+
const labels = sampleInput.label
|
|
215
|
+
const stringTable = this.stringTable
|
|
216
|
+
for (const [key, value] of Object.entries(item.detail)) {
|
|
217
|
+
switch (typeof value) {
|
|
218
|
+
case 'string':
|
|
219
|
+
labels.push(labelFromStrStr(stringTable, key, value))
|
|
220
|
+
break
|
|
221
|
+
case 'number':
|
|
222
|
+
labels.push(new Label({ key: stringTable.dedup(key), num: value }))
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
197
228
|
// Keys correspond to PerformanceEntry.entryType, values are constructor
|
|
198
229
|
// functions for type-specific decorators.
|
|
199
230
|
const decoratorTypes = {
|
|
231
|
+
crypto: CryptoDecorator,
|
|
200
232
|
fs: FilesystemDecorator,
|
|
201
233
|
dns: DNSDecorator,
|
|
202
234
|
gc: GCDecorator,
|
|
203
235
|
net: NetDecorator,
|
|
236
|
+
zlib: ZlibDecorator,
|
|
204
237
|
}
|
|
205
238
|
|
|
206
239
|
// Translates performance entries into pprof samples.
|
|
@@ -348,12 +381,14 @@ class DatadogInstrumentationEventSource {
|
|
|
348
381
|
constructor (eventHandler, eventFilter) {
|
|
349
382
|
// List all entries explicitly for bundlers to pick up the require calls correctly.
|
|
350
383
|
const plugins = [
|
|
384
|
+
require('./event_plugins/crypto'),
|
|
351
385
|
require('./event_plugins/dns_lookup'),
|
|
352
386
|
require('./event_plugins/dns_lookupservice'),
|
|
353
387
|
require('./event_plugins/dns_resolve'),
|
|
354
388
|
require('./event_plugins/dns_reverse'),
|
|
355
389
|
require('./event_plugins/fs'),
|
|
356
390
|
require('./event_plugins/net'),
|
|
391
|
+
require('./event_plugins/zlib'),
|
|
357
392
|
]
|
|
358
393
|
this.plugins = plugins.map((Plugin) => {
|
|
359
394
|
return new Plugin(eventHandler, eventFilter)
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const { getValueFromEnvSources } = require('./config/helper')
|
|
4
3
|
const NoopProxy = require('./noop/proxy')
|
|
5
4
|
const DatadogTracer = require('./tracer')
|
|
6
5
|
const getConfig = require('./config')
|
|
@@ -213,7 +212,7 @@ class Tracer extends NoopProxy {
|
|
|
213
212
|
this._testApiManualPlugin.configure({ ...config, enabled: true }, false)
|
|
214
213
|
}
|
|
215
214
|
if (config.ciVisAgentlessLogSubmissionEnabled) {
|
|
216
|
-
if (
|
|
215
|
+
if (config.apiKey) {
|
|
217
216
|
const LogSubmissionPlugin = require('./ci-visibility/log-submission/log-submission-plugin')
|
|
218
217
|
const automaticLogPlugin = new LogSubmissionPlugin(this)
|
|
219
218
|
automaticLogPlugin.configure({ ...config, enabled: true })
|
|
@@ -279,12 +278,7 @@ class Tracer extends NoopProxy {
|
|
|
279
278
|
const prioritySampler = config.apmTracingEnabled === false
|
|
280
279
|
? require('./standalone').configure(config)
|
|
281
280
|
: undefined
|
|
282
|
-
|
|
283
|
-
if (config.otelTracesEnabled) {
|
|
284
|
-
const { buildResourceAttributes, createOtlpTraceExporter } = require('./opentelemetry/trace')
|
|
285
|
-
otlpExporter = createOtlpTraceExporter(config, buildResourceAttributes(config))
|
|
286
|
-
}
|
|
287
|
-
this._tracer = new DatadogTracer(config, prioritySampler, otlpExporter)
|
|
281
|
+
this._tracer = new DatadogTracer(config, prioritySampler)
|
|
288
282
|
this.dataStreamsCheckpointer = this._tracer.dataStreamsCheckpointer
|
|
289
283
|
lazyProxy(this, 'appsec', () => require('./appsec/sdk'), this._tracer, config)
|
|
290
284
|
lazyProxy(this, 'llmobs', () => require('./llmobs/sdk'), this._tracer, this._modules.llmobs, config)
|
|
@@ -51,6 +51,8 @@ module.exports = {
|
|
|
51
51
|
const trackEventLoop = config.runtimeMetrics.eventLoop !== false
|
|
52
52
|
const trackGc = config.runtimeMetrics.gc !== false
|
|
53
53
|
|
|
54
|
+
client = new MetricsAggregationClient(new DogStatsDClient(clientConfig))
|
|
55
|
+
|
|
54
56
|
if (trackGc) {
|
|
55
57
|
startGCObserver()
|
|
56
58
|
}
|
|
@@ -72,8 +74,6 @@ module.exports = {
|
|
|
72
74
|
}
|
|
73
75
|
}
|
|
74
76
|
|
|
75
|
-
client = new MetricsAggregationClient(new DogStatsDClient(clientConfig))
|
|
76
|
-
|
|
77
77
|
lastTime = performance.now()
|
|
78
78
|
|
|
79
79
|
if (nativeMetrics) {
|
|
@@ -35,6 +35,10 @@ const web = {
|
|
|
35
35
|
serviceName: ({ pluginConfig, tracerService }) => pluginConfig.service || tracerService,
|
|
36
36
|
serviceSource: optionServiceSource,
|
|
37
37
|
},
|
|
38
|
+
'modelcontextprotocol-sdk': {
|
|
39
|
+
opName: () => 'mcp.tool.call',
|
|
40
|
+
serviceName: ({ pluginService, tracerService }) => pluginService || tracerService,
|
|
41
|
+
},
|
|
38
42
|
aws: {
|
|
39
43
|
opName: () => 'aws.request',
|
|
40
44
|
serviceName: awsServiceV0,
|
|
@@ -22,6 +22,10 @@ const web = {
|
|
|
22
22
|
serviceName: ({ pluginConfig, tracerService }) => pluginConfig.service || tracerService,
|
|
23
23
|
serviceSource: optionServiceSource,
|
|
24
24
|
},
|
|
25
|
+
'modelcontextprotocol-sdk': {
|
|
26
|
+
opName: () => 'mcp.tool.call',
|
|
27
|
+
serviceName: identityService,
|
|
28
|
+
},
|
|
25
29
|
fetch: {
|
|
26
30
|
opName: () => 'http.client.request',
|
|
27
31
|
serviceName: httpPluginClientService,
|
|
@@ -5,7 +5,6 @@ const spanFormat = require('./span_format')
|
|
|
5
5
|
const SpanSampler = require('./span_sampler')
|
|
6
6
|
const GitMetadataTagger = require('./git_metadata_tagger')
|
|
7
7
|
const processTags = require('./process-tags')
|
|
8
|
-
const { getValueFromEnvSources } = require('./config/helper')
|
|
9
8
|
|
|
10
9
|
const startedSpans = new WeakSet()
|
|
11
10
|
const finishedSpans = new WeakSet()
|
|
@@ -88,7 +87,7 @@ class SpanProcessor {
|
|
|
88
87
|
}
|
|
89
88
|
|
|
90
89
|
_erase (trace, active) {
|
|
91
|
-
if (
|
|
90
|
+
if (this._config.DD_TRACE_EXPERIMENTAL_STATE_TRACKING) {
|
|
92
91
|
const started = new Set()
|
|
93
92
|
const startedIds = new Set()
|
|
94
93
|
const finished = new Set()
|
|
@@ -8,7 +8,7 @@ function addNonEmpty (carrier, key, value) {
|
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
function add (carrier, keyValuePairs) {
|
|
11
|
+
function add (carrier, keyValuePairs, valueSeparator = ':') {
|
|
12
12
|
if (!carrier) return
|
|
13
13
|
|
|
14
14
|
if (typeof keyValuePairs === 'string') {
|
|
@@ -18,7 +18,7 @@ function add (carrier, keyValuePairs) {
|
|
|
18
18
|
for (let i = 0; i < keyValuePairs.length; i++) {
|
|
19
19
|
const char = keyValuePairs[i]
|
|
20
20
|
|
|
21
|
-
if (char ===
|
|
21
|
+
if (char === valueSeparator) {
|
|
22
22
|
if (valueStart === 0) {
|
|
23
23
|
valueStart = i
|
|
24
24
|
}
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
const request = require('../exporters/common/request')
|
|
4
4
|
const log = require('../log')
|
|
5
|
-
const { isTrue } = require('../util')
|
|
6
|
-
const { getValueFromEnvSources } = require('../config/helper')
|
|
7
5
|
|
|
8
6
|
/**
|
|
9
7
|
* @typedef {Record<string, unknown>} TelemetryPayloadObject
|
|
@@ -139,16 +137,16 @@ function sendData (config, application, host, reqType, payload = {}, cb = () =>
|
|
|
139
137
|
hostname,
|
|
140
138
|
port,
|
|
141
139
|
isCiVisibility,
|
|
140
|
+
DD_CIVISIBILITY_AGENTLESS_ENABLED,
|
|
142
141
|
} = config
|
|
143
142
|
|
|
144
143
|
let url = config.url
|
|
145
144
|
|
|
146
|
-
const isCiVisibilityAgentlessMode = isCiVisibility &&
|
|
147
|
-
isTrue(getValueFromEnvSources('DD_CIVISIBILITY_AGENTLESS_ENABLED'))
|
|
145
|
+
const isCiVisibilityAgentlessMode = isCiVisibility && DD_CIVISIBILITY_AGENTLESS_ENABLED
|
|
148
146
|
|
|
149
147
|
if (isCiVisibilityAgentlessMode) {
|
|
150
148
|
try {
|
|
151
|
-
url
|
|
149
|
+
url ||= new URL(getAgentlessTelemetryEndpoint(config.site))
|
|
152
150
|
} catch (err) {
|
|
153
151
|
log.error('Telemetry endpoint url is invalid', err)
|
|
154
152
|
// No point to do the request if the URL is invalid
|
|
@@ -178,14 +176,14 @@ function sendData (config, application, host, reqType, payload = {}, cb = () =>
|
|
|
178
176
|
})
|
|
179
177
|
|
|
180
178
|
request(data, options, (error) => {
|
|
181
|
-
if (error &&
|
|
179
|
+
if (error && config.apiKey && config.site) {
|
|
182
180
|
if (agentTelemetry) {
|
|
183
181
|
log.warn('Agent telemetry failed, started agentless telemetry')
|
|
184
182
|
agentTelemetry = false
|
|
185
183
|
}
|
|
186
184
|
// figure out which data center to send to
|
|
187
185
|
const backendUrl = getAgentlessTelemetryEndpoint(config.site)
|
|
188
|
-
const backendHeader = { ...options.headers, 'DD-API-KEY':
|
|
186
|
+
const backendHeader = { ...options.headers, 'DD-API-KEY': config.apiKey }
|
|
189
187
|
const backendOptions = {
|
|
190
188
|
...options,
|
|
191
189
|
url: backendUrl,
|
|
@@ -17,8 +17,8 @@ const SERVICE_NAME = tags.SERVICE_NAME
|
|
|
17
17
|
const MEASURED = tags.MEASURED
|
|
18
18
|
|
|
19
19
|
class DatadogTracer extends Tracer {
|
|
20
|
-
constructor (config, prioritySampler
|
|
21
|
-
super(config, prioritySampler
|
|
20
|
+
constructor (config, prioritySampler) {
|
|
21
|
+
super(config, prioritySampler)
|
|
22
22
|
this._dataStreamsProcessor = new DataStreamsProcessor(config)
|
|
23
23
|
this._dataStreamsManager = new DataStreamsManager(this._dataStreamsProcessor)
|
|
24
24
|
this.dataStreamsCheckpointer = new DataStreamsCheckpointer(this)
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
Copyright (c) 2013 Kael Zhang <i@kael.me>, contributors
|
|
2
|
-
http://kael.me/
|
|
3
|
-
|
|
4
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
|
5
|
-
a copy of this software and associated documentation files (the
|
|
6
|
-
"Software"), to deal in the Software without restriction, including
|
|
7
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
|
8
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
|
9
|
-
permit persons to whom the Software is furnished to do so, subject to
|
|
10
|
-
the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be
|
|
13
|
-
included in all copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
19
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
20
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
21
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(()=>{var e={"./ignore/index.js"(e){function makeArray(e){return Array.isArray(e)?e:[e]}let t,r=/^\s+$/,s=/(?:[^\\]|^)\\$/,i=/^\\!/,n=/^\\#/,a=/\r?\n/g,h=/^\.{0,2}\/|^\.{1,2}$/,o=/\/$/,l="node-ignore";"u">typeof Symbol&&(l=Symbol.for("node-ignore"));let c=l,define=(e,t,r)=>(Object.defineProperty(e,t,{value:r}),r),u=/([0-z])-([0-z])/g,RETURN_FALSE=()=>!1,_=[[/^\uFEFF/,()=>""],[/((?:\\\\)*?)(\\?\s+)$/,(e,t,r)=>t+(0===r.indexOf("\\")?" ":"")],[/(\\+?)\s/g,(e,t)=>{let{length:r}=t;return t.slice(0,r-r%2)+" "}],[/[\\$.|*+(){^]/g,e=>`\\${e}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(e,t,r)=>t+6<r.length?"(?:\\/[^\\/]+)*":"\\/.+"],[/(^|[^\\]+)(\\\*)+(?=.+)/g,(e,t,r)=>t+r.replace(/\\\*/g,"[^\\/]*")],[/\\\\\\(?=[$.|*+(){^])/g,()=>"\\"],[/\\\\/g,()=>"\\"],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(e,t,r,s,i)=>"\\"===t?`\\[${r}${(e=>{let{length:t}=e;return e.slice(0,t-t%2)})(s)}${i}`:"]"===i&&s.length%2==0?`[${r.replace(u,(e,t,r)=>t.charCodeAt(0)<=r.charCodeAt(0)?e:"")}${s}]`:"[]"],[/(?:[^*])$/,e=>/\/$/.test(e)?`${e}$`:`${e}(?=$|\\/$)`]],d=/(^|\\\/)?\\\*$/,g="regex",p="checkRegex",f={[g](e,t){let r=t?`${t}[^/]+`:"[^/]*";return`${r}(?=$|\\/$)`},[p](e,t){let r=t?`${t}[^/]*`:"[^/]*";return`${r}(?=$|\\/$)`}};let IgnoreRule=class IgnoreRule{constructor(e,t,r,s,i,n){this.pattern=e,this.mark=t,this.negative=i,define(this,"body",r),define(this,"ignoreCase",s),define(this,"regexPrefix",n)}get regex(){let e="_"+g;return this[e]?this[e]:this._make(g,e)}get checkRegex(){let e="_"+p;return this[e]?this[e]:this._make(p,e)}_make(e,t){let r=this.regexPrefix.replace(d,f[e]);return define(this,t,this.ignoreCase?RegExp(r,"i"):new RegExp(r))}};let RuleManager=class RuleManager{constructor(e){this._ignoreCase=e,this._rules=[]}_add(e){let t;if(e&&e[c]){this._rules=this._rules.concat(e._rules._rules),this._added=!0;return}if("string"==typeof e&&(e={pattern:e}),(t=e.pattern)&&"string"==typeof t&&!r.test(t)&&!s.test(t)&&0!==t.indexOf("#")){let t=(({pattern:e,mark:t},r)=>{let s,a=!1,h=e;0===h.indexOf("!")&&(a=!0,h=h.substr(1));let o=(s=h=h.replace(i,"!").replace(n,"#"),_.reduce((e,[t,r])=>e.replace(t,r.bind(s)),s));return new IgnoreRule(e,t,h,r,a,o)})(e,this._ignoreCase);this._added=!0,this._rules.push(t)}}add(e){return this._added=!1,makeArray("string"==typeof e?e.split(a).filter(Boolean):e).forEach(this._add,this),this._added}test(e,r,s){let i,n=!1,a=!1;this._rules.forEach(h=>{let{negative:o}=h;(a!==o||n===a)&&(!o||n||a||r)&&h[s].test(e)&&(n=!o,a=o,i=o?t:h)});let h={ignored:n,unignored:a};return i&&(h.rule=i),h}};let throwError=(e,t)=>{throw new t(e)},checkPath=(e,t,r)=>"string"!=typeof e?r(`path must be a string, but got \`${t}\``,TypeError):e?!checkPath.isNotRelative(e)||r(`path should be a \`path.relative()\`d string, but got "${t}"`,RangeError):r("path must not be empty",TypeError),isNotRelative=e=>h.test(e);checkPath.isNotRelative=isNotRelative,checkPath.convert=e=>e;let Ignore=class Ignore{constructor({ignorecase:e=!0,ignoreCase:t=e,allowRelativePaths:r=!1}={}){define(this,c,!0),this._rules=new RuleManager(t),this._strictPathCheck=!r,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}add(e){return this._rules.add(e)&&this._initCache(),this}addPattern(e){return this.add(e)}_test(e,t,r,s){let i=e&&checkPath.convert(e);return checkPath(i,e,this._strictPathCheck?throwError:RETURN_FALSE),this._t(i,t,r,s)}checkIgnore(e){if(!o.test(e))return this.test(e);let t=e.split("/").filter(Boolean);if(t.pop(),t.length){let e=this._t(t.join("/")+"/",this._testCache,!0,t);if(e.ignored)return e}return this._rules.test(e,!1,p)}_t(e,t,r,s){if(e in t)return t[e];if(s||(s=e.split("/").filter(Boolean)),s.pop(),!s.length)return t[e]=this._rules.test(e,r,g);let i=this._t(s.join("/")+"/",t,r,s);return t[e]=i.ignored?i:this._rules.test(e,r,g)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return makeArray(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}};let factory=e=>new Ignore(e),setupWindows=()=>{checkPath.convert=e=>/^\\\\\?\\/.test(e)||/["<>|\u0000-\u001F]+/u.test(e)?e:e.replace(/\\/g,"/");let e=/^[a-z]:\//i;checkPath.isNotRelative=t=>e.test(t)||isNotRelative(t)};"u">typeof process&&"win32"===process.platform&&setupWindows(),e.exports=factory,factory.default=factory,e.exports.isPathValid=e=>checkPath(e&&checkPath.convert(e),e,RETURN_FALSE),define(e.exports,Symbol.for("setupWindows"),setupWindows)}},t={};function __webpack_require__(r){var s=t[r];if(void 0!==s)return s.exports;var i=t[r]={exports:{}};return e[r](i,i.exports,__webpack_require__),i.exports}var r=__webpack_require__("./ignore/index.js");module.exports=r})();
|