Skip to content

Commit 011f5d9

Browse files
author
Stephen Belanger
committed
feat(http): adopt traceparent as context parent
1 parent df0064d commit 011f5d9

File tree

4 files changed

+37
-14
lines changed

4 files changed

+37
-14
lines changed

lib/instrumentation/http-shared.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ exports.instrumentRequest = function (agent, moduleName) {
1616
// don't leak previous transaction
1717
agent._instrumentation.currentTransaction = null
1818
} else {
19-
var trans = agent.startTransaction()
19+
var traceparent = req.headers['elastic-apm-traceparent']
20+
var trans = agent.startTransaction(null, null, traceparent)
2021
trans.type = 'request'
2122
trans.req = req
2223
trans.res = res

lib/instrumentation/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,8 @@ Instrumentation.prototype.addEndedSpan = function (span) {
128128
}
129129
}
130130

131-
Instrumentation.prototype.startTransaction = function (name, type) {
132-
return new Transaction(this._agent, name, type)
131+
Instrumentation.prototype.startTransaction = function (name, type, header) {
132+
return new Transaction(this._agent, name, type, header)
133133
}
134134

135135
Instrumentation.prototype.endTransaction = function (result) {

lib/instrumentation/transaction.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ var Timer = require('./timer')
1212

1313
module.exports = Transaction
1414

15-
function Transaction (agent, name, type) {
15+
function Transaction (agent, name, type, traceparent) {
1616
Object.defineProperty(this, 'name', {
1717
configurable: true,
1818
enumerable: true,
@@ -67,7 +67,10 @@ function Transaction (agent, name, type) {
6767
// Random sampling
6868
this.sampled = Math.random() <= agent._conf.transactionSampleRate
6969

70-
this.context = TraceContext.create(this.sampled)
70+
this.context = traceparent
71+
? TraceContext.fromString(traceparent).child()
72+
: TraceContext.create(this.sampled)
73+
7174
this._defaultName = name || ''
7275
this._customName = ''
7376
this._user = null

test/instrumentation/modules/http/basic.js

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ var test = require('tape')
88

99
var assert = require('./_assert')
1010
var mockClient = require('../../../_mock_http_client')
11+
var TraceContext = require('../../../../lib/instrumentation/context')
1112

1213
test('http.createServer', function (t) {
1314
t.test('direct callback', function (t) {
@@ -17,7 +18,7 @@ test('http.createServer', function (t) {
1718
t.end()
1819
})
1920

20-
var server = http.createServer(onRequest)
21+
var server = http.createServer(onRequest(t))
2122
sendRequest(server)
2223
})
2324

@@ -29,7 +30,7 @@ test('http.createServer', function (t) {
2930
})
3031

3132
var server = http.createServer()
32-
server.addListener('request', onRequest)
33+
server.addListener('request', onRequest(t))
3334
sendRequest(server)
3435
})
3536

@@ -41,7 +42,7 @@ test('http.createServer', function (t) {
4142
})
4243

4344
var server = http.createServer()
44-
server.on('request', onRequest)
45+
server.on('request', onRequest(t))
4546
sendRequest(server)
4647
})
4748
})
@@ -54,7 +55,7 @@ test('new http.Server', function (t) {
5455
t.end()
5556
})
5657

57-
var server = new http.Server(onRequest)
58+
var server = new http.Server(onRequest(t))
5859
sendRequest(server)
5960
})
6061

@@ -66,7 +67,7 @@ test('new http.Server', function (t) {
6667
})
6768

6869
var server = new http.Server()
69-
server.addListener('request', onRequest)
70+
server.addListener('request', onRequest(t))
7071
sendRequest(server)
7172
})
7273

@@ -78,18 +79,27 @@ test('new http.Server', function (t) {
7879
})
7980

8081
var server = new http.Server()
81-
server.on('request', onRequest)
82+
server.on('request', onRequest(t))
8283
sendRequest(server)
8384
})
8485
})
8586

8687
function sendRequest (server, timeout) {
8788
server.listen(function () {
8889
var port = server.address().port
89-
var req = http.get('http://localhost:' + port, function (res) {
90+
var req = http.request({
91+
hostname: 'localhost',
92+
port: port,
93+
path: '/',
94+
method: 'GET',
95+
headers: {
96+
'Elastic-APM-traceparent': TraceContext.create().toString()
97+
}
98+
}, function (res) {
9099
if (timeout) throw new Error('should not get to here')
91100
res.resume()
92101
})
102+
req.end()
93103

94104
if (timeout) {
95105
process.nextTick(function () {
@@ -99,8 +109,17 @@ function sendRequest (server, timeout) {
99109
})
100110
}
101111

102-
function onRequest (req, res) {
103-
res.end()
112+
function onRequest (t) {
113+
return function onRequestHandler (req, res) {
114+
var traceparent = req.headers['elastic-apm-traceparent']
115+
var parent = TraceContext.fromString(traceparent).toJSON()
116+
var context = agent.currentTransaction.context.toJSON()
117+
t.equal(parent.traceId, context.traceId, 'context trace id matches parent trace id')
118+
t.notEqual(parent.id, context.id, 'context id does not match parent id')
119+
t.equal(parent.flags, context.flags, 'context flags matches parent flags')
120+
t.equal(parent.id, context.parentId, 'context is a child of traceparent')
121+
res.end()
122+
}
104123
}
105124

106125
function resetAgent (cb) {

0 commit comments

Comments
 (0)