UNPKG

apminsight

Version:

monitor nodejs applications

231 lines (216 loc) 5.94 kB
// supported upto v2.15.0 var constants = require("./../../constants"); var wrapper = require("./../wrapper"); var utils = require("./../../util/utils"); var moduleInfo = { functions: [ { functionName: "createConnection", wrapper: wrapConnection, component: "MYSQL" }, { functionName: "createPool", wrapper: wrapPool, component: "MYSQL" }, { functionName: "createPoolCluster", wrapper: wrapPoolCluster, component: "MYSQL" }, { functionName: "Client.prototype.connect", component: "MYSQL" }, { functionName: "Client.prototype.query", component: "MYSQL", extractInfo: getQuery, trackerType: constants.dbTracker }, { functionName: "Client.prototype._connect", component: "MYSQL" } ] }; var connectionInfo = [ { functionName: "query", component: "MYSQL", extractInfo: getQuery, trackerType: constants.dbTracker }, { functionName: "connect", component: "MYSQL", extractInfo: getRemoteHost }, { functionName: "changeUser", component: "MYSQL" }, { functionName: "beginTransaction", component: "POJSO" }, { functionName: "commit", component: "MYSQL" }, { functionName: "rollback", component: "POJSO" }, { functionName: "ping", component: "MYSQL" }, { functionName: "end", component: "MYSQL" } ]; var poolInfo = [ { functionName: "getConnection", component: "MYSQL" }, { functionName: "acquireConnection", component: "POJSO" }, { functionName: "end", component: "MYSQL" }, { functionName: "query", component: "MYSQL" } ]; var poolClusterInfo = [ { functionName: "add", wrapper: wrapPoolClusterAdd, component: "MYSQL" }, { functionName: "getConnection", component: "MYSQL" } ]; function wrapConnection(actual) { return function () { var conn = actual.apply(this, arguments); checkAndInstrument(conn, connectionInfo); return conn; }; } function wrapPool(actual) { return function () { var pool = actual.apply(this, arguments); checkAndInstrument(pool, poolInfo); checkAndInstrumentPoolObject(pool); return pool; }; } function checkAndInstrumentPoolObject(pool) { if (pool && utils.isFunction(pool.on)) { if (!pool.apmInsightAgentInstrumented) { pool.on("connection", function (conn) { checkAndInstrument(conn, connectionInfo); }); pool.apmInsightAgentInstrumented = true; } } } function wrapPoolCluster(actual) { return function () { var poolCluster = actual.apply(this, arguments); checkAndInstrument(poolCluster, poolClusterInfo); return poolCluster; }; } function wrapPoolClusterAdd(actual) { return function () { var result = actual.apply(this, arguments); // NOTE : Object internal variable _nodes is used here // If it changed in mysql module then need to handle modification if (utils.isObject(this._nodes)) { var nodes = this._nodes; Object.keys(nodes).forEach(function (eachNode) { if (utils.isObject(nodes[eachNode])) { checkAndInstrumentPoolObject(nodes[eachNode].pool); } }); } return result; }; } function checkAndInstrument(result, moduleInfo) { if (!result) { return; } moduleInfo.forEach(function (eachFunctionInfo) { wrapper.checkAndWrapFunction( result, eachFunctionInfo, "mysql", eachFunctionInfo.functionName ); }); } function getRemoteHost(invoker, params, returnObj, tracker) { if (!invoker) { return; } var info = {}; if (invoker.host && invoker.port) { info.host = invoker.host; info.port = invoker.port; } var config = invoker.config; if (config && config.host && config.port) { info.host = config.host; info.port = config.port; } else if ( config.connectionConfig && config.connectionConfig.host && config.connectionConfig.port ) { info.host = config.connectionConfig.host; info.port = config.connectionConfig.port; } tracker.updateInfo(info); } function getQuery(invoker, params, query, tracker, asynOpnInfo) { getRemoteHost(invoker, params, query, tracker); let isSqlCaptureEnabled = apmInsightAgentInstance.getConfig().isDataExporterEnabled(); if (!isSqlCaptureEnabled) { let txn = asynOpnInfo && asynOpnInfo.curTxn; const threshold = txn ? utils.getGenericThreshold(txn.getUrl()) : apmInsightAgentInstance.getThreshold(); isSqlCaptureEnabled = threshold.isSqlCaptureEnabled(); } var info = {}; if (isSqlCaptureEnabled && params && params.length > 0) { var queryInfo = params[0]; if (typeof queryInfo === "string") { info.query = queryInfo; } else if (typeof queryInfo === "object") { info.query = queryInfo.sql; } } // callback is fetched and instrumentred from query object if (query && utils.isFunction(query._callback)) { var curTxn = apmInsightAgentInstance.getCurTxn(); query._callback = wrapper.wrapCallBack( query._callback, tracker, curTxn ); } tracker.updateInfo(info); } module.exports = moduleInfo;