diff --git a/integration-tests/profiler/profiler.spec.js b/integration-tests/profiler/profiler.spec.js index 3b26448a2b..57136a0a2f 100644 --- a/integration-tests/profiler/profiler.spec.js +++ b/integration-tests/profiler/profiler.spec.js @@ -34,17 +34,24 @@ function expectProfileMessagePromise (agent, timeout, ) { const fileNames = expectedProfileTypes.map(type => `${type}.pprof`) return agent.assertMessageReceived(({ headers, _, files }) => { + let event try { assert.propertyVal(headers, 'host', `127.0.0.1:${agent.port}`) assert.propertyVal(files[0], 'originalname', 'event.json') - const event = JSON.parse(files[0].buffer.toString()) + event = JSON.parse(files[0].buffer.toString()) assert.propertyVal(event, 'family', 'node') + assert.isString(event.info.profiler.activation) + const ssiEnabled = event.info.profiler.ssi.enabled + assert.isBoolean(ssiEnabled) + if (ssiEnabled) { + assert.isString(event.info.profiler.ssi.mechanism) + } assert.deepPropertyVal(event, 'attachments', fileNames) for (const [index, fileName] of fileNames.entries()) { assert.propertyVal(files[index + 1], 'originalname', fileName) } } catch (e) { - e.message += ` ${JSON.stringify({ headers, files })}` + e.message += ` ${JSON.stringify({ headers, files, event })}` throw e } }, timeout, multiplicity) diff --git a/packages/dd-trace/src/profiler.js b/packages/dd-trace/src/profiler.js index 65c0d00709..914cfc3dfd 100644 --- a/packages/dd-trace/src/profiler.js +++ b/packages/dd-trace/src/profiler.js @@ -8,8 +8,8 @@ process.once('beforeExit', () => { profiler.stop() }) module.exports = { start: config => { - const { service, version, env, url, hostname, port, tags, repositoryUrl, commitSHA } = config - const { sourceMap, exporters } = config.profiling + const { service, version, env, url, hostname, port, tags, repositoryUrl, commitSHA, injectionEnabled } = config + const { enabled, sourceMap, exporters } = config.profiling const logger = { debug: (message) => log.debug(message), info: (message) => log.info(message), @@ -17,6 +17,16 @@ module.exports = { error: (message) => log.error(message) } + const libraryInjected = injectionEnabled.length > 0 + let activation + if (enabled === 'auto') { + activation = 'auto' + } else if (enabled === 'true') { + activation = 'manual' + } else if (injectionEnabled.includes('profiler')) { + activation = 'injection' + } // else activation = undefined + return profiler.start({ service, version, @@ -29,7 +39,9 @@ module.exports = { port, tags, repositoryUrl, - commitSHA + commitSHA, + libraryInjected, + activation }) }, diff --git a/packages/dd-trace/src/profiling/config.js b/packages/dd-trace/src/profiling/config.js index f866a925ff..8d399c68bf 100644 --- a/packages/dd-trace/src/profiling/config.js +++ b/packages/dd-trace/src/profiling/config.js @@ -125,6 +125,8 @@ class Config { port }))) + this.libraryInjected = options.libraryInjected + this.activation = options.activation this.exporters = ensureExporters(options.exporters || [ new AgentExporter(this) ], this) diff --git a/packages/dd-trace/src/profiling/exporter_cli.js b/packages/dd-trace/src/profiling/exporter_cli.js index 53db9f5f78..474f4237de 100644 --- a/packages/dd-trace/src/profiling/exporter_cli.js +++ b/packages/dd-trace/src/profiling/exporter_cli.js @@ -16,10 +16,22 @@ function exporterFromURL (url) { if (url.protocol === 'file:') { return new FileExporter({ pprofPrefix: fileURLToPath(url) }) } else { + const injectionEnabled = (process.env.DD_INJECTION_ENABLED || '').split(',') + const libraryInjected = injectionEnabled.length > 0 + const profilingEnabled = (process.env.DD_PROFILING_ENABLED || '').toLowerCase() + const activation = ['true', '1'].includes(profilingEnabled) + ? 'manual' + : profilingEnabled === 'auto' + ? 'auto' + : injectionEnabled.includes('profiling') + ? 'injection' + : 'unknown' return new AgentExporter({ url, logger, - uploadTimeout: timeoutMs + uploadTimeout: timeoutMs, + libraryInjected, + activation }) } } diff --git a/packages/dd-trace/src/profiling/exporters/agent.js b/packages/dd-trace/src/profiling/exporters/agent.js index ff37b6f090..e4ec0e528a 100644 --- a/packages/dd-trace/src/profiling/exporters/agent.js +++ b/packages/dd-trace/src/profiling/exporters/agent.js @@ -53,7 +53,7 @@ function computeRetries (uploadTimeout) { } class AgentExporter { - constructor ({ url, logger, uploadTimeout, env, host, service, version } = {}) { + constructor ({ url, logger, uploadTimeout, env, host, service, version, libraryInjected, activation } = {}) { this._url = url this._logger = logger @@ -65,6 +65,8 @@ class AgentExporter { this._host = host this._service = service this._appVersion = version + this._libraryInjected = !!libraryInjected + this._activation = activation || 'unknown' } export ({ profiles, start, end, tags }) { @@ -105,6 +107,11 @@ class AgentExporter { kernel_version: os.version() }, profiler: { + activation: this._activation, + ssi: { + enabled: this._libraryInjected, + mechanism: this._libraryInjected ? 'injected_agent' : undefined + }, version }, runtime: { diff --git a/packages/dd-trace/test/profiling/exporters/agent.spec.js b/packages/dd-trace/test/profiling/exporters/agent.spec.js index 3987c1a982..1a0137272c 100644 --- a/packages/dd-trace/test/profiling/exporters/agent.spec.js +++ b/packages/dd-trace/test/profiling/exporters/agent.spec.js @@ -115,7 +115,10 @@ describe('exporters/agent', function () { expect(event.info.platform).to.have.property('kernel_release', os.release()) expect(event.info.platform).to.have.property('kernel_version', os.version()) expect(event.info).to.have.property('profiler') - expect(Object.keys(event.info.profiler)).to.have.length(1) + expect(Object.keys(event.info.profiler)).to.have.length(3) + expect(event.info.profiler).to.have.property('activation', 'unknown') + expect(event.info.profiler).to.have.property('ssi') + expect(event.info.profiler.ssi).to.have.property('enabled', false) expect(event.info.profiler).to.have.property('version', version) expect(event.info).to.have.property('runtime') expect(Object.keys(event.info.runtime)).to.have.length(2)