From efea1d589ffd8bbd4b1338d888d6befb6ef6789d Mon Sep 17 00:00:00 2001 From: Matt Lavin Date: Wed, 10 Feb 2016 17:32:36 -0500 Subject: [PATCH] Add instrumentation for Q --- lib/instrumentation/q.js | 13 ++++ lib/instrumentations.js | 1 + test/integration/instrumentation/q.tap.js | 79 +++++++++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 lib/instrumentation/q.js create mode 100644 test/integration/instrumentation/q.tap.js diff --git a/lib/instrumentation/q.js b/lib/instrumentation/q.js new file mode 100644 index 0000000000..3b0111fc13 --- /dev/null +++ b/lib/instrumentation/q.js @@ -0,0 +1,13 @@ +'use strict' + +var wrap = require('../shimmer').wrapMethod + +module.exports = initialize + +function initialize(agent, Q) { + if (Q.nextTick) { + wrap(Q, 'Q.nextTick', 'nextTick', function wrapUninstrumented(original, method) { + return agent.tracer.wrapFunctionFirstNoSegment(original, method) + }) + } +} diff --git a/lib/instrumentations.js b/lib/instrumentations.js index 8eeb3152c6..85cd1710f0 100644 --- a/lib/instrumentations.js +++ b/lib/instrumentations.js @@ -13,6 +13,7 @@ module.exports = function instrumentations() { 'node-cassandra-cql', 'cassandra-driver', 'pg', + 'q', 'redis', 'restify', 'oracle' diff --git a/test/integration/instrumentation/q.tap.js b/test/integration/instrumentation/q.tap.js new file mode 100644 index 0000000000..fd8f1af95d --- /dev/null +++ b/test/integration/instrumentation/q.tap.js @@ -0,0 +1,79 @@ +'use strict' + +var test = require('tap').test +var helper = require('../../lib/agent_helper') + +function QContext(test, agent) { + this.agent = agent; + this.test = test; +} + +QContext.prototype.assertTransaction = function assertTransaction(transaction) { + this.test.equal(this.agent.getTransaction(), transaction) + this.test.equal(this.agent.getTransaction().trace.root.children.length, 0) +} + +test('Q.ninvoke', function testQNInvoke(t) { + var agent = setupAgent(t) + var Q = require('q') + var qContext = new QContext(t, agent) + + var firstTest = Q.defer() + var secondTest = Q.defer() + + helper.runInTransaction(agent, function transactionWrapper(transaction) { + Q.ninvoke(function anonymous() { + qContext.assertTransaction(transaction) + firstTest.resolve() + }) + }) + + helper.runInTransaction(agent, function transactionWrapper(transaction) { + Q.ninvoke(function anonymous() { + qContext.assertTransaction(transaction) + secondTest.resolve() + }) + }) + + Q.all([firstTest, secondTest]) + .then(function done() { + t.end() + }) +}) + +test('Q.then', function testQNInvoke(t) { + var agent = setupAgent(t) + var Q = require('q') + var qContext = new QContext(t, agent) + + var firstTest = Q.defer() + var secondTest = Q.defer() + + helper.runInTransaction(agent, function transactionWrapper(transaction) { + Q(true).then(function anonymous() { + qContext.assertTransaction(transaction) + firstTest.resolve() + }) + }) + + helper.runInTransaction(agent, function transactionWrapper(transaction) { + Q(true).then(function anonymous() { + qContext.assertTransaction(transaction) + secondTest.resolve() + }) + }) + + Q.all([firstTest, secondTest]) + .then(function done() { + t.end() + }) +}) + +function setupAgent(t) { + var agent = helper.instrumentMockedAgent() + t.tearDown(function tearDown() { + helper.unloadAgent(agent) + }) + + return agent +}