UNPKG

apminsight

Version:

monitor nodejs applications

95 lines (88 loc) 3.1 kB
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 };