ca-apm-probe
Version:
CA APM Node.js Agent monitors real-time health and performance of Node.js applications
133 lines (110 loc) • 4.25 kB
JavaScript
/**
* Copyright (c) 2016 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.
*/
// this module deals with fetching and providing information about node application enviroment
// - node runtime, probe and application itself
var path = require('path');
var util = require('util');
var fs = require('fs');
var os = require('os');
var logger = require('./logger');
var PACKAGE_FILE = 'package.json';
var MODULES_DIR = 'node_modules';
//how many levels up we look for package.json from given module file/directory
var DEFAULT_LOOKUP_LEVEL = 5;
var probePackage = null;
function readMainModulePackage() {
return readPackage(findPackageFile(process.mainModule.filename));
}
function readPackage(jsonPath) {
try {
var json = fs.readFileSync(jsonPath, 'utf8');
return JSON.parse(json);
} catch (err) {
}
return null;
}
function findPackageFile(mainFilePath, level) {
var parentDir = path.dirname(mainFilePath);
var jsonFilePath = path.resolve(parentDir, PACKAGE_FILE);
var stat;
try {
stat = fs.statSync(jsonFilePath);
}
catch (err) {
}
if (stat && stat.isFile()) {
return jsonFilePath;
} else {
if (level === null || level === undefined) {
level = DEFAULT_LOOKUP_LEVEL;
}
if ((parentDir && path.basename(parentDir) === MODULES_DIR) || level <= 0) {
return null;
} else {
return findPackageFile(parentDir, --level);
}
}
}
function getPlatformInfo() {
return util.inspect({
"platform": os.platform(),
"type": os.type(),
"arch": os.arch()
});
}
function getProbePackage() {
if (!probePackage) {
probePackage = readPackage(path.join(__dirname, '../' + PACKAGE_FILE));
}
return probePackage;
};
module.exports.getPlatformInfo = getPlatformInfo;
module.exports.getProbePackage = getProbePackage;
module.exports.getMainModulePackage = readMainModulePackage;
module.exports.findPackageFile = findPackageFile;
module.exports.log = function () {
try {
//platform information
logger.debug('platform information:\n %s', getPlatformInfo());
logger.debug('process command line arguments:\n %s', util.inspect(process.argv));
//version information
logger.debug('node and its dependencies version information:\n %s', util.inspect(process.versions));
var probePkg = getProbePackage();
logger.debug('ca apm probe package information: %s', util.inspect({
"name": probePkg.name,
"version": probePkg.version
}));
var mainMod = process.mainModule;
if (mainMod) {
var mainPackage = readMainModulePackage();
if (mainPackage) {
var info = {
"name": mainPackage.name, "version": mainPackage.version, "path": mainMod.filename
, "dependencies": mainPackage.dependencies
};
logger.debug('main module information:\n %s', util.inspect(info));
}
else {
logger.debug('main module id: %s, path: %s', mainMod.id, mainMod.filename);
}
}
} catch (err) {
var message = err.toString() || err.message || '';
logger.debug("noticed error: '%s'", message);
}
};