apminsight
Version:
monitor nodejs applications
94 lines (86 loc) • 3.01 kB
JavaScript
// supported upto v2.2.2
var wrapper = require("./../wrapper");
var logger = require("./../../util/logger");
var utils = require("./../../util/utils");
var componentName = "MEMCACHED";
var moduleInfo = {
functions: [
{
functionName: "prototype.command",
component: componentName,
wrapper: wrapCommand
}
]
};
function wrapCommand(actual) {
return function (getCommandInfo) {
try {
var curTracker;
var parentTracker = apmInsightAgentInstance.getCurTracker();
if (getCommandInfo && utils.isFunction(getCommandInfo)) {
var commandInfo = getCommandInfo();
if (isCommandInfoValid(commandInfo)) {
var trackerName =
componentName +
" - " +
commandInfo.type +
" - " +
commandInfo.key;
var trackerInfo = {
trackerName: trackerName,
component: componentName,
parent: parentTracker
};
curTracker =
apmInsightAgentInstance.createTracker(trackerInfo);
commandInfo.callback = wrapper.wrapCallBack(
commandInfo.callback,
curTracker,
apmInsightAgentInstance.getCurTxn()
);
arguments[0] = function () {
return commandInfo;
};
extractMachineInfo(curTracker, this, commandInfo);
}
}
var result = actual.apply(this, arguments);
return result;
} catch (e) {
logger.error("memcache command handler", e);
apmInsightAgentInstance.handleErrorTracker(curTracker, e);
throw e;
} finally {
apmInsightAgentInstance.setCurTracker(parentTracker);
}
};
}
function extractMachineInfo(curTracker, invoker, commandInfo) {
if (curTracker && invoker) {
var machineInfo;
if (invoker.servers && typeof invoker.servers === "string") {
machineInfo = invoker.servers.split(":");
} else if (
invoker.HashRing &&
invoker.HashRing.get &&
invoker.HashRing.get(commandInfo.key)
) {
machineInfo = invoker.HashRing.get(commandInfo.key).split(":");
}
if (machineInfo && machineInfo.length === 2) {
var info = {};
info.host = machineInfo[0];
info.port = machineInfo[1];
curTracker.updateInfo(info);
}
}
}
function isCommandInfoValid(commandInfo) {
return (
commandInfo &&
commandInfo.type &&
commandInfo.key &&
utils.isFunction(commandInfo.callback)
);
}
module.exports = moduleInfo;