apminsight
Version:
monitor nodejs applications
99 lines (92 loc) • 3.07 kB
JavaScript
var wrapper = require("./wrapper");
var utils = require("./../util/utils");
var logger = require("./../util/logger");
var http2Info = {
stream: [
{
functionName: ["close", "setTimeout"]
}
],
session: [
{
functionName: ["close", "ping", "setTimeout"]
}
]
};
function handleHttp2Request(req, res) {
try {
if (req && req.stream && req.stream.session) {
if (!req.stream.apminsightTxn) {
var listenerName = "emit - request";
var txn = apmInsightAgentInstance.createTxn(
req,
res,
listenerName
);
req.stream.apminsightTxn = txn;
req.stream.session.apminsightTxn = txn;
instrumentHttp2Stream(req.stream);
instrumentHttp2Session(req.session);
apmInsightAgentInstance.endRootTracker();
apmInsightAgentInstance.clearCurContext();
} else {
req.stream.apminsightTxn.endRootTracker();
}
}
} catch (e) {
logger.error("Error occured in http2 : " + listenerName);
}
}
/* eslint-disable no-unused-vars */
function handleHttp2StreamOrSession(actualHandler, event) {
return function (streamOrSession, header) {
try {
var tracker;
var curTxn = streamOrSession.apminsightTxn;
if (curTxn && !curTxn.isCompleted()) {
apmInsightAgentInstance.setCurContext(
streamOrSession.apminsightTxn
);
var listenerName = utils.isEmpty(actualHandler.name)
? "Anonymous"
: actualHandler.name;
var trackerName = "emit - " + event + " - " + listenerName;
var trackerInfo = { trackerName: trackerName, sync: true };
tracker = apmInsightAgentInstance.createTracker(trackerInfo);
}
var result = actualHandler.apply(this, arguments);
apmInsightAgentInstance.endTracker(tracker);
return result;
} catch (e) {
apmInsightAgentInstance.handleErrorTracker(tracker, e);
throw e;
} finally {
apmInsightAgentInstance.clearCurContext();
}
};
}
/* eslint-enable no-unused-vars */
function instrumentHttp2Stream(stream) {
http2Info.stream.forEach(function (eachFunction) {
wrapper.checkAndWrapFunction(
stream,
eachFunction,
"Http2Stream",
eachFunction.functionName
);
});
}
function instrumentHttp2Session(session) {
http2Info.session.forEach(function (eachFunction) {
wrapper.checkAndWrapFunction(
session,
eachFunction,
"Http2Session",
eachFunction.functionName
);
});
}
module.exports = {
handleHttp2Request: handleHttp2Request,
handleHttp2StreamOrSession: handleHttp2StreamOrSession
};