Skip to content

Commit 840f390

Browse files
authored
Fix to DBM propagation - comment is injected before query is sent (#2938)
* adding query to async resource to ensure we add the comment before query.apply is called * changing full propagation test to check for comment before call to db
1 parent da14a6f commit 840f390

File tree

2 files changed

+37
-19
lines changed

2 files changed

+37
-19
lines changed

packages/datadog-instrumentations/src/pg.js

+15-11
Original file line numberDiff line numberDiff line change
@@ -27,34 +27,38 @@ function wrapQuery (query) {
2727
return query.apply(this, arguments)
2828
}
2929

30-
const retval = query.apply(this, arguments)
31-
32-
const queryQueue = this.queryQueue || this._queryQueue
33-
const activeQuery = this.activeQuery || this._activeQuery
34-
const pgQuery = queryQueue[queryQueue.length - 1] || activeQuery
35-
36-
if (!pgQuery) {
37-
return retval
38-
}
39-
4030
const callbackResource = new AsyncResource('bound-anonymous-fn')
4131
const asyncResource = new AsyncResource('bound-anonymous-fn')
4232
const processId = this.processID
33+
let pgQuery = {}
34+
pgQuery.text = arguments[0]
35+
4336
return asyncResource.runInAsyncScope(() => {
4437
startCh.publish({
4538
params: this.connectionParameters,
46-
originalQuery: pgQuery.text,
4739
query: pgQuery,
4840
processId
4941
})
5042

43+
arguments[0] = pgQuery.text
44+
5145
const finish = asyncResource.bind(function (error) {
5246
if (error) {
5347
errorCh.publish(error)
5448
}
5549
finishCh.publish()
5650
})
5751

52+
const retval = query.apply(this, arguments)
53+
const queryQueue = this.queryQueue || this._queryQueue
54+
const activeQuery = this.activeQuery || this._activeQuery
55+
56+
pgQuery = queryQueue[queryQueue.length - 1] || activeQuery
57+
58+
if (!pgQuery) {
59+
return retval
60+
}
61+
5862
if (pgQuery.callback) {
5963
const originalCallback = callbackResource.bind(pgQuery.callback)
6064
pgQuery.callback = function (err, res) {

packages/datadog-plugin-pg/test/index.spec.js

+22-8
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const { expect } = require('chai')
44
const semver = require('semver')
55
const agent = require('../../dd-trace/test/plugins/agent')
66
const { ERROR_MESSAGE, ERROR_TYPE, ERROR_STACK } = require('../../dd-trace/src/constants')
7+
const net = require('net')
78

89
const clients = {
910
pg: pg => pg.Client
@@ -374,6 +375,10 @@ describe('Plugin', () => {
374375
})
375376
describe('with DBM propagation enabled with full using tracer configurations', () => {
376377
const tracer = require('../../dd-trace')
378+
let seenTraceParent
379+
let seenTraceId
380+
let seenSpanId
381+
let originalWrite
377382
before(() => {
378383
return agent.load('pg')
379384
})
@@ -393,27 +398,36 @@ describe('Plugin', () => {
393398
database: 'postgres'
394399
})
395400
client.connect(err => done(err))
401+
originalWrite = net.Socket.prototype.write
402+
net.Socket.prototype.write = function (buffer) {
403+
let strBuf = buffer.toString()
404+
if (strBuf.includes('traceparent=\'')) {
405+
strBuf = strBuf.split('-')
406+
seenTraceParent = true
407+
seenTraceId = strBuf[1]
408+
seenSpanId = strBuf[2]
409+
}
410+
return originalWrite.apply(this, arguments)
411+
}
412+
})
413+
afterEach(() => {
414+
net.Socket.prototype.write = originalWrite
396415
})
397-
398416
it('query text should contain traceparent', done => {
399-
let queryText = ''
400417
agent.use(traces => {
401418
const traceId = traces[0][0].trace_id.toString(16).padStart(32, '0')
402419
const spanId = traces[0][0].span_id.toString(16).padStart(16, '0')
403-
404-
expect(queryText).to.equal(
405-
`/*dddbs='post',dde='tester',ddps='test',ddpv='8.4.0',` +
406-
`traceparent='00-${traceId}-${spanId}-00'*/ SELECT $1::text as message`)
420+
expect(seenTraceId).to.equal(traceId)
421+
expect(seenSpanId).to.equal(spanId)
407422
}).then(done, done)
408423

409424
client.query('SELECT $1::text as message', ['Hello World!'], (err, result) => {
410425
if (err) return done(err)
411-
426+
expect(seenTraceParent).to.be.true
412427
client.end((err) => {
413428
if (err) return done(err)
414429
})
415430
})
416-
queryText = client.queryQueue[0].text
417431
})
418432
it('query should inject _dd.dbm_trace_injected into span', done => {
419433
agent.use(traces => {

0 commit comments

Comments
 (0)