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.
@@ -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?Boolean(v):defValue;
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
- "ignore_nextjs_build_file_enabled": bool('ignore_nextjs_build_file_enabled', true),
158
- "ignore_nextjs_build_file_path": str('ignore_nextjs_build_file_path', '/_next/'),
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(',');
@@ -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] != null) {
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(!this[key]){
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
- self._dataPackSender.sendResponseHide(p.getResponse());
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;
@@ -96,7 +96,7 @@ AgentInfo.prototype.checkAutoScaleIn = function() {
96
96
  var e = new EventPack();
97
97
  e.title = "SILENT_SHUTDOWN";
98
98
  e.level = EventLevel.INFO;
99
- DataPackSender.send(e);
99
+ DataPackSender.sendPack(e);
100
100
  }
101
101
  }
102
102
 
@@ -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,
@@ -185,12 +185,12 @@ class ZipProfile {
185
185
  }
186
186
 
187
187
  startProcessQueue() {
188
- if (!this.processing) {
188
+ if (!this.isProcessing) {
189
189
  this.processQueue()
190
190
  }
191
191
  }
192
192
  stopProcessQueue() {
193
- this.processing = false;
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,12 @@
1
+ const MapValue = require('../value/map-value');
2
+
3
+ var LineLog = function () {
4
+ this.truncated;
5
+ this.time;
6
+ this.category;
7
+ this.tags = new MapValue();
8
+ this.fields = new MapValue();
9
+ this.content;
10
+ }
11
+
12
+ module.exports = LineLog;
@@ -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;