apminsight
Version:
monitor nodejs applications
158 lines (145 loc) • 4.86 kB
JavaScript
var constants = require("./../../constants");
var utils = require("./../../util/utils");
var logger = require("./../../util/logger");
var componentName = "MSSQL";
var moduleInfo = {
functions: [
{
functionName: "connect",
component: componentName,
extractInfo: getHost
},
{
functionName: "ConnectionPool.prototype.connect",
component: componentName,
extractInfo: getRemoteHost
},
{
functionName: [
"Request.prototype.query",
"Request.prototype.batch"
],
component: componentName,
extractInfo: getQuery,
trackerType: constants.dbTracker
},
{
functionName: "Request.prototype.execute",
component: componentName,
extractInfo: getQueryFromProcedure,
trackerType: constants.dbTracker
},
{
functionName: "Request.prototype.bulk",
component: componentName
},
{
functionName: [
"Transaction.prototype.begin",
"Transaction.prototype.commit",
"Transaction.prototype.rollback"
],
component: componentName
},
{
functionName: [
"PreparedStatement.prototype.prepare",
"PreparedStatement.prototype.execute",
"PreparedStatement.prototype.unprepare"
],
component: componentName
}
]
};
function getQuery(invoker, params, returnObj, tracker, asynOpnInfo) {
getRemoteHost(invoker, params, returnObj, tracker);
let th;
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;
}
}
tracker.updateInfo(info);
}
function getRemoteHost(invoker, params, returnObj, tracker) {
if (!invoker) {
return;
}
var info = {};
var sourceObj = invoker.parent || invoker;
if (sourceObj && sourceObj.config) {
var config = sourceObj.config;
if (!utils.isNonEmptyString(config.server)) {
return;
}
info.host = config.server;
info.port = utils.isPositiveNumber(config.port) ? config.port : 1433;
}
tracker.updateInfo(info);
}
function getHost(invoker, params, returnObj, tracker) {
if (!params) {
return;
}
var info = {};
if (utils.isEmpty(params[0]) || !utils.isNonEmptyString(params[0].server)) {
return;
}
info.host = params[0].server;
info.port = utils.isPositiveNumber(params[0].port) ? params[0].port : 1433;
tracker.updateInfo(info);
}
function getQueryFromProcedure(invoker, params, returnObj, tracker) {
getRemoteHost(invoker, params, returnObj, tracker);
if (!params) {
return;
}
var info = {};
try {
if (params && utils.isNonEmptyString(params[0])) {
info.opn = "EXECUTE";
info.object = params[0];
var executeQuery = "exec " + params[0];
var invokParam = invoker.parameters;
if (invokParam) {
Object.keys(invokParam).forEach(function (eachParam) {
var eachParamMetric = invokParam[eachParam];
if (utils.isTypeNumber(eachParamMetric.value)) {
executeQuery +=
" @" +
eachParamMetric.name +
" = " +
eachParamMetric.value +
" , ";
} else {
executeQuery +=
" @" +
eachParamMetric.name +
" = '" +
eachParamMetric.value +
"' , ";
}
});
executeQuery = executeQuery.replace(/,\s*$/, "");
}
info.query = executeQuery;
}
} catch (err) {
logger.error(
"Exception occured while capturing stored procedure call",
err
);
}
tracker.updateInfo(info);
}
module.exports = moduleInfo;