diff --git a/spec/GridFSBucketStorageAdapter.spec.js b/spec/GridFSBucketStorageAdapter.spec.js index 8e1e4f2900..3ef62afd87 100644 --- a/spec/GridFSBucketStorageAdapter.spec.js +++ b/spec/GridFSBucketStorageAdapter.spec.js @@ -475,4 +475,14 @@ describe_only_db('mongo')('GridFSBucket', () => { expect(e.message).toEqual('Client must be connected before running operations'); } }); + + it('pass metadata to MongoClient', async () => { + const pkg = require('../package.json'); + const gfsAdapter = new GridFSBucketAdapter(databaseURI); + await gfsAdapter._connect(); + expect(gfsAdapter._client.s.options.driverInfo).toEqual({ + name: 'Parse Server', + version: pkg.version, + }); + }); }); diff --git a/spec/MongoStorageAdapter.spec.js b/spec/MongoStorageAdapter.spec.js index 8b14973243..b8d71bc149 100644 --- a/spec/MongoStorageAdapter.spec.js +++ b/spec/MongoStorageAdapter.spec.js @@ -449,6 +449,16 @@ describe_only_db('mongo')('MongoStorageAdapter', () => { expect(schemaAfterDeletion.fields.test).toBeUndefined(); }); + it('pass metadata to MongoClient', async () => { + const pkg = require('../package.json'); + const adapter = new MongoStorageAdapter({ uri: databaseURI }); + await adapter.connect(); + expect(adapter.client.s.options.driverInfo).toEqual({ + name: 'Parse Server', + version: pkg.version, + }); + }); + if (process.env.MONGODB_TOPOLOGY === 'replicaset') { describe('transactions', () => { const headers = { diff --git a/src/Adapters/Files/GridFSBucketAdapter.js b/src/Adapters/Files/GridFSBucketAdapter.js index 6820fc887f..7069e2968d 100644 --- a/src/Adapters/Files/GridFSBucketAdapter.js +++ b/src/Adapters/Files/GridFSBucketAdapter.js @@ -10,6 +10,7 @@ import { MongoClient, GridFSBucket, Db } from 'mongodb'; import { FilesAdapter, validateFilename } from './FilesAdapter'; import defaults, { ParseServerDatabaseOptions } from '../../defaults'; +import pkg from '../../../package.json'; const crypto = require('crypto'); export class GridFSBucketAdapter extends FilesAdapter { @@ -45,7 +46,12 @@ export class GridFSBucketAdapter extends FilesAdapter { _connect() { if (!this._connectionPromise) { - this._connectionPromise = MongoClient.connect(this._databaseURI, this._mongoOptions).then( + // Add wrapping library metadata. + const driverInfo = { + name: 'Parse Server', + version: pkg.version, + }; + this._connectionPromise = MongoClient.connect(this._databaseURI, { ...this._mongoOptions, driverInfo }).then( client => { this._client = client; return client.db(client.s.options.dbName); diff --git a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js index 24b206aec9..096d3835db 100644 --- a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js +++ b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js @@ -19,6 +19,7 @@ import _ from 'lodash'; import defaults, { ParseServerDatabaseOptions } from '../../../defaults'; import logger from '../../../logger'; import Utils from '../../../Utils'; +import pkg from '../../../../package.json'; // @flow-disable-next const mongodb = require('mongodb'); @@ -179,7 +180,12 @@ export class MongoStorageAdapter implements StorageAdapter { // parsing and re-formatting causes the auth value (if there) to get URI // encoded const encodedUri = formatUrl(parseUrl(this._uri)); - this.connectionPromise = MongoClient.connect(encodedUri, this._mongoOptions) + // Add wrapping library metadata. + const driverInfo = { + name: 'Parse Server', + version: pkg.version, + } + this.connectionPromise = MongoClient.connect(encodedUri, { ...this._mongoOptions, driverInfo }) .then(client => { // Starting mongoDB 3.0, the MongoClient.connect don't return a DB anymore but a client // Fortunately, we can get back the options and use them to select the proper DB.