whatap 0.4.98 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/conf/config-default.js +10 -3
- package/lib/conf/configure.js +12 -3
- package/lib/conf/log-config-default.js +37 -0
- package/lib/control/control-handler.js +19 -6
- package/lib/core/agent.js +10 -8
- package/lib/core/shimmer.js +98 -0
- package/lib/counter/task/agentinfo.js +1 -1
- package/lib/data/datapack-sender.js +17 -0
- package/lib/data/zipprofile.js +2 -2
- package/lib/logger.js +25 -1
- package/lib/logsink/line-log-util.js +87 -0
- package/lib/logsink/line-log.js +12 -0
- package/lib/logsink/log-sender.js +78 -0
- package/lib/logsink/log-tracer.js +40 -0
- package/lib/logsink/sender-util.js +51 -0
- package/lib/logsink/zip/zip-send.js +177 -0
- package/lib/net/paramdef.js +1 -0
- package/lib/net/security-master.js +1 -1
- package/lib/observers/global-observer.js +200 -0
- package/lib/observers/grpc-observer.js +336 -0
- package/lib/observers/http-observer.js +11 -8
- package/lib/observers/process-observer.js +55 -8
- package/lib/observers/redis-observer.js +74 -11
- package/lib/observers/socket.io-observer.js +76 -67
- package/lib/pack/event-pack.js +1 -1
- package/lib/pack/log-sink-pack.js +139 -0
- package/lib/pack/packenum.js +3 -1
- package/lib/pack/zip-pack.js +0 -1
- package/lib/topology/link.js +63 -0
- package/lib/topology/nodeinfo.js +123 -0
- package/lib/topology/status-detector.js +111 -0
- package/lib/util/compare-util.js +131 -0
- package/lib/util/linkedset.js +278 -0
- package/lib/util/oidutil.js +4 -1
- package/package.json +2 -2
|
@@ -11,7 +11,7 @@ function num(k, defValue){
|
|
|
11
11
|
};
|
|
12
12
|
function bool(k, defValue){
|
|
13
13
|
var v=process.env[k];
|
|
14
|
-
return v?
|
|
14
|
+
return v ? (v === 'true') : defValue;
|
|
15
15
|
};
|
|
16
16
|
function str(k, defValue){
|
|
17
17
|
var v=process.env[k];
|
|
@@ -154,8 +154,8 @@ var ConfigDefault = {
|
|
|
154
154
|
"httpc_not_found_ignore": bool('httpc_not_found_ignore', false),
|
|
155
155
|
"httpc_not_found_ignore_time": num('httpc_not_found_ignore', 300000),
|
|
156
156
|
"ignore_sql_error_code_set": str('ignore_sql_error_code_set', ''),
|
|
157
|
-
"
|
|
158
|
-
"
|
|
157
|
+
"ignore_build_file_enabled": bool('ignore_build_file_enabled', true),
|
|
158
|
+
"ignore_build_file_path": str('ignore_build_file_path', '/_next/'),
|
|
159
159
|
|
|
160
160
|
//2017.05.02 AUTO ONAME
|
|
161
161
|
"auto_oname_enabled" : bool('auto_oname_enabled',false),
|
|
@@ -259,6 +259,13 @@ var ConfigDefault = {
|
|
|
259
259
|
|
|
260
260
|
"stat_ipurl_enabled": bool("stat_ipurl_enabled", false),
|
|
261
261
|
"stat_ipurl_max_count": num("stat_ipurl_max_count", 10000),
|
|
262
|
+
|
|
263
|
+
"grpc_profile_enabled": bool("grpc_profile_enabled", true),
|
|
264
|
+
"grpc_profile_stream_client_enabled": bool("grpc_profile_stream_client_enabled", true),
|
|
265
|
+
"grpc_profile_stream_server_enabled": bool("grpc_profile_stream_server_enabled", true),
|
|
266
|
+
"grpc_profile_ignore_method": bool("grpc_profile_ignore_method", true),
|
|
267
|
+
|
|
268
|
+
"oname_port_postfix_enabled": bool("oname_port_postfix_enabled", false),
|
|
262
269
|
};
|
|
263
270
|
|
|
264
271
|
ConfigDefault._hook_method_ignore_prefix = ConfigDefault.hook_method_ignore_prefixes.split(',');
|
package/lib/conf/configure.js
CHANGED
|
@@ -17,6 +17,7 @@ var DataInputX = require('./../io/data-inputx'),
|
|
|
17
17
|
StringUtil = require('./../util/string-util'),
|
|
18
18
|
Cypher = require('./../util/cypher'),
|
|
19
19
|
ConfigDefault = require("./config-default"),
|
|
20
|
+
LogConfigDefault = require("./log-config-default"),
|
|
20
21
|
ConfSysMon = require('./conf-sys-mon'),
|
|
21
22
|
MapValue = require('./../value/map-value'),
|
|
22
23
|
IntKeyLinkedMap = require('./../util/intkey-linkedmap'),
|
|
@@ -27,6 +28,7 @@ var Configuration = function() {
|
|
|
27
28
|
var self = this;
|
|
28
29
|
EventEmitter.call(this);
|
|
29
30
|
this.apply(ConfigDefault);
|
|
31
|
+
this.apply(LogConfigDefault);
|
|
30
32
|
|
|
31
33
|
this.inx = 0;
|
|
32
34
|
this._customProps = {};
|
|
@@ -65,6 +67,13 @@ Configuration.prototype.reload = function(cb) {
|
|
|
65
67
|
p[key] = ConfigDefault[key];
|
|
66
68
|
}
|
|
67
69
|
});
|
|
70
|
+
var logDefKeys = Object.keys(LogConfigDefault);
|
|
71
|
+
logDefKeys.forEach(function (key) {
|
|
72
|
+
if(LogConfigDefault[key]) {
|
|
73
|
+
p[key] = LogConfigDefault[key];
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
|
|
68
77
|
if(process.env.WHATAP_SERVER_HOST){
|
|
69
78
|
p['whatap.server.host']=process.env.WHATAP_SERVER_HOST;
|
|
70
79
|
}
|
|
@@ -111,8 +120,8 @@ Configuration.prototype.reload = function(cb) {
|
|
|
111
120
|
|
|
112
121
|
oldKeys.forEach(function (key) {
|
|
113
122
|
if(newKeys.indexOf(key) < 0) {
|
|
114
|
-
if(ConfigDefault[key]
|
|
115
|
-
self[key] = ConfigDefault[key];
|
|
123
|
+
if(ConfigDefault[key] !== null || LogConfigDefault[key] !== null) {
|
|
124
|
+
self[key] = ConfigDefault[key] !== null ? ConfigDefault[key] : LogConfigDefault[key];
|
|
116
125
|
} else {
|
|
117
126
|
delete self[key];
|
|
118
127
|
}
|
|
@@ -260,7 +269,7 @@ Configuration.prototype.setProperty = function(key, value) {
|
|
|
260
269
|
this.emit(key, value);
|
|
261
270
|
};
|
|
262
271
|
Configuration.prototype.getProperty = function(key, defaultValue) {
|
|
263
|
-
if(
|
|
272
|
+
if(this[key] === undefined){
|
|
264
273
|
return defaultValue;
|
|
265
274
|
} else{
|
|
266
275
|
return this[key];
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2016 the WHATAP project authors. All rights reserved.
|
|
3
|
+
* Use of this source code is governed by a license that
|
|
4
|
+
* can be found in the LICENSE file.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
function num(k, defValue){
|
|
8
|
+
var v=process.env[k];
|
|
9
|
+
return v?Number(v):defValue;
|
|
10
|
+
};
|
|
11
|
+
function bool(k, defValue){
|
|
12
|
+
var v=process.env[k];
|
|
13
|
+
return v?Boolean(v):defValue;
|
|
14
|
+
};
|
|
15
|
+
function str(k, defValue){
|
|
16
|
+
var v=process.env[k];
|
|
17
|
+
return v?v:defValue;
|
|
18
|
+
};
|
|
19
|
+
var LogConfigDefault = {
|
|
20
|
+
"logsink_enabled": bool("logsink_enabled", false),
|
|
21
|
+
"logsink_zip_enabled": bool("logsink_zip_enabled", false),
|
|
22
|
+
"logsink_category_stdout": "AppStdOut",
|
|
23
|
+
"logsink_category_stderr": "AppStdErr",
|
|
24
|
+
"logsink_queue_size": num("logsink_queue_size", 500),
|
|
25
|
+
"logsink_limit_content_enabled": bool("logsink_limit_content_enabled", true),
|
|
26
|
+
"logsink_limit_content_length": num("logsink_limit_content_length", 10000),
|
|
27
|
+
"logsink_max_content_log_enabled": bool("logsink_max_content_log_enabled", true),
|
|
28
|
+
"logsink_max_content_alert_enabled": bool("logsink_max_content_alert_enabled", false),
|
|
29
|
+
"logsink_max_content_alert_silent_time": num("logsink_max_content_alert_silent_time", 10000),
|
|
30
|
+
"logsink_trace_txid_enabled": bool("logsink_trace_txid_enabled", true),
|
|
31
|
+
"logsink_trace_mtid_enabled": bool("logsink_trace_mtid_enabled", true),
|
|
32
|
+
"logsink_high_secure_enabled": bool("logsink_high_secure_enabled", false),
|
|
33
|
+
"debug_logsink_zip_enabled": bool("debug_logsink_zip_enabled", false),
|
|
34
|
+
"logsink_max_buffer_size": num("logsink_max_buffer_size", 1024*64),
|
|
35
|
+
"logsink_max_wait_time": num("logsink_max_wait_time", 2000)
|
|
36
|
+
};
|
|
37
|
+
module.exports = LogConfigDefault;
|
|
@@ -15,7 +15,9 @@ var PackageCtrHelper = require('./packagectr-helper'),
|
|
|
15
15
|
TextValue = require('../value/text-value'),
|
|
16
16
|
ResourceProfile = require('../util/resourceprofile'),
|
|
17
17
|
TraceContextManager = require('../trace/trace-context-manager'),
|
|
18
|
-
Logger = require('../logger')
|
|
18
|
+
Logger = require('../logger'),
|
|
19
|
+
StatusDetector = require('../topology/status-detector'),
|
|
20
|
+
BlobValue = require('../value/blob-value');
|
|
19
21
|
|
|
20
22
|
var ControlHandler = function () {
|
|
21
23
|
this.queue = new RequestQueue(100);
|
|
@@ -26,17 +28,17 @@ ControlHandler.prototype.add = function (p /* Pack */) {
|
|
|
26
28
|
this.process(p);
|
|
27
29
|
};
|
|
28
30
|
|
|
29
|
-
ControlHandler.prototype.process = function (p) {
|
|
31
|
+
ControlHandler.prototype.process = async function (p) {
|
|
30
32
|
switch (p.getPackType()) {
|
|
31
33
|
case PackEnum.PARAMETER:
|
|
32
|
-
this.handle(p);
|
|
34
|
+
await this.handle(p);
|
|
33
35
|
break;
|
|
34
36
|
default:
|
|
35
37
|
Logger.printError('WHATAP-203', 'Unknown pack received ' + p, new Error('Unknown pack'));
|
|
36
38
|
}
|
|
37
39
|
};
|
|
38
40
|
|
|
39
|
-
ControlHandler.prototype.handle = function (p) {
|
|
41
|
+
ControlHandler.prototype.handle = async function (p) {
|
|
40
42
|
var self = this;
|
|
41
43
|
if (!this._dataPackSender) {
|
|
42
44
|
this._dataPackSender = require('../data/datapack-sender');
|
|
@@ -115,7 +117,7 @@ ControlHandler.prototype.handle = function (p) {
|
|
|
115
117
|
}
|
|
116
118
|
break;
|
|
117
119
|
case ParamDef.LOADED_CLASS_REDEFINE:
|
|
118
|
-
|
|
120
|
+
self._dataPackSender.sendResponseHide(p.getResponse());
|
|
119
121
|
break;
|
|
120
122
|
case ParamDef.NODE_MODULE_DEPENDENCY:
|
|
121
123
|
|
|
@@ -181,7 +183,7 @@ ControlHandler.prototype.handle = function (p) {
|
|
|
181
183
|
var key = en.nextElement();
|
|
182
184
|
var val = mv.getText(key);
|
|
183
185
|
props[key] = val
|
|
184
|
-
}
|
|
186
|
+
}
|
|
185
187
|
Configure.saveProperty(props);
|
|
186
188
|
} catch (e) {
|
|
187
189
|
p.putValue("error", e.toString())
|
|
@@ -222,6 +224,17 @@ ControlHandler.prototype.handle = function (p) {
|
|
|
222
224
|
self._dataPackSender.sendResponseHide(p.getResponse());
|
|
223
225
|
});
|
|
224
226
|
break;
|
|
227
|
+
case ParamDef.GET_TOPOLOGY:
|
|
228
|
+
try {
|
|
229
|
+
const node = await new StatusDetector().process();
|
|
230
|
+
if (node) {
|
|
231
|
+
p.putValue("node", new BlobValue(node.toBytes()));
|
|
232
|
+
}
|
|
233
|
+
this._dataPackSender.sendResponseHide(p.getResponse());
|
|
234
|
+
} catch (e) {
|
|
235
|
+
Logger.printError('WHATAP-203', 'Node Module Dependency ', e, true);
|
|
236
|
+
}
|
|
237
|
+
break;
|
|
225
238
|
}
|
|
226
239
|
}
|
|
227
240
|
|
package/lib/core/agent.js
CHANGED
|
@@ -29,7 +29,8 @@ var Interceptor = require('./interceptor').Interceptor,
|
|
|
29
29
|
ThriftObserver = require('../observers/thrift-observer').ThriftObserver,
|
|
30
30
|
PromiseObserver = require('../observers/promise-observer').PromiseObserver,
|
|
31
31
|
PgSqlObserver = require('../observers/pgsql-observer').PgSqlObserver,
|
|
32
|
-
ScheduleObserver = require('../observers/schedule-observer').ScheduleObserver
|
|
32
|
+
ScheduleObserver = require('../observers/schedule-observer').ScheduleObserver,
|
|
33
|
+
GRpcObserver = require('../observers/grpc-observer').GRpcObserver;
|
|
33
34
|
|
|
34
35
|
var Configuration = require('./../conf/configure'),
|
|
35
36
|
SecurityMaster = require('./../net/security-master'),
|
|
@@ -102,21 +103,21 @@ NodeAgent.prototype.findRoot = function () {
|
|
|
102
103
|
};
|
|
103
104
|
NodeAgent.prototype.init = function(cb) {
|
|
104
105
|
var self = this;
|
|
105
|
-
if(self._initialized) {
|
|
106
|
-
return;
|
|
106
|
+
if(self._initialized) {
|
|
107
|
+
return;
|
|
107
108
|
}
|
|
108
109
|
self._initialized = true;
|
|
109
110
|
self.starttime = Date.now();
|
|
110
111
|
|
|
111
112
|
self.findRoot();
|
|
112
|
-
|
|
113
|
+
|
|
113
114
|
Logger.initializer.process();
|
|
114
115
|
Logger.print('WHATAP-001', 'Start initialize WhaTap Agent... Root[' + self._conf['app.root'] + ']', true);
|
|
115
116
|
|
|
116
117
|
if(self._conf['app.root'] == null || self._conf['app.root'].length == 0) {
|
|
117
118
|
return Logger.print("WHATAP-001", "Can not find application root directory", true);
|
|
118
119
|
}
|
|
119
|
-
|
|
120
|
+
|
|
120
121
|
NodeUtil.getPackageJson();
|
|
121
122
|
PackageCtrHelper.dynamicHook();
|
|
122
123
|
|
|
@@ -131,7 +132,7 @@ NodeAgent.prototype.init = function(cb) {
|
|
|
131
132
|
Logger.print("WHATAP-REQLOG" , "ReqLog Init Start !!!! " , false);
|
|
132
133
|
RequestLog.initializer.process();
|
|
133
134
|
}
|
|
134
|
-
|
|
135
|
+
|
|
135
136
|
self._securityMaster.run( function (err) {
|
|
136
137
|
if(err) {
|
|
137
138
|
Logger.printError('WHATAP-104', 'Failed to connect to whatap server', err, false);
|
|
@@ -179,7 +180,7 @@ NodeAgent.prototype.initOK = function(cb) {
|
|
|
179
180
|
self._counterManager.run();
|
|
180
181
|
PluginLoaderManager.start();
|
|
181
182
|
}
|
|
182
|
-
|
|
183
|
+
|
|
183
184
|
WhatapUtil.printWhatap();
|
|
184
185
|
self.connectCount = 0;
|
|
185
186
|
self.setLoopTime = 5000;
|
|
@@ -266,7 +267,8 @@ NodeAgent.prototype.loadObserves = function() {
|
|
|
266
267
|
observes.push(PromiseObserver);
|
|
267
268
|
observes.push(PgSqlObserver);
|
|
268
269
|
observes.push(ScheduleObserver);
|
|
269
|
-
|
|
270
|
+
// observes.push(GRpcObserver);
|
|
271
|
+
|
|
270
272
|
var packageToObserve = {};
|
|
271
273
|
observes.forEach(function(observeObj) {
|
|
272
274
|
var observe = new observeObj(agent);
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
function isFunction (funktion) {
|
|
4
|
+
return typeof funktion === 'function'
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
function defineProperty (obj, name, value) {
|
|
8
|
+
var enumerable = !!obj[name] && obj.propertyIsEnumerable(name)
|
|
9
|
+
Object.defineProperty(obj, name, {
|
|
10
|
+
configurable: true,
|
|
11
|
+
enumerable: enumerable,
|
|
12
|
+
writable: true,
|
|
13
|
+
value: value
|
|
14
|
+
})
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
var shimmer = function () {
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
var wrap = function (nodule, name, wrapper) {
|
|
21
|
+
if (!nodule || !nodule[name]) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (!wrapper) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (!isFunction(nodule[name]) || !isFunction(wrapper)) {
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
var original = nodule[name]
|
|
34
|
+
var wrapped = wrapper(original, name)
|
|
35
|
+
|
|
36
|
+
defineProperty(wrapped, '__original', original)
|
|
37
|
+
defineProperty(wrapped, '__unwrap', function () {
|
|
38
|
+
if (nodule[name] === wrapped) defineProperty(nodule, name, original)
|
|
39
|
+
})
|
|
40
|
+
defineProperty(wrapped, '__wrapped', true)
|
|
41
|
+
|
|
42
|
+
defineProperty(nodule, name, wrapped)
|
|
43
|
+
return wrapped
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function unwrap (nodule, name) {
|
|
47
|
+
if (!nodule || !nodule[name]) {
|
|
48
|
+
return
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (!nodule[name].__unwrap) {
|
|
52
|
+
} else {
|
|
53
|
+
return nodule[name].__unwrap()
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function massWrap (nodules, names, wrapper) {
|
|
58
|
+
if (!nodules) {
|
|
59
|
+
return
|
|
60
|
+
} else if (!Array.isArray(nodules)) {
|
|
61
|
+
nodules = [nodules]
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (!(names && Array.isArray(names))) {
|
|
65
|
+
return
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
nodules.forEach(function (nodule) {
|
|
69
|
+
names.forEach(function (name) {
|
|
70
|
+
wrap(nodule, name, wrapper)
|
|
71
|
+
})
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function massUnwrap (nodules, names) {
|
|
76
|
+
if (!nodules) {
|
|
77
|
+
return
|
|
78
|
+
} else if (!Array.isArray(nodules)) {
|
|
79
|
+
nodules = [nodules]
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (!(names && Array.isArray(names))) {
|
|
83
|
+
return
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
nodules.forEach(function (nodule) {
|
|
87
|
+
names.forEach(function (name) {
|
|
88
|
+
unwrap(nodule, name)
|
|
89
|
+
})
|
|
90
|
+
})
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
shimmer.wrap = wrap;
|
|
94
|
+
shimmer.unwrap = unwrap;
|
|
95
|
+
shimmer.massWrap = massWrap;
|
|
96
|
+
shimmer.massUnwrap = massUnwrap;
|
|
97
|
+
|
|
98
|
+
module.exports = shimmer;
|
|
@@ -167,6 +167,22 @@ var sendStatUserAgentPack = function(p){
|
|
|
167
167
|
return sendPack(p);
|
|
168
168
|
};
|
|
169
169
|
|
|
170
|
+
var sendLogSinkPack = function(p){
|
|
171
|
+
if (p == null)
|
|
172
|
+
return;
|
|
173
|
+
|
|
174
|
+
p.pcode = secuMaster.PCODE;
|
|
175
|
+
p.oid = secuMaster.OID;
|
|
176
|
+
p.okind=secuMaster.OKIND;
|
|
177
|
+
p.onode=secuMaster.ONODE;
|
|
178
|
+
|
|
179
|
+
if (conf.getProperty('logsink_high_secure_enabled', false)) {
|
|
180
|
+
TcpRequestMgr.add(NetFlag.SECURE_CYPHER, p);
|
|
181
|
+
}else{
|
|
182
|
+
TcpRequestMgr.add(NetFlag.SECURE_HIDE, p);
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
|
|
170
186
|
var sendEventPack = function(p){
|
|
171
187
|
return sendPack(p);
|
|
172
188
|
};
|
|
@@ -251,6 +267,7 @@ var DataPackSender = {
|
|
|
251
267
|
sendStatRemoteIpPack : sendStatRemoteIpPack,
|
|
252
268
|
sendStatRemoteIpUrlPack : sendStatRemoteIpUrlPack,
|
|
253
269
|
sendStatUserAgentPack : sendStatUserAgentPack,
|
|
270
|
+
sendLogSinkPack : sendLogSinkPack,
|
|
254
271
|
|
|
255
272
|
sendRealtimeUserPack : sendRealtimeUserPack,
|
|
256
273
|
sendEventPack : sendEventPack,
|
package/lib/data/zipprofile.js
CHANGED
|
@@ -185,12 +185,12 @@ class ZipProfile {
|
|
|
185
185
|
}
|
|
186
186
|
|
|
187
187
|
startProcessQueue() {
|
|
188
|
-
if (!this.
|
|
188
|
+
if (!this.isProcessing) {
|
|
189
189
|
this.processQueue()
|
|
190
190
|
}
|
|
191
191
|
}
|
|
192
192
|
stopProcessQueue() {
|
|
193
|
-
this.
|
|
193
|
+
this.isProcessing = false;
|
|
194
194
|
}
|
|
195
195
|
}
|
|
196
196
|
|
package/lib/logger.js
CHANGED
|
@@ -168,6 +168,12 @@
|
|
|
168
168
|
console.log('[WHATAP]Logger Error - WHATAP ROOT DIR IS NULL!!!!!!!!!');
|
|
169
169
|
return;
|
|
170
170
|
}
|
|
171
|
+
if(conf.getProperty('log_root', null)){
|
|
172
|
+
root = conf.getProperty('log_root', null);
|
|
173
|
+
if(fs.existsSync(root) == false) {
|
|
174
|
+
fs.mkdirSync(root, {recursive: true});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
171
177
|
var dir = path.join(root, 'logs');
|
|
172
178
|
if(fs.existsSync(dir) == false) {
|
|
173
179
|
fs.mkdirSync(dir);
|
|
@@ -188,8 +194,14 @@
|
|
|
188
194
|
if(conf.log_rotation_enabled === false || conf.log_enabled === false) { return; }
|
|
189
195
|
if(conf.log_keep_days <= 0) { return; }
|
|
190
196
|
|
|
197
|
+
var root = conf['app.root'];
|
|
198
|
+
if(conf.getProperty('log_root', null)){
|
|
199
|
+
root = conf.getProperty('log_root', null);
|
|
200
|
+
if(fs.existsSync(root) == false) {
|
|
201
|
+
fs.mkdirSync(root, {recursive: true});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
191
204
|
var nowUnit = DateUtil.getDateUnit(),
|
|
192
|
-
root = conf['app.root'],
|
|
193
205
|
dir = path.join(root, 'logs'),
|
|
194
206
|
log_prefix = WHATAP_CONF+"-";
|
|
195
207
|
|
|
@@ -233,6 +245,12 @@
|
|
|
233
245
|
|
|
234
246
|
|
|
235
247
|
var root = conf['app.root'];
|
|
248
|
+
if(conf.getProperty('log_root', null)){
|
|
249
|
+
root = conf.getProperty('log_root', null);
|
|
250
|
+
if(fs.existsSync(root) == false) {
|
|
251
|
+
fs.mkdirSync(root, {recursive: true});
|
|
252
|
+
}
|
|
253
|
+
}
|
|
236
254
|
if(root==null ){
|
|
237
255
|
return null;
|
|
238
256
|
}
|
|
@@ -276,6 +294,12 @@
|
|
|
276
294
|
var o = new MapValue();
|
|
277
295
|
if(conf.log_file_enabled === false ) { return o; }
|
|
278
296
|
var root = conf['app.root'];
|
|
297
|
+
if(conf.getProperty('log_root', null)){
|
|
298
|
+
root = conf.getProperty('log_root', null);
|
|
299
|
+
if(fs.existsSync(root) == false) {
|
|
300
|
+
fs.mkdirSync(root, {recursive: true});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
279
303
|
if(root==null){
|
|
280
304
|
return o;
|
|
281
305
|
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
const conf = require('../conf/configure');
|
|
2
|
+
const EventPack = require('../pack/event-pack');
|
|
3
|
+
const DataPackSender = require('../data/datapack-sender');
|
|
4
|
+
const Logger = require('../logger');
|
|
5
|
+
const EventLevel = require('../data/event-level');
|
|
6
|
+
|
|
7
|
+
class LineLogUtil {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.last_log = Date.now();
|
|
10
|
+
this.last_alert = Date.now();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
static getInstance() {
|
|
14
|
+
if (!LineLogUtil.instance) {
|
|
15
|
+
LineLogUtil.instance = new LineLogUtil();
|
|
16
|
+
}
|
|
17
|
+
return LineLogUtil.instance;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
checkLogContent(lineLog, orgContent) {
|
|
21
|
+
if (!orgContent) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const len = orgContent.length;
|
|
26
|
+
let maxLength = conf.getProperty('logsink_limit_content_length', 10000);
|
|
27
|
+
if(maxLength > 10000){
|
|
28
|
+
maxLength = 10000;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if ((conf.getProperty('logsink_limit_content_enabled', true) && len > maxLength) || len > 10000) {
|
|
32
|
+
lineLog.content = orgContent.substring(0, maxLength) + " ...(truncated)";
|
|
33
|
+
lineLog.truncated = true;
|
|
34
|
+
|
|
35
|
+
this.addTruncateTag(lineLog);
|
|
36
|
+
|
|
37
|
+
const alertMessage = lineLog.category + " truncated (len=" + len + ")";
|
|
38
|
+
this.logAndAlert(alertMessage);
|
|
39
|
+
} else {
|
|
40
|
+
lineLog.content = orgContent;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
log(message) {
|
|
45
|
+
if (!conf.getProperty('logsink_max_content_log_enabled', true)) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const now = Date.now();
|
|
50
|
+
if (now - this.last_log < conf.getProperty('logsink_max_content_log_silent_time', 60000)) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this.last_log = now;
|
|
54
|
+
Logger.print('WHATAP-101', message, false);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
alertOverflow(message) {
|
|
58
|
+
if (!conf.getProperty('logsink_max_content_alert_enabled', false)) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const now = Date.now();
|
|
63
|
+
if (now - this.last_alert < conf.getProperty('logsink_max_content_alert_silent_time', 60000)) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
this.last_alert = now;
|
|
67
|
+
|
|
68
|
+
const eventPack = new EventPack();
|
|
69
|
+
eventPack.level = EventLevel.FATAL;
|
|
70
|
+
eventPack.title = "LOG_TRUNCATED";
|
|
71
|
+
eventPack.message = "Too big Log: " + message;
|
|
72
|
+
DataPackSender.sendEventPack(eventPack);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
logAndAlert(alertMessage) {
|
|
76
|
+
this.log(alertMessage);
|
|
77
|
+
this.alertOverflow(alertMessage);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
addTruncateTag(lineLog) {
|
|
81
|
+
lineLog.tags.putString("truncated", "true");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
LineLogUtil.instance = null;
|
|
86
|
+
|
|
87
|
+
module.exports = LineLogUtil;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
var Configure = require('../conf/configure');
|
|
2
|
+
var RequestQueue = require('../util/request-queue');
|
|
3
|
+
var Logger = require('../logger');
|
|
4
|
+
var SenderUtil = require('./sender-util');
|
|
5
|
+
var conf = require("../conf/configure");
|
|
6
|
+
|
|
7
|
+
var logsink_enabled = Configure.getProperty('logsink_enabled', false);
|
|
8
|
+
var logsink_queue_size = Configure.getProperty('logsink_queue_size', 1000);
|
|
9
|
+
conf.on('logsink_enabled', function(newProperty) {
|
|
10
|
+
logsink_enabled = newProperty;
|
|
11
|
+
if (logsink_enabled) {
|
|
12
|
+
LogSender.getInstance().startProcessQueue();
|
|
13
|
+
} else {
|
|
14
|
+
LogSender.getInstance().stopProcessQueue();
|
|
15
|
+
LogSender.resetInstance();
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
class LogSender {
|
|
20
|
+
constructor() {
|
|
21
|
+
if (LogSender.instance) {
|
|
22
|
+
return LogSender.instance;
|
|
23
|
+
}
|
|
24
|
+
this.queue = new RequestQueue(logsink_queue_size);
|
|
25
|
+
this.isProcessing = false;
|
|
26
|
+
LogSender.instance = this;
|
|
27
|
+
|
|
28
|
+
if (logsink_enabled) {
|
|
29
|
+
this.startProcessQueue();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
static getInstance() {
|
|
34
|
+
if (!LogSender.instance) {
|
|
35
|
+
LogSender.instance = new LogSender();
|
|
36
|
+
}
|
|
37
|
+
return LogSender.instance;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
static resetInstance() {
|
|
41
|
+
if(LogSender.instance){
|
|
42
|
+
LogSender.instance = null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
add(log) {
|
|
47
|
+
this.queue.put(log);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async processQueue() {
|
|
51
|
+
this.isProcessing = true;
|
|
52
|
+
|
|
53
|
+
while (this.isProcessing) {
|
|
54
|
+
var log = await this.queue.get();
|
|
55
|
+
if(log){
|
|
56
|
+
try {
|
|
57
|
+
var sendUtil = new SenderUtil();
|
|
58
|
+
sendUtil.send(log);
|
|
59
|
+
} catch (error) {
|
|
60
|
+
Logger.printError('WHATAP-702', 'Error occurred during send LogSinkPack.' + error, false);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
startProcessQueue() {
|
|
68
|
+
if (!this.isProcessing) {
|
|
69
|
+
this.processQueue();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
stopProcessQueue() {
|
|
74
|
+
this.isProcessing = false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
module.exports = LogSender;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
var conf = require('../conf/configure');
|
|
2
|
+
var LineLog = require('./line-log');
|
|
3
|
+
var LineLogUtil = require('./line-log-util');
|
|
4
|
+
var LogSender = require('./log-sender');
|
|
5
|
+
var TraceContextManager = require('../trace/trace-context-manager');
|
|
6
|
+
|
|
7
|
+
var LogTracer = function () {
|
|
8
|
+
this.logSender = LogSender.getInstance();
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
LogTracer.prototype.addStdWrite = function (content, category) {
|
|
12
|
+
var lineLog = new LineLog();
|
|
13
|
+
lineLog.category = category
|
|
14
|
+
|
|
15
|
+
var lineLogUtil = LineLogUtil.getInstance();
|
|
16
|
+
lineLogUtil.checkLogContent(lineLog, content);
|
|
17
|
+
|
|
18
|
+
if(lineLog.content){
|
|
19
|
+
this.addTxTag(lineLog);
|
|
20
|
+
this.logSender.add(lineLog)
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
LogTracer.prototype.addTxTag = function (lineLog) {
|
|
25
|
+
if(!lineLog){
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
var ctx = TraceContextManager.getCurrentContext();
|
|
30
|
+
if(ctx){
|
|
31
|
+
if(conf.getProperty('logsink_trace_txid_enabled', true) && !ctx.txid.isZero()){
|
|
32
|
+
lineLog.fields.putLong('@txid', ctx.txid);
|
|
33
|
+
}
|
|
34
|
+
if(conf.getProperty('logsink_trace_mtid_enabled', true) && !ctx.mtid.isZero()){
|
|
35
|
+
lineLog.fields.putLong('@mtid', ctx.mtid);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
module.exports = LogTracer;
|