dd-trace
Version:
Datadog APM tracing client for JavaScript
93 lines (83 loc) • 2.63 kB
JavaScript
var fs = require('fs')
var spawn = require('child_process').spawn
var tracerVersion = require('../../../../package.json').version
var log = require('./log')
module.exports = sendTelemetry
if (!process.env.DD_INJECTION_ENABLED) {
module.exports = function noop () {}
}
var telemetryForwarderPath = process.env.DD_TELEMETRY_FORWARDER_PATH
if (typeof telemetryForwarderPath !== 'string' || !fs.existsSync(telemetryForwarderPath)) {
module.exports = function noop () {}
}
var metadata = {
language_name: 'nodejs',
language_version: process.versions.node,
runtime_name: 'nodejs',
runtime_version: process.versions.node,
tracer_version: tracerVersion,
pid: process.pid,
result: 'unknown',
result_reason: 'unknown',
result_class: 'unknown'
}
var seen = {}
function shouldSend (point) {
if (point.name === 'abort') {
// This one can only be sent once, regardless of tags
if (seen.abort) {
return false
}
seen.abort = true
} else if (point.name === 'abort.integration') {
// For now, this is the only other one we want to dedupe
var compiledPoint = point.name + point.tags.join('')
if (seen[compiledPoint]) {
return false
}
seen[compiledPoint] = true
}
return true
}
function sendTelemetry (name, tags, resultMetadata) {
var points = name
if (typeof name === 'string') {
points = [{ name: name, tags: tags || [] }]
}
if (['1', 'true', 'True'].indexOf(process.env.DD_INJECT_FORCE) !== -1) {
points = points.filter(function (p) { return ['error', 'complete'].indexOf(p.name) !== -1 })
}
points = points.filter(function (p) { return shouldSend(p) })
for (var i = 0; i < points.length; i++) {
points[i].name = 'library_entrypoint.' + points[i].name
}
if (points.length === 0) {
return
}
// Update metadata with provided result metadata
var currentMetadata = {}
for (var key in metadata) {
currentMetadata[key] = metadata[key]
}
if (resultMetadata) {
for (var resultKey in resultMetadata) {
currentMetadata[resultKey] = resultMetadata[resultKey]
}
}
var proc = spawn(process.env.DD_TELEMETRY_FORWARDER_PATH, ['library_entrypoint'], {
stdio: 'pipe'
})
proc.on('error', function () {
log.error('Failed to spawn telemetry forwarder')
})
proc.on('exit', function (code) {
if (code !== 0) {
log.error('Telemetry forwarder exited with code', code)
}
})
proc.stdin.on('error', function () {
log.error('Failed to write telemetry data to telemetry forwarder')
})
proc.stdin.end(JSON.stringify({ metadata: currentMetadata, points: points }))
}