UNPKG

12 kBJavaScriptView Raw
1/**
2 * Created by sahil on 10/6/2015.
3 */
4
5var package_json = require('./../package.json')
6var winston = require('winston');
7var mkdirp = require('mkdirp');
8var fs = require('fs');
9var path = require('path');
10var os = require('os');
11var heapStatistics ;
12try{
13 heapStatistics= require('v8').getHeapStatistics();
14}
15catch(e){console.log("cant find module v8")}
16function util (){}
17util.logger=undefined;
18util.instrumentedModules={}; //All instrumented files from njstrace
19util.netjsagentVersion = package_json.version
20function checkAndCreateDir(logDir,os,pid,instanceName,logLevel){
21 if (!fs.existsSync(logDir)) { // Create the directory if it does not exist
22 mkdirp(logDir, function (err) {
23 });
24 }
25 /*
26 * When instance will restart we dont have instance name ,so control will move to else case and create the file name
27 * using process_id . nd_node_debug_1126.log
28 * In case we have instace name, that means contol is coming from start_instrumentation so we rename the old file name
29 * from process_id to instance name nd_node_debug_1126.log ---> nd_node_debug_svr12.log
30 * */
31
32 if (instanceName) {
33 var curr, newFile=[];
34 var dir = fs.readdirSync(logDir)
35 for (i in dir) {
36 if (dir[i].indexOf(pid) !== -1) {
37 var file = dir[i]
38 if (file.indexOf('error') > -1) {
39 if (os == 'window') {
40 curr = logDir + '\\' + file;
41 newFile[1] = logDir + '\\nd_node_error_' + instanceName + '.log'
42 fs.renameSync(curr, newFile[1])
43 }
44 else if (os == 'linux') {
45 curr = logDir + '/' + file;
46 newFile[1] = logDir + '/nd_node_error_' + instanceName + '.log'
47 fs.renameSync(curr, newFile[1])
48 }
49 }
50 else {
51 if (os == 'window') {
52 curr = logDir + '\\' + file;
53 newFile[0] = logDir + '\\nd_node_' + logLevel + '_' + instanceName + '.log'
54 fs.renameSync(curr, newFile[0])
55 }
56 else if (os == 'linux') {
57 curr = logDir + '/' + file;
58 newFile[0] = logDir + '/nd_node_' + logLevel + '_' + instanceName + '.log'
59 fs.renameSync(curr, newFile[0])
60 }
61 }
62 }
63 }
64 if(newFile.length == 0){
65 if (os == 'window')
66 return [ logDir + '\\nd_node_' + logLevel + '_' + instanceName + '.log' , logDir + '\\nd_node_error_' + instanceName + '.log'];
67 else if (os == 'linux')
68 return [logDir + '/nd_node_' + logLevel + '_' + instanceName + '.log' , logDir + '/nd_node_error_' + instanceName + '.log']
69
70 }
71 else
72 return newFile
73 }
74 else {
75 if (os == 'window')
76 return [ logDir + '\\nd_node_' + logLevel + '_' + pid + '.log' , logDir + '\\nd_node_error_' + pid + '.log'];
77 else if (os == 'linux')
78 return [logDir + '/nd_node_' + logLevel + '_' + pid + '.log' , logDir + '/nd_node_error_' + pid + '.log']
79 }
80}
81
82util.initializeLogger = function(logLevel,BCILoggingMode,instanceName,isTestRunning)
83{
84 try {
85 var machine = os.type(),
86 logDir,
87 filename;
88 if(machine.indexOf('Windows') != -1){
89 logDir='C:\\netjsagent\\logs';
90 filename = checkAndCreateDir(logDir,'window',process.pid,instanceName,logLevel)
91 //filename = logDir+'\\nd_node_'+logLevel+'_'+instanceName+'.log';
92 }
93 else if(machine.indexOf('Linux') != -1) {
94 logDir = "/tmp/cavisson/logs";
95 filename = checkAndCreateDir(logDir,'linux',process.pid,instanceName,logLevel)
96 //checkAndCreateDir(logDir,'linux')
97 //filename = logDir+'/nd_node_'+logLevel + '_'+instanceName+'.log';
98 }
99 /* if(isTestRunning) //Removing this check so when start_instrumention will come, new instance of logger will reinitialized
100 return*/
101
102 if(BCILoggingMode && BCILoggingMode.toUpperCase() == 'OUTPUT_STREAM'){
103 util.logger = new (winston.Logger)
104 ({
105 transports: [
106 new (winston.transports.Console)({
107 timestamp: function () {
108 var date = new Date();
109 return date;
110 },
111 //level: logLevel,
112 colorize: true ,
113 /*formatter: function (options) {
114 // Return string will be passed to logger.
115 return options.timestamp() + ' | ' + process.pid + ' | ' + options.level.toUpperCase() + ' | ' + (undefined !== options.message ? options.message : '') +
116 (options.meta && Object.keys(options.meta).length ? '\n\t' + JSON.stringify(options.meta) : '' );
117 }*/
118 })]
119 });
120 }
121 else if(BCILoggingMode && (BCILoggingMode.toUpperCase() == 'FILE' || BCILoggingMode.toUpperCase() == 'BOTH')){
122 util.logger = new (winston.Logger)
123 ({
124 transports: [
125 new (winston.transports.File)({
126 timestamp: function () {
127 var date = new Date();
128 return date;
129 },
130 name: 'info-file',
131 filename: filename[0], // file for both output
132 level: logLevel,
133 maxsize: 5242880, //10MB 5242880 1048570
134 maxFiles: 3,
135 json: false,
136 formatter: function (options) {
137 // Return string will be passed to logger.
138 if(BCILoggingMode && BCILoggingMode.toUpperCase() == 'BOTH') {
139 console.log(options.timestamp() + ' | ' + process.pid + ' | ' + options.level.toUpperCase() + ' | ' + (undefined !== options.message ? options.message : '') +
140 (options.meta && Object.keys(options.meta).length ? '\n\t' + JSON.stringify(options.meta) : '' ))
141 }
142 return options.timestamp() + ' | ' + process.pid + ' | ' + options.level.toUpperCase() + ' | ' + (undefined !== options.message ? options.message : '') +
143 (options.meta && Object.keys(options.meta).length ? '\n\t' + JSON.stringify(options.meta) : '' );
144 }
145 }),
146 new (winston.transports.File)({
147 timestamp: function () {
148 var date = new Date();
149 return date;
150 },
151 name: 'error-file',
152 filename: filename[1], // file only in case of error
153 level: 'warn',
154 handleExceptions: true,
155 humanReadableUnhandledException: true,
156 maxsize: 5242880, //10MB
157 maxFiles: 2,
158 json: false,
159 formatter: function (options) {
160 // Return string will be passed to logger.
161 if(BCILoggingMode &&BCILoggingMode.toUpperCase() == 'BOTH') {
162 console.error(options.timestamp() + ' | ' + process.pid + ' | ' + options.level.toUpperCase() + ' | ' + (undefined !== options.message ? options.message : '') +
163 (options.meta && Object.keys(options.meta).length ? '\n\t' + JSON.stringify(options.meta) : '' ))
164 }
165 return options.timestamp() + ' | ' + process.pid + ' | ' + options.level.toUpperCase() + ' | ' + (undefined !== options.message ? options.message : '') +
166 (options.meta && Object.keys(options.meta).length ? '\n\t' + JSON.stringify(options.meta) : '' );
167 }
168 })
169 ]
170 });
171 }
172 }
173 catch(err){console.log(err.stack)}
174
175
176 /* try
177 {
178 setInterval(function(){
179 if(!fs.existsSync('/tmp/cavisson/logs/All-log-info.log')) {
180 console.log("path node exists")
181 util.initializeLogger();
182 }
183 },40000)
184 }catch(err){console.log(err)}*/
185
186
187 /*process.on('uncaughtException', function(err) {
188 if(err) util.logger.warn(err.stack);
189 });*/
190 util.logger.info("-----------Initializing Cavisson NodeJS Agent ",util.netjsagentVersion,"------------",process.argv);
191 util.logger.error("-----------Initializing Cavisson NodeJS Agent ",util.netjsagentVersion,"------------");
192 util.logger.info('0 | command lines argument passed : ',process.argv);
193 util.logger.info('0 | heap_size_limit :',(heapStatistics ? heapStatistics.heap_size_limit/1000000000 : 0)+' GB');
194
195}
196
197util.getRequestObject = function(functionArguments)
198{
199 if(functionArguments == null)
200
201 {
202 return null;
203 }
204 else if(functionArguments.callee.caller == null)
205 {
206 return null;
207 }
208 var requestedArgument = util.checkArguments(functionArguments, "IncomingMessage");
209
210
211 if(requestedArgument.raw || requestedArgument)
212 return requestedArgument;
213
214 else
215 return util.getRequestObject(functionArguments.callee.caller.arguments);
216}
217
218util.checkArguments = function(args, type){
219 var cavisson_details_obj = new Object();
220 try {
221 if(args == undefined){
222 return;
223 }
224 for (var i = 0; i < args.length; i++) {
225
226 if(args[i] === undefined)
227 continue;
228 if (args[i].constructor.name == type) {
229 if(args[i].flowPathId) {
230 cavisson_details_obj.flowPathId = args[i].flowPathId;
231 cavisson_details_obj.timeInMillis = args[i].timeInMillis;
232 cavisson_details_obj.res = args[i].res;
233 cavisson_details_obj.req=args[i];
234 return cavisson_details_obj;
235 }
236 }
237 if(args[i].raw != undefined && args[i].raw !=null )
238 {
239 if(args[i].raw.req.flowPathId)
240 {
241 cavisson_details_obj.flowPathId = args[i].raw.req.flowPathId;
242 cavisson_details_obj.timeInMillis = args[i].raw.req.timeInMillis;
243 cavisson_details_obj.res = args[i].raw.res;
244 cavisson_details_obj.req=args[i].raw.req;
245 return cavisson_details_obj;
246 }
247
248 }
249 }
250 return false;
251 }
252 catch(err)
253 {
254 util.logger.warn("Error in checking arguments type" + err);
255 }
256
257}
258
259util.canWrite= function (directory) {
260 try {
261 var stat = fs.statSync(directory);
262
263 // 2 is the octal value for chmod -w-
264 return !!( 2 & (stat.mode & parseInt('777', 8)).toString(8)[0] ) //first char is the owner
265 }
266 catch(err){util.logger.error(err)}
267}
268
269util.canRead= function (directory) {
270 var stat = fs.statSync(directory);
271
272 // 2 is the octal value for chmod -w-
273 return !!( 1 & (stat.mode & parseInt('777', 8)).toString(8)[0] ) //first char is the owner
274}
275
276module.exports = util;