whatap 1.0.1 → 1.0.2

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.
Files changed (198) hide show
  1. package/README.md +32 -78
  2. package/lib/conf/conf-sys-mon.js +101 -0
  3. package/lib/conf/config-default.js +10 -3
  4. package/lib/conf/configure.js +369 -349
  5. package/lib/conf/license.js +1 -1
  6. package/lib/control/cmd-config.js +24 -0
  7. package/lib/control/control-handler.js +367 -0
  8. package/lib/control/packagectr-helper.js +34 -3
  9. package/lib/core/agent.js +176 -882
  10. package/lib/core/interceptor.js +6 -6
  11. package/lib/core/request-agent.js +27 -0
  12. package/lib/core/shimmer.js +82 -36
  13. package/lib/counter/counter-manager.js +79 -8
  14. package/lib/counter/meter/meter-activex.js +67 -0
  15. package/lib/counter/meter/meter-httpc.js +57 -0
  16. package/lib/counter/meter/meter-resource.js +9 -0
  17. package/lib/counter/meter/meter-service.js +168 -0
  18. package/lib/counter/meter/meter-socket.io.js +51 -0
  19. package/lib/counter/meter/meter-sql.js +71 -0
  20. package/lib/counter/meter/meter-users.js +58 -0
  21. package/lib/counter/meter.js +183 -0
  22. package/lib/counter/task/activetransaction.js +68 -17
  23. package/lib/counter/task/agentinfo.js +107 -0
  24. package/lib/{system → counter/task}/gc-action.js +27 -74
  25. package/lib/counter/task/gcstat.js +34 -0
  26. package/lib/counter/task/heapmem.js +25 -0
  27. package/lib/counter/task/httpc.js +76 -0
  28. package/lib/counter/task/metering-info.js +125 -0
  29. package/lib/counter/task/proc-cpu.js +29 -0
  30. package/lib/counter/task/realtimeuser.js +31 -0
  31. package/lib/counter/task/res/systemECSTask.js +39 -0
  32. package/lib/counter/task/res/systemKubeTask.js +53 -0
  33. package/lib/counter/task/res/util/awsEcsClientThread.js +218 -0
  34. package/lib/counter/task/res/util/linuxProcStatUtil.js +14 -0
  35. package/lib/counter/task/res-sys-cpu.js +62 -0
  36. package/lib/counter/task/service.js +202 -0
  37. package/lib/counter/task/socketio.js +30 -0
  38. package/lib/counter/task/sql.js +105 -0
  39. package/lib/counter/task/systemperf.js +43 -0
  40. package/lib/data/datapack-sender.js +289 -0
  41. package/lib/data/dataprofile-agent.js +162 -0
  42. package/lib/data/datatext-agent.js +135 -0
  43. package/lib/data/event-level.js +15 -0
  44. package/lib/data/test.js +49 -0
  45. package/lib/data/zipprofile.js +197 -0
  46. package/lib/env/constants.js +21 -0
  47. package/lib/error/error-handler.js +437 -0
  48. package/lib/io/data-inputx.js +13 -3
  49. package/lib/io/data-outputx.js +268 -206
  50. package/lib/kube/kube-client.js +144 -0
  51. package/lib/lang/text-types.js +58 -0
  52. package/lib/logger.js +6 -6
  53. package/lib/logsink/line-log-util.js +87 -0
  54. package/lib/logsink/line-log.js +12 -0
  55. package/lib/logsink/log-sender.js +78 -0
  56. package/lib/logsink/log-tracer.js +40 -0
  57. package/lib/logsink/sender-util.js +56 -0
  58. package/lib/logsink/zip/zip-send.js +177 -0
  59. package/lib/net/netflag.js +55 -0
  60. package/lib/net/receiver.js +66 -0
  61. package/lib/net/security-master.js +139 -20
  62. package/lib/net/sender.js +141 -0
  63. package/lib/net/tcp-return.js +18 -0
  64. package/lib/net/tcp-session.js +286 -0
  65. package/lib/net/tcpreq-client-proxy.js +70 -0
  66. package/lib/net/tcprequest-mgr.js +58 -0
  67. package/lib/observers/apollo-server-observer.js +33 -27
  68. package/lib/observers/cluster-observer.js +22 -0
  69. package/lib/observers/express-observer.js +215 -0
  70. package/lib/observers/file-observer.js +184 -0
  71. package/lib/observers/global-observer.js +155 -80
  72. package/lib/observers/grpc-observer.js +336 -0
  73. package/lib/observers/http-observer.js +666 -236
  74. package/lib/observers/maria-observer.js +204 -362
  75. package/lib/observers/memcached-observer.js +56 -0
  76. package/lib/observers/mongo-observer.js +317 -0
  77. package/lib/observers/mongodb-observer.js +169 -226
  78. package/lib/observers/mongoose-observer.js +518 -323
  79. package/lib/observers/mssql-observer.js +177 -418
  80. package/lib/observers/mysql-observer.js +342 -449
  81. package/lib/observers/mysql2-observer.js +396 -358
  82. package/lib/observers/net-observer.js +77 -0
  83. package/lib/observers/oracle-observer.js +559 -384
  84. package/lib/observers/pgsql-observer.js +231 -489
  85. package/lib/observers/prisma-observer.js +303 -92
  86. package/lib/observers/process-observer.js +79 -35
  87. package/lib/observers/promise-observer.js +31 -0
  88. package/lib/observers/redis-observer.js +166 -331
  89. package/lib/observers/schedule-observer.js +67 -0
  90. package/lib/observers/socket.io-observer.js +226 -187
  91. package/lib/observers/stream-observer.js +19 -0
  92. package/lib/observers/thrift-observer.js +197 -0
  93. package/lib/observers/websocket-observer.js +175 -301
  94. package/lib/pack/activestack-pack.js +55 -0
  95. package/lib/pack/apenum.js +8 -0
  96. package/lib/pack/counter-pack.js +3 -0
  97. package/lib/pack/errorsnap-pack.js +69 -0
  98. package/lib/pack/event-pack.js +54 -0
  99. package/lib/pack/hitmap-pack.js +63 -0
  100. package/lib/pack/hitmap-pack1.js +152 -0
  101. package/lib/pack/log-sink-pack.js +14 -52
  102. package/lib/pack/netstat.js +15 -0
  103. package/lib/pack/otype.js +7 -0
  104. package/lib/pack/profile-pack.js +49 -0
  105. package/lib/pack/realtimeuser-pack.js +41 -0
  106. package/lib/pack/stat-general-pack.js +96 -0
  107. package/lib/pack/staterror-pack.js +120 -0
  108. package/lib/pack/stathttpc-pack.js +66 -0
  109. package/lib/pack/stathttpc-rec.js +78 -0
  110. package/lib/pack/statremote-pack.js +46 -0
  111. package/lib/pack/statservice-pack.js +63 -0
  112. package/lib/pack/statservice-pack1.js +88 -0
  113. package/lib/pack/statservice-rec.js +292 -0
  114. package/lib/pack/statservice-rec_dep.js +151 -0
  115. package/lib/pack/statsql-pack.js +69 -0
  116. package/lib/pack/statsql-rec.js +100 -0
  117. package/lib/pack/statuseragent-pack.js +44 -0
  118. package/lib/pack/tagcount-pack.js +4 -4
  119. package/lib/pack/tagctr.js +15 -0
  120. package/lib/pack/text-pack.js +50 -0
  121. package/lib/pack/time-count.js +25 -0
  122. package/lib/pack/websocket.js +15 -0
  123. package/lib/pack/zip-pack.js +70 -0
  124. package/lib/pii/pii-item.js +31 -0
  125. package/lib/pii/pii-mask.js +174 -0
  126. package/lib/plugin/plugin-loadermanager.js +57 -0
  127. package/lib/plugin/plugin.js +75 -0
  128. package/lib/service/tx-record.js +332 -0
  129. package/lib/stat/stat-error.js +116 -0
  130. package/lib/stat/stat-httpc.js +98 -0
  131. package/lib/stat/stat-remote-ip.js +46 -0
  132. package/lib/stat/stat-remote-ipurl.js +88 -0
  133. package/lib/stat/stat-sql.js +113 -0
  134. package/lib/stat/stat-tranx.js +58 -0
  135. package/lib/stat/stat-tx-caller.js +160 -0
  136. package/lib/stat/stat-tx-domain.js +111 -0
  137. package/lib/stat/stat-tx-referer.js +112 -0
  138. package/lib/stat/stat-useragent.js +48 -0
  139. package/lib/stat/timingsender.js +76 -0
  140. package/lib/step/activestack-step.js +38 -0
  141. package/lib/step/dbc-step.js +36 -0
  142. package/lib/step/http-stepx.js +67 -0
  143. package/lib/step/message-step.js +40 -0
  144. package/lib/step/method-stepx.js +45 -0
  145. package/lib/step/resultset-step.js +40 -0
  146. package/lib/step/securemsg-step.js +44 -0
  147. package/lib/step/socket-step.js +46 -0
  148. package/lib/step/sql-stepx.js +68 -0
  149. package/lib/step/sqlxtype.js +16 -0
  150. package/lib/step/step.js +66 -0
  151. package/lib/step/stepenum.js +54 -0
  152. package/lib/topology/link.js +63 -0
  153. package/lib/topology/nodeinfo.js +123 -0
  154. package/lib/topology/status-detector.js +111 -0
  155. package/lib/trace/trace-context-manager.js +113 -25
  156. package/lib/trace/trace-context.js +21 -7
  157. package/lib/trace/trace-httpc.js +17 -11
  158. package/lib/trace/trace-sql.js +29 -21
  159. package/lib/util/anylist.js +103 -0
  160. package/lib/util/cardinality/hyperloglog.js +106 -0
  161. package/lib/util/cardinality/murmurhash.js +31 -0
  162. package/lib/util/cardinality/registerset.js +75 -0
  163. package/lib/util/errordata.js +21 -0
  164. package/lib/util/escape-literal-sql.js +5 -5
  165. package/lib/util/hashutil.js +18 -18
  166. package/lib/util/iputil_x.js +527 -0
  167. package/lib/util/keygen.js +0 -3
  168. package/lib/util/kube-util.js +73 -0
  169. package/lib/util/linkedset.js +1 -2
  170. package/lib/util/nodeutil.js +2 -1
  171. package/lib/util/paramsecurity.js +80 -0
  172. package/lib/util/pre-process.js +13 -0
  173. package/lib/util/process-seq.js +166 -0
  174. package/lib/util/property-util.js +36 -0
  175. package/lib/util/request-queue.js +70 -0
  176. package/lib/util/requestdouble-queue.js +72 -0
  177. package/lib/util/resourceprofile.js +157 -0
  178. package/lib/util/stop-watch.js +30 -0
  179. package/lib/util/system-util.js +10 -0
  180. package/lib/util/userid-util.js +57 -0
  181. package/lib/value/map-value.js +3 -2
  182. package/package.json +9 -4
  183. package/whatap.conf +1 -4
  184. package/agent/darwin/arm64/whatap_nodejs +0 -0
  185. package/agent/linux/amd64/whatap_nodejs +0 -0
  186. package/agent/linux/arm64/whatap_nodejs +0 -0
  187. package/build.txt +0 -4
  188. package/lib/observers/ioredis-observer.js +0 -294
  189. package/lib/udp/async_sender.js +0 -119
  190. package/lib/udp/index.js +0 -17
  191. package/lib/udp/packet_enum.js +0 -52
  192. package/lib/udp/packet_queue.js +0 -69
  193. package/lib/udp/packet_type_enum.js +0 -33
  194. package/lib/udp/param_def.js +0 -72
  195. package/lib/udp/udp_session.js +0 -336
  196. package/lib/util/sql-util.js +0 -178
  197. package/lib/util/trace-helper.js +0 -91
  198. package/lib/util/transfer.js +0 -58
@@ -0,0 +1,144 @@
1
+ var net = require('net'),
2
+ conf = require('../conf/configure'),
3
+ MapValue = require('../value/map-value'),
4
+ KubeUtil = require('../util/kube-util'),
5
+ StopWatch = require('../util/stop-watch'),
6
+ DataOutputX = require('../io/data-outputx'),
7
+ DataInputX = require('../io/data-inputx'),
8
+ IPUtil = require('../util/iputil'),
9
+ TcpRequestClientProxy = require('./../net/tcpreq-client-proxy'),
10
+ Logger = require('../logger'),
11
+ SecurityMaster = require('./../net/security-master');
12
+
13
+ const SLEEP_TIME = 15000;
14
+
15
+ var KubeClient = {
16
+ intervalId: undefined,
17
+ run: function(){
18
+ var self = this;
19
+ if(this.intervalId){
20
+ clearInterval(this.intervalId); this.intervalId = undefined;
21
+ }
22
+ this.intervalId = setInterval(function(){
23
+ self.process(conf.pod_name);
24
+ },SLEEP_TIME);
25
+ },
26
+
27
+ process: function(podName){
28
+ var self = this;
29
+ var p = new MapValue();
30
+
31
+ var localAddr = (IPUtil.getIp());
32
+
33
+ SecurityMaster.IP = IPUtil.stringToInt(localAddr);
34
+
35
+ p.putString("cmd", "regist");
36
+ p.putLong("pcode", SecurityMaster.PCODE);
37
+ p.putLong("oid", SecurityMaster.OID);
38
+ p.putString("oname", SecurityMaster.ONAME);
39
+
40
+ p.putString("ip", IPUtil.intToString(SecurityMaster.IP));
41
+ p.putString("hostname", require('os').hostname());
42
+ p.putBoolean("kube.micro", true);
43
+
44
+ if (podName != null) {
45
+ p.putString("pod_name", podName);
46
+ }
47
+ if (conf.OKIND != 0) {
48
+ p.putLong("okind", conf.OKIND);
49
+ p.putString("okind_name", conf.OKIND_NAME);
50
+ }
51
+ if (conf.ONODE != 0) {
52
+ p.putLong("onode", conf.ONODE);
53
+ p.putString("onode_name", conf.ONODE_NAME);
54
+ }
55
+ if (KubeUtil.container_id != null) {
56
+ p.putString("container_id", KubeUtil.container_id);
57
+ }
58
+
59
+ this.sendToMaster(p, function(){
60
+ self.sendToNode(p);
61
+ });
62
+ },
63
+
64
+ sendToNode: function(p){
65
+ var self = this;
66
+
67
+ try{
68
+ var client = new TcpRequestClientProxy("Node " + self.node_agent_ip+ ":"+self.node_agent_port);
69
+ client.open( self.node_agent_ip , self.node_agent_port, function(err, data){
70
+ client.send(new DataOutputX().writeValue(p));
71
+ }, function(err, data){
72
+ if(err || !data){
73
+ return console.log("#### errordata" , err, data);
74
+ }
75
+ var m = new DataInputX(data).readValue();
76
+
77
+ self.cpu = m.getFloat("cpu");
78
+ self.cpu_sys = m.getFloat("cpu_sys");
79
+ self.cpu_user = m.getFloat("cpu_user");
80
+ self.throttled_periods = m.getFloat("throttled_periods");
81
+ self.throttled_time = m.getFloat("throttled_time");
82
+
83
+ self.memory = m.getLong("memory");
84
+ self.failcnt = m.getLong("failcnt");
85
+ self.limit = m.getLong("limit");
86
+ self.maxUsage = m.getLong("maxUsage");
87
+
88
+ self.node_recv_time = Date.now();
89
+ self.metering = m.getFloat("metering");
90
+ });
91
+ }catch(e){
92
+ return Logger.printError("WHATAP-128", 'Failed to connect to kubernetes Node!')
93
+ }
94
+ },
95
+
96
+ sendToMaster: function(p, cb){
97
+ var self = this;
98
+ if (conf.master_agent_host == null) {
99
+ return Logger.printError("WHATAP-129", 'master_agent_host=null', e)
100
+ }
101
+
102
+ var connectOptions = {
103
+ host:
104
+ conf.master_agent_host
105
+ // 'localhost'
106
+ , port: conf.master_agent_port, agent: false
107
+ };
108
+
109
+ try{
110
+ self.auto_oname_reset = conf.auto_oname_reset;
111
+
112
+ var client = new TcpRequestClientProxy("Master " + connectOptions.host+ ":"+connectOptions.port);
113
+ client.open( connectOptions.host , connectOptions.port, function(err, data){
114
+ client.send(new DataOutputX().writeValue(p));
115
+ }, function(err, data){
116
+ if(data === undefined){
117
+ return Logger.printError('WHATAP-802', 'Are You Sure Kubernetes Container ??? (current whatap_micro_enabled=true)', new Error('No Master Whatap'), true);
118
+ }
119
+
120
+ var m = new DataInputX(data).readValue();
121
+ self.node_agent_ip = m.getText("node.agent.ip");
122
+ self.node_agent_port = m.getInt("node.agent.port");
123
+ if(cb) cb();
124
+ } );
125
+ }catch(e){
126
+ return Logger.printError("WHATAP-128", 'Failed to connect to kubernetes Master!', e)
127
+ }
128
+ },
129
+
130
+ recvNodeAddr: function(m){
131
+ var host = m['node.agent.ip'];
132
+ var port = m['node.agent.port'];
133
+
134
+ if(!host){
135
+ this.node_agent_host = host;
136
+ }
137
+
138
+ if(!port && port !== 0){
139
+ this.node_agent_port = port;
140
+ }
141
+ }
142
+ }
143
+
144
+ module.exports = KubeClient;
@@ -0,0 +1,58 @@
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
+ exports.SERVICE = 1;
8
+ exports.SQL = 2;
9
+ exports.DB_URL = 3;
10
+ exports.HTTPC_URL = 4;
11
+ exports.ERROR = 5;
12
+ exports.METHOD = 6;
13
+ exports.STACK_ELEMENTS = 7;
14
+ exports.REFERER = 8;
15
+ exports.USER_AGENT = 9;
16
+ exports.HTTPC_HOST = 10;
17
+ exports.MESSAGE = 11;
18
+ exports.CRUD = 12;
19
+ exports.ONAME = 13;
20
+ exports.COMMAND = 14;
21
+ exports.USER_AGENT_OS = 15;
22
+ exports.USER_AGENT_BROWSER = 16;
23
+ exports.CITY = 17;
24
+ exports.LOGIN = 18;
25
+ exports.SQLPARAM = 19;
26
+ exports.HTTP_DOMAIN = 20;
27
+
28
+ exports.SYS_DEVICE_ID = 21;
29
+ exports.SYS_MOUNT_POINT = 22;
30
+ exports.SYS_FILE_SYSTEM = 23;
31
+ exports.SYS_NET_DESC = 24;
32
+ exports.SYS_PROC_CMD1 = 26;
33
+ exports.SYS_PROC_CMD2 = 27;
34
+ exports.SYS_PROC_USER = 28;
35
+ exports.SYS_PROC_STATE = 29;
36
+ exports.SYS_PROC_FILENAME = 30;
37
+ exports.SM_LOG_FILE = 31;
38
+ exports.EXT_META = 32;
39
+
40
+ exports.DB_COUNTER_NAME = 41;
41
+ exports.DB_COUNTER_UNIT = 42;
42
+
43
+ exports.CW_AGENT_IP = 51;
44
+ exports.CW_MXID = 52;
45
+
46
+ exports.MTRACE_SPEC = 53;
47
+
48
+ exports.MTRACE_CALLER_URL = 54;
49
+ exports.OKIND_NAME = 57;
50
+ exports.KUBE_COUNT_NAME = 59;
51
+
52
+ exports.CONTAINER_ID= 60;
53
+ exports.PODNAME= 61;
54
+ exports.CONTAINER_IMAGE =62;
55
+ exports.ONODE_NAME = 63;
56
+ exports.CONTAINER_COMMAND=64;
57
+ exports.REPLICASETNAME = 65;
58
+ exports.NAMESPACE = 66;
package/lib/logger.js CHANGED
@@ -213,23 +213,23 @@
213
213
  for (var i = 0; i < files.length; i++) {
214
214
  var stat = fs.statSync(path.join(dir, files[i]));
215
215
  if (stat.isDirectory()) {
216
- return true;
216
+ continue;
217
217
  }
218
218
  var name = files[i];
219
219
  if (name.indexOf(log_prefix) < 0) {
220
- return true;
220
+ continue;
221
221
  }
222
222
  var x = name.lastIndexOf('.');
223
223
  if (x < 0) {
224
- return true;
224
+ continue;
225
225
  }
226
226
  var date = name.substr(log_prefix.length, (x - log_prefix.length));
227
227
  if (date.length != 8) {
228
- return true;
228
+ continue;
229
229
  }
230
- var d = DateUtil.yyyymmdd(date);
231
- var fileUnit = DateUtil.getDateUnit(d);
232
230
  try {
231
+ var d = DateUtil.yyyymmdd(date);
232
+ var fileUnit = DateUtil.getDateUnit(d);
233
233
  if (nowUnit - fileUnit > conf.log_keep_days) {
234
234
  let filePath = `${dir}/${files[i]}`;
235
235
  fs.rmSync(filePath);
@@ -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;
@@ -0,0 +1,56 @@
1
+ var conf = require('../conf/configure');
2
+ var SecurityMaster = require('../net/security-master');
3
+ var LogSinkPack = require('../pack/log-sink-pack');
4
+ var DataPackSender = require('../data/datapack-sender');
5
+ var DateUtil = require('../util/dateutil')
6
+ var ZipSend = require('./zip/zip-send');
7
+ var PiiMask = require('../pii/pii-mask')
8
+
9
+ function SenderUtil() {
10
+ this.conf = conf;
11
+ this.secu = SecurityMaster;
12
+ }
13
+
14
+ SenderUtil.prototype.send = function (log) {
15
+ const p = new LogSinkPack();
16
+ p.time = log.time;
17
+ if (!p.time) {
18
+ p.time = DateUtil.currentTime();
19
+ }
20
+ p.category = log.category;
21
+
22
+ if (this.secu.ONAME) {
23
+ p.tags.putString('oname', this.secu.ONAME);
24
+ }
25
+ if (this.conf.OKIND) {
26
+ p.tags.putString('okindName', this.conf.OKIND_NAME);
27
+ }
28
+ if (this.conf.ONODE) {
29
+ p.tags.putString('onodeName', this.conf.ONODE_NAME);
30
+ }
31
+
32
+ if (log.tags != null) {
33
+ p.tags.putAllMapValue(log.tags);
34
+ }
35
+ if (log.fields != null) {
36
+ if (p.fields == null) {
37
+ p.fields = log.fields;
38
+ } else {
39
+ p.fields.putAllMapValue(log.fields);
40
+ }
41
+ }
42
+
43
+ p.content = log.content;
44
+
45
+ if(conf.getProperty("pii_mask_logsink_enabled", false)){
46
+ // PiiMask.parseLogSink(p)
47
+ }
48
+
49
+ if(conf.getProperty('logsink_zip_enabled', false)){
50
+ ZipSend.getInstance().add(p);
51
+ }else{
52
+ DataPackSender.sendLogSinkPack(p)
53
+ }
54
+ };
55
+
56
+ module.exports = SenderUtil;
@@ -0,0 +1,177 @@
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
+ var conf = require('../../conf/configure'),
8
+ DateUtil = require('../../util/dateutil'),
9
+ RequestQueue = require('../../util/request-queue'),
10
+ DataPackSender = require('../../data/datapack-sender'),
11
+ DataOutputX = require('../../io/data-outputx'),
12
+ ZipPack = require('../../pack/zip-pack'),
13
+ Logger = require('../../logger');
14
+ var zlib = require('zlib');
15
+
16
+ var logsink_enabled = conf.getProperty('logsink_enabled', false);
17
+ var logsink_zip_enabled = conf.getProperty('logsink_zip_enabled', false);
18
+ var logsink_max_buffer_size = conf.getProperty('logsink_max_buffer_size', 1024*64);
19
+ var profile_zip_min_size = conf.getProperty('profile_zip_min_size', 100)
20
+ var logsink_queue_size = conf.getProperty('logsink_queue_size', 500);
21
+ var logsink_max_wait_time = conf.getProperty('logsink_max_wait_time', 2000);
22
+ conf.on('logsink_enabled', function(newProperty) {
23
+ logsink_enabled = newProperty;
24
+ if (logsink_enabled && logsink_zip_enabled) {
25
+ ZipSend.getInstance().startProcessQueue();
26
+ } else {
27
+ ZipSend.getInstance().stopProcessQueue();
28
+ ZipSend.resetInstance();
29
+ }
30
+ });
31
+ conf.on('logsink_zip_enabled', function(newProperty) {
32
+ logsink_zip_enabled = newProperty;
33
+ if (logsink_enabled && logsink_zip_enabled) {
34
+ ZipSend.getInstance().startProcessQueue();
35
+ } else {
36
+ ZipSend.getInstance().stopProcessQueue();
37
+ ZipSend.resetInstance();
38
+ }
39
+ });
40
+
41
+ class ZipSend {
42
+ constructor() {
43
+ if (ZipSend.instance) {
44
+ return ZipSend.instance;
45
+ }
46
+ this.queue = new RequestQueue(logsink_queue_size);
47
+ this.buffer = Buffer.alloc(0);
48
+ this.packCount = 0;
49
+ this.first_time = null;
50
+ this.isProcessing = false;
51
+ ZipSend.instance = this;
52
+
53
+ if (logsink_enabled && logsink_zip_enabled) {
54
+ this.startProcessQueue();
55
+ }
56
+ }
57
+
58
+ static getInstance() {
59
+ if (!ZipSend.instance) {
60
+ ZipSend.instance = new ZipSend();
61
+ }
62
+ return ZipSend.instance;
63
+ }
64
+
65
+ static resetInstance() {
66
+ if(ZipSend.instance){
67
+ ZipSend.instance = null;
68
+ }
69
+ }
70
+
71
+ add(p){
72
+ var ok = this.queue.put(p);
73
+ if(!ok){
74
+ DataPackSender.sendLogSinkPack(p);
75
+ }
76
+ }
77
+
78
+ // async addWait(p, waitTimeForFull) {
79
+ // var ok = this.queue.put(p);
80
+ // if (ok === false){
81
+ // if(waitTimeForFull > 0){
82
+ // while(this.queue.put(p) === false){
83
+ // await new Promise(resolve => setTimeout(resolve, waitTimeForFull));
84
+ // }
85
+ // }
86
+ // }
87
+ // }
88
+
89
+ async processQueue() {
90
+ this.isProcessing = true;
91
+ while (this.isProcessing) {
92
+ if(!logsink_enabled || !logsink_zip_enabled) {
93
+ this.isProcessing = false;
94
+ break;
95
+ }
96
+
97
+ const p = await this.queue.getByTimeout(logsink_max_wait_time);
98
+ if(p) {
99
+ await this.append(p);
100
+ }else{
101
+ await this.sendAndClear();
102
+ }
103
+ await new Promise(resolve => setTimeout(resolve, 100));
104
+ }
105
+ }
106
+
107
+ async append(p) {
108
+ var b = DataOutputX.toBytesPack(p);
109
+ this.packCount++;
110
+ this.buffer = Buffer.concat([this.buffer, b]);
111
+
112
+ if(!this.first_time){
113
+ this.first_time = p.time;
114
+ if (this.buffer.length >= logsink_max_buffer_size) {
115
+ await this.sendAndClear();
116
+ }
117
+ }else{
118
+ if(this.buffer.length >= logsink_max_buffer_size || (p.time - this.first_time) >= conf.getProperty('logsink_max_wait_time', 2000)){
119
+ await this.sendAndClear();
120
+ }
121
+ }
122
+ }
123
+
124
+ async sendAndClear() {
125
+ if(this.buffer.length === 0){ return; }
126
+
127
+ var p = new ZipPack();
128
+ p.time = DateUtil.currentTime();
129
+ p.recordCount = this.packCount;
130
+ p.records = this.buffer;
131
+
132
+ await this.doZip(p);
133
+ if(conf.getProperty('debug_logsink_zip_enabled', false)){
134
+ Logger.print('WHATAP-703', `zip status=${p.status} records=${p.recordCount} | ${this.buffer.length} => ${p.records.length}`);
135
+ }
136
+ DataPackSender.sendLogSinkPack(p);
137
+
138
+ this.buffer = Buffer.alloc(0);
139
+ this.first_time = 0;
140
+ this.packCount = 0;
141
+ }
142
+
143
+ async doZip(p){
144
+ if(p.status !== 0){ return; }
145
+ if(p.records.length < profile_zip_min_size){ return; }
146
+ p.status = 1;
147
+
148
+ try{
149
+ p.records = await this._doZip(p.records);
150
+ }catch (error) {
151
+ Logger.print('WHATAP-701', 'Error occurred during compression.' + error, false);
152
+ }
153
+ }
154
+
155
+ _doZip(data) {
156
+ return new Promise((resolve, reject) => {
157
+ zlib.gzip(data, (err, buffer) => {
158
+ if (err) {
159
+ reject(err);
160
+ } else {
161
+ resolve(buffer);
162
+ }
163
+ });
164
+ });
165
+ }
166
+
167
+ startProcessQueue() {
168
+ if (!this.isProcessing) {
169
+ this.processQueue()
170
+ }
171
+ }
172
+ stopProcessQueue() {
173
+ this.isProcessing = false;
174
+ }
175
+ }
176
+
177
+ module.exports = ZipSend;