apminsight
Version:
monitor nodejs applications
95 lines (88 loc) • 3.1 kB
JavaScript
var constants = require("./../constants");
var https = require("https");
var utils = require("./../util/utils");
var logger = require("./../util/logger");
const { URL } = require('url');
function sendToCollector(uri, postData, cb) {
var config = apmInsightAgentInstance.getConfig();
var insInfo = apmInsightAgentInstance.getInsInfo();
const endPoints = config.getApmHosts();
const tryEndpoint = (index) => {
if(index >= endPoints.length){
cb(new Error('All endpoints failed'), uri);
return;
}
let fullPath = `${uri}?${constants.licenseKey}=${config.getLicenseKey()}`;
if (!utils.isEmpty(insInfo.getInstanceId())) {
fullPath += `&${constants.instance_Id}=${insInfo.getInstanceId()}`;
}
const url = new URL(endPoints[index]);
var connectInfo = {
host: url.hostname,
port: url.port || (url.protocol === 'https:' ? constants.collectorPort : constants.httpPort),
path: fullPath,
method: constants.requestMethod,
rejectUnauthorized: false,
headers: {
"Content-Type": "application/json",
"Content-Length": Buffer.byteLength(postData)
}
};
config.checkAndAddProxyAgent(connectInfo);
sendRequest(uri, connectInfo, postData, (error, uri, responseData) => {
if(error){
logger.info(`while initiating req to ${uri}, endpoint ${endPoints[index]}, failed: ${error.message} moving onto next endpoint`);
tryEndpoint(index + 1);
return;
}else{
cb(null, uri, responseData || undefined);
}
});
}
// Start with the first endpoint
tryEndpoint(0);
}
function sendRequest(uri, connectInfo, postData, cb) {
var payload = apmInsightAgentInstance.getConfig().isPrintPayloadEnabled()
? " with payload " + postData
: "";
logger.info(
"intiating " +
uri +
" request to " +
connectInfo.host +
":" +
connectInfo.port +
payload
);
var req = https.request(connectInfo, function (response) {
response.setEncoding("utf8");
var rawData = "";
response.on("data", function (chunk) {
rawData += chunk;
});
response.on("end", function () {
try {
if(response.statusCode >= 200 && response.statusCode < 300){
if (utils.isEmpty(rawData)) {
cb(false, uri);
return;
}
const responseData = JSON.parse(rawData);
cb(false, uri, responseData);
}
} catch (e) {
cb(e, uri);
}
});
});
req.on("error", function (error) {
cb(error, uri);
});
req.write(postData);
req.end();
}
module.exports = {
sendToCollector: sendToCollector,
sendRequest: sendRequest
};