Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions integration-tests/helpers/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,10 @@ async function createSandbox (
addFlags.push('--prefer-offline')
}

if (process.env.OMIT) {
addFlags.push(...process.env.OMIT.split(',').map(omit => `--omit=${omit}`))
}

if (DEBUG !== 'true') {
addFlags.push('--silent')
}
Expand Down
75 changes: 46 additions & 29 deletions integration-tests/startup.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,33 @@ const execArgvs = [
{
execArgv: ['--loader', 'dd-trace/loader-hook.mjs'],
skip: semver.satisfies(process.versions.node, '>=20.6')
},
{
execArgv: [],
optional: false
}
]

execArgvs.forEach(({ execArgv, skip }) => {
execArgvs.forEach(({ execArgv, skip, optional = true }) => {
const describe = skip ? globalThis.describe.skip : globalThis.describe

describe(`startup ${execArgv.join(' ')}`, () => {
describe(`startup ${execArgv.join(' ').concat(`(optional: ${optional})`)}`, () => {
let agent
let proc
let cwd
let startupTestFile
let unsupportedTestFile

before(() => {
if (optional === false) {
process.env.OMIT = 'optional'
}
})

after(() => {
delete process.env.OMIT
})

useSandbox(['d3-format@3.1.0'])

before(() => {
Expand Down Expand Up @@ -74,38 +88,41 @@ execArgvs.forEach(({ execArgv, skip }) => {
})
})

it('saves tracer configuration on disk', async () => {
if (process.platform !== 'linux') {
return
}

proc = await spawnProc(startupTestFile, {
cwd,
execArgv,
env: {
AGENT_PORT: agent.port
// This feature requires libdatadog which is an optional dependency.
if (optional) {
it('saves tracer configuration on disk', async () => {
if (process.platform !== 'linux') {
return
}
})

const containsDatadogMemfd = (fds) => {
for (const fd of fds) {
try {
const fdName = fs.readlinkSync(`/proc/${proc.pid}/fd/${fd}`)
if (fdName.includes('datadog-tracer-info-')) {
return true
}
} catch {}
proc = await spawnProc(startupTestFile, {
cwd,
execArgv,
env: {
AGENT_PORT: agent.port
}
})

const containsDatadogMemfd = (fds) => {
for (const fd of fds) {
try {
const fdName = fs.readlinkSync(`/proc/${proc.pid}/fd/${fd}`)
if (fdName.includes('datadog-tracer-info-')) {
return true
}
} catch {}
}
return false
}
return false
}

const fds = fs.readdirSync(`/proc/${proc.pid}/fd`)
const fds = fs.readdirSync(`/proc/${proc.pid}/fd`)

assert(
containsDatadogMemfd(fds),
`FDs ${inspect(fds)} of PID ${proc.pid} did not contain the datadog tracer configuration in memfd`
)
})
assert(
containsDatadogMemfd(fds),
`FDs ${inspect(fds)} of PID ${proc.pid} did not contain the datadog tracer configuration in memfd`
)
})
}

it('works for options.url', async () => {
proc = await spawnProc(startupTestFile, {
Expand Down
34 changes: 19 additions & 15 deletions packages/dd-trace/src/tracer_metadata.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,29 @@
'use strict'

// Load binding first to not import other modules if it throws
const libdatadog = require('@datadog/libdatadog')
const tracerVersion = require('../../../version').VERSION

function storeConfig (config) {
const processDiscovery = libdatadog.maybeLoad('process-discovery')
if (processDiscovery === undefined) {
return
}
try {
// Load binding first to not import other modules if it throws
const libdatadog = require('@datadog/libdatadog')
const processDiscovery = libdatadog.maybeLoad('process-discovery')
if (processDiscovery === undefined) {
return
}

const metadata = new processDiscovery.TracerMetadata(
config.tags['runtime-id'],
tracerVersion,
config.hostname,
config.service || null,
config.env || null,
config.version || null
)
const metadata = new processDiscovery.TracerMetadata(
config.tags['runtime-id'],
tracerVersion,
config.hostname,
config.service || null,
config.env || null,
config.version || null
)

return processDiscovery.storeMetadata(metadata)
return processDiscovery.storeMetadata(metadata)
} catch {
// Either libdatadog or process-discovery is unavailable.
}
}

module.exports = storeConfig
Loading