diff --git a/README.md b/README.md index 6b873ff79..69de3cd9d 100644 --- a/README.md +++ b/README.md @@ -66,8 +66,8 @@ The trace agent can do automatic tracing of the following web frameworks: The agent will also automatically trace RPCs from the following modules: * Outbound HTTP requests through `http`, `https`, and `http2` core modules * [grpc](https://www.npmjs.com/package/grpc) client (version ^1.1) -* [mongodb-core](https://www.npmjs.com/package/mongodb-core) (version 1) -* [mongoose](https://www.npmjs.com/package/mongoose) (version 4) +* [mongodb-core](https://www.npmjs.com/package/mongodb-core) (version 1 - 3) +* [mongoose](https://www.npmjs.com/package/mongoose) (version 4 - 5) * [mysql](https://www.npmjs.com/package/mysql) (version ^2.9) * [mysql2](https://www.npmjs.com/package/mysql2) (version 1) * [pg](https://www.npmjs.com/package/mysql2) (versions 6 - 7) diff --git a/src/plugins/plugin-mongodb-core.ts b/src/plugins/plugin-mongodb-core.ts index 0f0c0f688..45988f2f2 100644 --- a/src/plugins/plugin-mongodb-core.ts +++ b/src/plugins/plugin-mongodb-core.ts @@ -17,7 +17,7 @@ var shimmer = require('shimmer'); -var SUPPORTED_VERSIONS = '1 - 2'; +var SUPPORTED_VERSIONS = '1 - 3'; function createNextWrap(api) { return function nextWrap(next) { diff --git a/test/fixtures/plugin-fixtures.json b/test/fixtures/plugin-fixtures.json index 662eb25a1..782340d7d 100644 --- a/test/fixtures/plugin-fixtures.json +++ b/test/fixtures/plugin-fixtures.json @@ -112,11 +112,21 @@ "mongodb-core": "^2.0.4" } }, + "mongodb-core3": { + "dependencies": { + "mongodb-core": "^3.0.6" + } + }, "mongoose4": { "dependencies": { "mongoose": "^4.1.9" } }, + "mongoose5": { + "dependencies": { + "mongoose": "^5.1.3" + } + }, "mysql-2": { "dependencies": { "mysql": "^2.9.0" diff --git a/test/plugins/test-trace-mongodb.ts b/test/plugins/test-trace-mongodb.ts index 6abfbe8fe..cbaa4af73 100644 --- a/test/plugins/test-trace-mongodb.ts +++ b/test/plugins/test-trace-mongodb.ts @@ -29,7 +29,8 @@ var RESULT_SIZE = 5; var versions = { mongodb1: './fixtures/mongodb-core1', - mongodb2: './fixtures/mongodb-core2' + mongodb2: './fixtures/mongodb-core2', + mongodb3: './fixtures/mongodb-core3', }; describe('mongodb', function() { diff --git a/test/plugins/test-trace-mongoose.ts b/test/plugins/test-trace-mongoose.ts index b65d50950..e4c85b5f0 100644 --- a/test/plugins/test-trace-mongoose.ts +++ b/test/plugins/test-trace-mongoose.ts @@ -26,136 +26,144 @@ var common = require('./common'/*.js*/); var assert = require('assert'); -describe('test-trace-mongoose', function() { +describe('mongoose integration tests', function() { var agent; - var mongoose; var Simple; before(function() { agent = require('../../..').start({ projectId: '0', samplingRate: 0 }); - - mongoose = require('./fixtures/mongoose4'); - mongoose.Promise = global.Promise; - - var Schema = mongoose.Schema; - var simpleSchema = new Schema({ - f1: String, - f2: Boolean, - f3: Number - }); - - Simple = mongoose.model('Simple', simpleSchema); }); + + const versions = [4, 5]; + for (const version of versions) { + describe(`mongoose@${version}`, () => { + let mongoose; + + before(() => { + mongoose = require(`./fixtures/mongoose${version}`); + mongoose.Promise = global.Promise; + + var Schema = mongoose.Schema; + var simpleSchema = new Schema({ + f1: String, + f2: Boolean, + f3: Number + }); - beforeEach(function(done) { - var sim = new Simple({ - f1: 'sim', - f2: true, - f3: 42 - }); - mongoose.connect('mongodb://localhost:27017/testdb', function(err) { - assert(!err, 'Skipping: error connecting to mongo at localhost:27017.'); - sim.save(function(err) { - assert(!err); - common.cleanTraces(); - done(); + Simple = mongoose.model('Simple', simpleSchema); }); - }); - }); - afterEach(function(done) { - mongoose.connection.db.dropDatabase(function(err) { - assert(!err); - mongoose.connection.close(function(err) { - assert(!err); - common.cleanTraces(); - done(); + beforeEach(function(done) { + var sim = new Simple({ + f1: 'sim', + f2: true, + f3: 42 + }); + mongoose.connect('mongodb://localhost:27017/testdb', function(err) { + assert(!err, 'Skipping: error connecting to mongo at localhost:27017.'); + sim.save(function(err) { + assert(!err); + common.cleanTraces(); + done(); + }); + }); }); - }); - }); - it('should accurately measure create time', function(done) { - var data = new Simple({ - f1: 'val', - f2: false, - f3: 1729 - }); - common.runInTransaction(function(endTransaction) { - data.save(function(err) { - endTransaction(); - assert(!err); - var trace = common.getMatchingSpan(mongoPredicate.bind(null, 'mongo-insert')); - assert(trace); - done(); + afterEach(function(done) { + mongoose.connection.db.dropDatabase(function(err) { + assert(!err); + mongoose.connection.close(function(err) { + assert(!err); + common.cleanTraces(); + done(); + }); + }); }); - }); - }); - it('should accurately measure update time', function(done) { - common.runInTransaction(function(endTransaction) { - Simple.findOne({f1: 'sim'}, function(err, res) { - assert(!err); - res.f2 = false; - res.save(function(err) { - endTransaction(); - assert(!err); - var trace = common.getMatchingSpan(mongoPredicate.bind(null, 'mongo-update')); - assert(trace); - done(); + it('should accurately measure create time', function(done) { + var data = new Simple({ + f1: 'val', + f2: false, + f3: 1729 + }); + common.runInTransaction(function(endTransaction) { + data.save(function(err) { + endTransaction(); + assert(!err); + var trace = common.getMatchingSpan(mongoPredicate.bind(null, 'mongo-insert')); + assert(trace); + done(); + }); }); }); - }); - }); - it('should accurately measure retrieval time', function(done) { - common.runInTransaction(function(endTransaction) { - Simple.findOne({f1: 'sim'}, function(err, res) { - endTransaction(); - assert(!err); - var trace = common.getMatchingSpan(mongoPredicate.bind(null, 'mongo-cursor')); - assert(trace); - done(); + it('should accurately measure update time', function(done) { + common.runInTransaction(function(endTransaction) { + Simple.findOne({f1: 'sim'}, function(err, res) { + assert(!err); + res.f2 = false; + res.save(function(err) { + endTransaction(); + assert(!err); + var trace = common.getMatchingSpan(mongoPredicate.bind(null, 'mongo-update')); + assert(trace); + done(); + }); + }); + }); }); - }); - }); - it('should accurately measure delete time', function(done) { - common.runInTransaction(function(endTransaction) { - Simple.remove({f1: 'sim'}, function(err, res) { - endTransaction(); - assert(!err); - var trace = common.getMatchingSpan(mongoPredicate.bind(null, 'mongo-remove')); - assert(trace); - done(); + it('should accurately measure retrieval time', function(done) { + common.runInTransaction(function(endTransaction) { + Simple.findOne({f1: 'sim'}, function(err, res) { + endTransaction(); + assert(!err); + var trace = common.getMatchingSpan(mongoPredicate.bind(null, 'mongo-cursor')); + assert(trace); + done(); + }); + }); }); - }); - }); - it('should not break if no parent transaction', function(done) { - Simple.findOne({f1: 'sim'}, function(err, res) { - assert(!err); - assert(res); - done(); - }); - }); + it('should accurately measure delete time', function(done) { + common.runInTransaction(function(endTransaction) { + Simple.remove({f1: 'sim'}, function(err, res) { + endTransaction(); + assert(!err); + var trace = common.getMatchingSpan(mongoPredicate.bind(null, 'mongo-remove')); + assert(trace); + done(); + }); + }); + }); - it('should remove trace frames from stack', function(done) { - common.runInTransaction(function(endTransaction) { - Simple.findOne({f1: 'sim'}, function(err, res) { - endTransaction(); - assert(!err); - var trace = common.getMatchingSpan(mongoPredicate.bind(null, 'mongo-cursor')); - var labels = trace.labels; - var stackTrace = JSON.parse(labels[TraceLabels.STACK_TRACE_DETAILS_KEY]); - // Ensure that our patch is on top of the stack - assert( - stackTrace.stack_frame[0].method_name.indexOf('next_trace') !== -1); - done(); + it('should not break if no parent transaction', function(done) { + Simple.findOne({f1: 'sim'}, function(err, res) { + assert(!err); + assert(res); + done(); + }); + }); + + it('should remove trace frames from stack', function(done) { + common.runInTransaction(function(endTransaction) { + Simple.findOne({f1: 'sim'}, function(err, res) { + endTransaction(); + assert(!err); + var trace = common.getMatchingSpan(mongoPredicate.bind(null, 'mongo-cursor')); + var labels = trace.labels; + var stackTrace = JSON.parse(labels[TraceLabels.STACK_TRACE_DETAILS_KEY]); + // Ensure that our patch is on top of the stack + assert( + stackTrace.stack_frame[0].method_name.indexOf('next_trace') !== -1); + done(); + }); + }); }); }); - }); + } }); function mongoPredicate(id, span) {