Skip to content

Commit

Permalink
Add support for exit spans in Code Origin for Spans
Browse files Browse the repository at this point in the history
  • Loading branch information
watson committed Oct 12, 2024
1 parent 878d076 commit d60ee21
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 13 deletions.
15 changes: 6 additions & 9 deletions packages/datadog-plugin-fastify/test/code_origin.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
const axios = require('axios')
const semver = require('semver')
const agent = require('../../dd-trace/test/plugins/agent')
const { getNextLineNumber } = require('../../dd-trace/test/plugins/helpers')
const { NODE_MAJOR } = require('../../../version')

const host = 'localhost'
Expand Down Expand Up @@ -49,13 +50,13 @@ describe('Plugin', () => {

// Wrap in a named function to have at least one frame with a function name
function wrapperFunction () {
routeRegisterLine = getNextLineNumber()
routeRegisterLine = String(getNextLineNumber())
app.get('/user', function userHandler (request, reply) {
reply.send()
})
}

const callWrapperLine = getNextLineNumber()
const callWrapperLine = String(getNextLineNumber())
wrapperFunction()

app.listen(() => {
Expand Down Expand Up @@ -95,7 +96,7 @@ describe('Plugin', () => {
let routeRegisterLine

app.register(function v1Handler (app, opts, done) {
routeRegisterLine = getNextLineNumber()
routeRegisterLine = String(getNextLineNumber())
app.get('/user', function userHandler (request, reply) {
reply.send()
})
Expand Down Expand Up @@ -134,7 +135,7 @@ describe('Plugin', () => {
next()
})

const routeRegisterLine = getNextLineNumber()
const routeRegisterLine = String(getNextLineNumber())
app.get('/user', function userHandler (request, reply) {
reply.send()
})
Expand Down Expand Up @@ -170,7 +171,7 @@ describe('Plugin', () => {
// number of where the route handler is defined. However, this might not be the right choice and it might be
// better to point to the middleware.
it.skip('should point to middleware if middleware responds early', function testCase (done) {
const middlewareRegisterLine = getNextLineNumber()
const middlewareRegisterLine = String(getNextLineNumber())
app.use(function middleware (req, res, next) {
res.end()
})
Expand Down Expand Up @@ -210,7 +211,3 @@ describe('Plugin', () => {
})
})
})

function getNextLineNumber () {
return String(Number(new Error().stack.split('\n')[2].match(/:(\d+):/)[1]) + 1)
}
9 changes: 9 additions & 0 deletions packages/dd-trace/src/plugins/outbound.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ const {
PEER_SERVICE_REMAP_KEY
} = require('../constants')
const TracingPlugin = require('./tracing')
const { exitTag } = require('../../../datadog-code-origin')

const COMMON_PEER_SVC_SOURCE_TAGS = [
'net.peer.name',
Expand All @@ -25,6 +26,14 @@ class OutboundPlugin extends TracingPlugin {
})
}

startSpan (...args) {
const span = super.startSpan(...args)
if (this._tracerConfig.codeOriginForSpansEnabled) {
span.addTags(exitTag(this.startSpan))
}
return span
}

getPeerService (tags) {
/**
* Compute `peer.service` and associated metadata from available tags, based
Expand Down
5 changes: 5 additions & 0 deletions packages/dd-trace/test/plugins/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -117,11 +117,16 @@ function unbreakThen (promise) {
}
}

function getNextLineNumber () {
return Number(new Error().stack.split('\n')[2].match(/:(\d+):/)[1]) + 1
}

module.exports = {
breakThen,
compare,
deepInclude,
expectSomeSpan,
getNextLineNumber,
resolveNaming,
unbreakThen,
withDefaults
Expand Down
68 changes: 68 additions & 0 deletions packages/dd-trace/test/plugins/outbound.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
require('../setup/tap')

const { expect } = require('chai')
const { getNextLineNumber } = require('./helpers')
const OutboundPlugin = require('../../src/plugins/outbound')

describe('OuboundPlugin', () => {
Expand Down Expand Up @@ -157,4 +158,71 @@ describe('OuboundPlugin', () => {
})
})
})

describe('code origin tags', () => {
let instance = null

beforeEach(() => {
const tracerStub = {
_tracer: {
startSpan: sinon.stub().returns({
addTags: sinon.spy()
})
}
}
instance = new OutboundPlugin(tracerStub)
})

it('should not add exit tags to span if codeOriginForSpansEnabled is false', () => {
sinon.stub(instance, '_tracerConfig').value({ codeOriginForSpansEnabled: false })
const span = instance.startSpan('test')
expect(span.addTags).to.not.have.been.called
})

it('should add exit tags to span if codeOriginForSpansEnabled is true', () => {
sinon.stub(instance, '_tracerConfig').value({ codeOriginForSpansEnabled: true })

const lineNumber = String(getNextLineNumber())
const span = instance.startSpan('test')

expect(span.addTags).to.have.been.calledOnce
const args = span.addTags.args[0]
expect(args).to.have.property('length', 1)
const tags = parseTags(args[0])

expect(tags).to.nested.include({ '_dd.code_origin.type': 'exit' })
expect(tags._dd.code_origin).to.have.property('frames').to.be.an('array').with.length.above(0)

for (const frame of tags._dd.code_origin.frames) {
expect(frame).to.have.property('file', __filename)
expect(frame).to.have.property('line').to.match(/^\d+$/)
expect(frame).to.have.property('column').to.match(/^\d+$/)
expect(frame).to.have.property('type').to.a('string')
}

const topFrame = tags._dd.code_origin.frames[0]
expect(topFrame).to.have.property('line', lineNumber)
})
})
})

function parseTags (tags) {
const parsedTags = {}
for (const [tag, value] of Object.entries(tags)) {
const keys = tag.split('.')
let current = parsedTags
let depth = 0
for (const key of keys) {
if (!current[key]) {
if (depth === keys.length - 1) {
current[key] = value
break
}
current[key] = keys[depth + 1]?.match(/^\d+$/) ? [] : {}
}
current = current[key]
depth++
}
}
return parsedTags
}
5 changes: 1 addition & 4 deletions packages/dd-trace/test/plugins/util/stacktrace.spec.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
'use strict'

const { isAbsolute } = require('path')
const { getNextLineNumber } = require('../helpers')

require('../../setup/tap')

Expand Down Expand Up @@ -62,7 +63,3 @@ describe('stacktrace utils', () => {
})
})
})

function getNextLineNumber () {
return Number(new Error().stack.split('\n')[2].match(/:(\d+):/)[1]) + 1
}

0 comments on commit d60ee21

Please sign in to comment.