ca-apm-probe
Version:
CA APM Node.js Agent monitors real-time health and performance of Node.js applications
100 lines (81 loc) • 3.51 kB
JavaScript
/**
* Copyright (c) 2015 CA. All rights reserved.
*
* This software and all information contained therein is confidential and proprietary and
* shall not be duplicated, used, disclosed or disseminated in any way except as authorized
* by the applicable license agreement, without the express written permission of CA. All
* authorized reproductions must be marked with this language.
*
* EXCEPT AS SET FORTH IN THE APPLICABLE LICENSE AGREEMENT, TO THE EXTENT
* PERMITTED BY APPLICABLE LAW, CA PROVIDES THIS SOFTWARE WITHOUT WARRANTY
* OF ANY KIND, INCLUDING WITHOUT LIMITATION, ANY IMPLIED WARRANTIES OF
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL CA BE
* LIABLE TO THE END USER OR ANY THIRD PARTY FOR ANY LOSS OR DAMAGE, DIRECT OR
* INDIRECT, FROM THE USE OF THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, LOST
* PROFITS, BUSINESS INTERRUPTION, GOODWILL, OR LOST DATA, EVEN IF CA IS
* EXPRESSLY ADVISED OF SUCH LOSS OR DAMAGE.
*/
var config = require('../config.json');
var path = require('path');
var util = require('./utils/common-utils');
var probeName = null;
var buffer = {info: [], debug: []};
function initialize(options){
buffer.debug.push("options available before resolving ProbeName: " + JSON.stringify(options));
var probeName = [];
// Step 1: agent name from env variable
probeName[0] = process.env.CA_APM_PROBENAME || process.env.APM_ENV_PROBENAME;
buffer.debug.push("Step 1: env= "+probeName[0]);
// Step 2: agent name from user specified env variable
var key = config.probeNameEnvKey;
probeName[1] = process.env[key];
buffer.debug.push("Step 2: env= "+probeName[1]);
// Step 3: agent name from application code
probeName[2] = options.probeName;
buffer.debug.push("Step 3: code= "+probeName[2]);
// Step 4: agent name from ca-apm-probe config.json
probeName[3] = util.resolveEnv(config.probeName);
buffer.debug.push("Step 4: probe config.json= "+ probeName[3]);
// Step 5: agent name from application mainModule package.json, if it exists
var appScriptFilename = process.mainModule.filename;
if (options.appScriptName) {
appScriptFilename = options.appScriptName;
}
var appPackage;
try {
appPackage = require(path.join(path.dirname(appScriptFilename),'package.json'));
} catch (error) {
}
if (appPackage) {
probeName[4] = appPackage.name;
if(appPackage.dependencies) {
var appVersions = JSON.stringify(appPackage.dependencies);
options.appVersions = appVersions;
}
}
buffer.debug.push("Step 5: app package.json= "+ probeName[4]);
// Step 6: agent name from application start script
probeName[5] = path.basename(appScriptFilename, '.js');
buffer.debug.push("Step 6: script= " + probeName[5]);
// Step 7: agent name from application start dir
probeName[6] = path.dirname(appScriptFilename).split(path.sep).slice(-1)[0];
buffer.debug.push("Step 7: dir= " + probeName[6]);
for (var i = 0; i < probeName.length; i++) {
if (probeName[i] && probeName[i].length > 0 && probeName[i] != 'index') {
buffer.info.push("ProbeName Detection choosing the name: "+ probeName[i]);
return probeName[i];
}
};
// Final hardcoded fallback, we should never get here.
return 'NodeApplication';
}
function setProbeName(probeNameArg) {
probeName = probeNameArg;
}
function getProbeName() {
return probeName;
}
function getBuffer() {
return buffer;
}
module.exports = {initialize: initialize, setProbeName: setProbeName, getProbeName: getProbeName, getBuffer: getBuffer};