Skip to content

Commit 3f4f407

Browse files
Shadowbeetledszakallas
authored andcommitted
test(collector): add tests (#79)
1 parent 2329ad7 commit 3f4f407

4 files changed

Lines changed: 149 additions & 6 deletions

File tree

lib/agent/tracer/collector.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,7 @@ Collector.prototype.networkError = function (briefcase, error) {
129129
var self = this
130130

131131
var root = !communicationId
132-
133-
var cacheId = root ? briefcase.csCtx.communicationId : communicationId
132+
var cacheId = root ? 'root-' + briefcase.csCtx.communicationId : communicationId
134133

135134
this._cache(cacheId, {
136135
t: EVENT_TYPE.ERROR,
@@ -193,7 +192,7 @@ Collector.prototype.clientSend = function (payload, briefcase, options) {
193192
transactionId: transactionId
194193
}
195194

196-
var cacheId = root ? communication.id : communication.parentId
195+
var cacheId = root ? 'root-' + communication.id : communication.parentId
197196

198197
this._cache(cacheId, {
199198
t: EVENT_TYPE.CLIENT_SEND,
@@ -319,7 +318,7 @@ Collector.prototype.clientRecv = function (payload, duffelBag, briefcase) {
319318

320319
var root = !communication.parentId
321320

322-
var cacheId = root ? communication.id : communication.parentId
321+
var cacheId = root ? 'root-' + communication.id : communication.parentId
323322

324323
this._cache(cacheId, {
325324
t: EVENT_TYPE.CLIENT_RECV,

lib/agent/tracer/collector.spec.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,16 @@ describe('Collector', function () {
426426
tracer.networkError(cs.briefcase, new Error())
427427
expect(tracer.collect().length).to.eql(2)
428428
})
429+
430+
it('is collected when not in a transaction and error sets severity', function () {
431+
var tracer = new Collector(options)
432+
var payload = { }
433+
var briefcase = { }
434+
var cs = tracer.clientSend(payload, briefcase)
435+
436+
tracer.networkError(cs.briefcase, new Error())
437+
expect(tracer.collect().length).to.eql(2)
438+
})
429439
})
430440

431441
describe('CR', function () {
@@ -537,6 +547,35 @@ describe('Collector', function () {
537547
expect(tracer.collect().length).to.eql(2)
538548
})
539549
})
550+
551+
describe('SR - CS - NE - SS', function () {
552+
it('is collected', function () {
553+
var tracer = new Collector(options)
554+
var sr = {
555+
payload: {},
556+
duffelBag: {
557+
communicationId: 'communicationId',
558+
transactionId: 'transactionId',
559+
parentServiceKey: 8,
560+
timestamp: 1
561+
}
562+
}
563+
var cs = {
564+
payload: {}
565+
}
566+
var ss = {
567+
payload: {}
568+
}
569+
570+
var srResult = tracer.serverRecv(sr.payload, sr.duffelBag)
571+
var csResult = tracer.clientSend(cs.payload, srResult.briefcase)
572+
tracer.networkError(csResult.briefcase, new Error())
573+
tracer.serverSend(ss.payload, srResult.briefcase)
574+
tracer.end(srResult.briefcase)
575+
expect(tracer.collect().length).to.eql(4)
576+
})
577+
})
578+
540579
describe('User sent error', function () {
541580
it('is collected', function () {
542581
var error = new Error('yikes!')

lib/instrumentations/core/http/request.spec.js

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ describe('The http.request wrapper module', function () {
4949
mustCollectSeverity: 2,
5050
defaultSeverity: 3,
5151
clientSend: this.sandbox.stub().returns(clientSendResult),
52-
clientRecv: this.sandbox.stub()
52+
clientRecv: this.sandbox.stub(),
53+
networkError: this.sandbox.stub()
5354
}
5455
},
5556
externalEdgeMetrics: {
@@ -79,7 +80,7 @@ describe('The http.request wrapper module', function () {
7980
})
8081
})
8182

82-
describe('on non-whitelited request', function () {
83+
describe('on non-whitelisted request', function () {
8384
it('calls agent.tracer.collector.clientSend with expected arguments', function () {
8485
var r = request(original, agent)
8586

@@ -365,6 +366,28 @@ describe('The http.request wrapper module', function () {
365366

366367
expect(agent.externalEdgeMetrics.report).not.to.be.called
367368
})
369+
370+
it('calls agent.tracer.networkError with expected arguments', function () {
371+
var r = request(original, agent)
372+
var error = new Error()
373+
appliedOriginal.on = this.sandbox.spy(function (name, cb) {
374+
if (name === 'error') {
375+
cb(error)
376+
}
377+
})
378+
379+
r({
380+
host: 'localhost',
381+
path: '/',
382+
headers: {},
383+
method: 'GET'
384+
})
385+
386+
expect(appliedOriginal.on).to.have.been.called
387+
expect(agent.tracer.collector.clientSend).to.have.been.called
388+
expect(agent.tracer.collector.networkError)
389+
.to.be.calledWith(clientSendResult.briefcase, error)
390+
})
368391
})
369392

370393
it('does not report external edge metrics when statusCode >= 500', function () {

test/e2e/clientUnreachable.spec.js

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
'use strict'
2+
3+
var express = require('express')
4+
var request = require('superagent')
5+
var test = require('./utils/test')
6+
var serviceMocks = require('./utils/serviceMocks')
7+
var zlib = require('zlib')
8+
9+
var TRACE_COLLECTOR_API_URL = 'https://trace-collector-api.risingstack.com'
10+
var TRACE_API_KEY = 'headers.payload.signature'
11+
var TRACE_SERVICE_NAME = 'service-name'
12+
var TEST_TRACE_SERVICE_KEY = 42
13+
var TEST_TIMEOUT = 3000
14+
var TEST_WEB_SERVER_PORT = process.env.TEST_WEBSERVER_PORT || 44332
15+
16+
var cpOpts = {
17+
env: {
18+
TRACE_API_KEY: TRACE_API_KEY,
19+
TRACE_SERVICE_NAME: TRACE_SERVICE_NAME,
20+
TRACE_COLLECT_INTERVAL: 1000,
21+
TRACE_UPDATE_INTERVAL: 3000,
22+
TRACE_IGNORE_HEADERS: JSON.stringify({
23+
'ignore-me': '1'
24+
})
25+
}
26+
}
27+
28+
29+
test('client Unreachable',
30+
{
31+
// FIXME: I patched nock, so it can gunzip requests on appropriate
32+
// content-encoding headers, however it uses the sync API due to
33+
// design limitations in nock.
34+
skip: !zlib.gunzipSync,
35+
isolate: 'child-process',
36+
childProcessOpts: cpOpts
37+
}, function (t) {
38+
var timesCalled = 0
39+
serviceMocks.mockServiceKeyRequest({
40+
url: TRACE_COLLECTOR_API_URL,
41+
apiKey: TRACE_API_KEY,
42+
callback: function () {
43+
return [200, { key: TEST_TRACE_SERVICE_KEY }]
44+
}
45+
})
46+
serviceMocks.mockTraceRequest({
47+
url: TRACE_COLLECTOR_API_URL,
48+
apiKey: TRACE_API_KEY,
49+
serviceKey: TEST_TRACE_SERVICE_KEY,
50+
callback: function (uri, requestBody) {
51+
t.pass() // TODO check events
52+
t.end()
53+
process.exit(0)
54+
}
55+
})
56+
require('@risingstack/trace')
57+
t.pass('Trace loaded into server')
58+
// http server
59+
var app = express()
60+
app.get('/test', function (req, res) {
61+
request
62+
.get('127.0.0.1:64231')
63+
.end(function (err) {
64+
t.ok(err, 'error arrives')
65+
res.send('test')
66+
})
67+
})
68+
app.listen(TEST_WEB_SERVER_PORT, function (err) {
69+
t.error(err, 'server starts listening at ' + TEST_WEB_SERVER_PORT)
70+
// http client request
71+
request
72+
.get('127.0.0.1:' + TEST_WEB_SERVER_PORT + '/test')
73+
// .set('x-must-collect', '1')
74+
.end(function (err) {
75+
t.error(err, 'client sends request to /test')
76+
})
77+
})
78+
setTimeout(function () {
79+
t.fail('test timed out without completing')
80+
process.exit(1)
81+
}, TEST_TIMEOUT)
82+
})

0 commit comments

Comments
 (0)