UNPKG

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
/** * 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); } };