whatap 0.4.78 → 0.4.80

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 (216) hide show
  1. package/.vscode/keep-context.json +3 -3
  2. package/README.md +51 -51
  3. package/bindings/darwin/x64/whatap.node +0 -0
  4. package/bindings/linux/ia32/whatap.node +0 -0
  5. package/bindings/linux/x64/whatap.node +0 -0
  6. package/help.txt +10 -10
  7. package/index.js +8 -8
  8. package/lib/conf/conf-sys-mon.js +100 -100
  9. package/lib/conf/config-default.js +238 -238
  10. package/lib/conf/configure.js +423 -423
  11. package/lib/conf/license.js +41 -41
  12. package/lib/control/cmd-config.js +23 -23
  13. package/lib/control/control-handler.js +344 -344
  14. package/lib/control/packagectr-helper.js +149 -149
  15. package/lib/core/agent.js +329 -328
  16. package/lib/core/interceptor.js +142 -142
  17. package/lib/core/request-agent.js +26 -26
  18. package/lib/counter/counter-manager.js +127 -127
  19. package/lib/counter/meter/meter-activex.js +66 -66
  20. package/lib/counter/meter/meter-httpc.js +57 -57
  21. package/lib/counter/meter/meter-resource.js +9 -9
  22. package/lib/counter/meter/meter-service.js +167 -167
  23. package/lib/counter/meter/meter-socket.io.js +50 -50
  24. package/lib/counter/meter/meter-sql.js +70 -70
  25. package/lib/counter/meter/meter-users.js +57 -57
  26. package/lib/counter/meter.js +183 -183
  27. package/lib/counter/task/activetransaction.js +93 -93
  28. package/lib/counter/task/agentinfo.js +105 -105
  29. package/lib/counter/task/counter-task.js +9 -9
  30. package/lib/counter/task/gcstat.js +34 -34
  31. package/lib/counter/task/heapmem.js +24 -24
  32. package/lib/counter/task/httpc.js +75 -75
  33. package/lib/counter/task/proc-cpu.js +28 -28
  34. package/lib/counter/task/realtimeuser.js +30 -30
  35. package/lib/counter/task/res/systemECSTask.js +54 -54
  36. package/lib/counter/task/res/systemKubeTask.js +52 -52
  37. package/lib/counter/task/res/util/awsEcsClientThread.js +166 -166
  38. package/lib/counter/task/res/util/linuxProcStatUtil.js +13 -13
  39. package/lib/counter/task/res-sys-cpu.js +61 -61
  40. package/lib/counter/task/service.js +201 -201
  41. package/lib/counter/task/socketio.js +29 -29
  42. package/lib/counter/task/sql.js +104 -104
  43. package/lib/counter/task/systemperf.js +42 -42
  44. package/lib/data/datapack-sender.js +256 -256
  45. package/lib/data/dataprofile-agent.js +136 -136
  46. package/lib/data/datatext-agent.js +135 -135
  47. package/lib/data/event-level.js +15 -15
  48. package/lib/data/test.js +48 -48
  49. package/lib/env/constants.js +20 -20
  50. package/lib/kube/kube-client.js +143 -143
  51. package/lib/lang/text-types.js +58 -58
  52. package/lib/logger.js +319 -319
  53. package/lib/net/netflag.js +54 -54
  54. package/lib/net/paramdef.js +40 -40
  55. package/lib/net/receiver.js +65 -65
  56. package/lib/net/security-master.js +182 -173
  57. package/lib/net/sender.js +140 -140
  58. package/lib/net/tcp-return.js +17 -17
  59. package/lib/net/tcp-session.js +285 -285
  60. package/lib/net/tcpreq-client-proxy.js +69 -69
  61. package/lib/net/tcprequest-mgr.js +57 -57
  62. package/lib/observers/cluster-observer.js +21 -21
  63. package/lib/observers/express-observer.js +214 -214
  64. package/lib/observers/file-observer.js +184 -184
  65. package/lib/observers/global-observer.js +30 -30
  66. package/lib/observers/http-observer.js +704 -704
  67. package/lib/observers/maria-observer.js +382 -382
  68. package/lib/observers/memcached-observer.js +55 -55
  69. package/lib/observers/mongo-observer.js +262 -265
  70. package/lib/observers/mongodb-observer.js +197 -197
  71. package/lib/observers/mongoose-observer.js +83 -83
  72. package/lib/observers/mssql-observer.js +205 -205
  73. package/lib/observers/mysql-observer.js +436 -394
  74. package/lib/observers/net-observer.js +72 -72
  75. package/lib/observers/pgsql-observer.js +295 -295
  76. package/lib/observers/process-observer.js +25 -25
  77. package/lib/observers/promise-observer.js +31 -31
  78. package/lib/observers/redis-observer.js +156 -109
  79. package/lib/observers/schedule-observer.js +66 -66
  80. package/lib/observers/socket.io-observer.js +54 -54
  81. package/lib/observers/stream-observer.js +19 -19
  82. package/lib/observers/thrift-observer.js +196 -196
  83. package/lib/pack/activestack-pack.js +54 -54
  84. package/lib/pack/counter-pack.js +649 -649
  85. package/lib/pack/errorsnap-pack.js +68 -68
  86. package/lib/pack/event-pack.js +53 -53
  87. package/lib/pack/hitmap-pack.js +62 -62
  88. package/lib/pack/hitmap-pack1.js +146 -146
  89. package/lib/pack/netstat.js +14 -14
  90. package/lib/pack/pack.js +49 -49
  91. package/lib/pack/packenum.js +60 -60
  92. package/lib/pack/param-pack.js +213 -213
  93. package/lib/pack/profile-pack.js +48 -48
  94. package/lib/pack/realtimeuser-pack.js +40 -40
  95. package/lib/pack/stat-general-pack.js +95 -95
  96. package/lib/pack/staterror-pack.js +119 -119
  97. package/lib/pack/stathttpc-pack.js +66 -66
  98. package/lib/pack/stathttpc-rec.js +78 -78
  99. package/lib/pack/statremote-pack.js +45 -45
  100. package/lib/pack/statservice-pack.js +62 -62
  101. package/lib/pack/statservice-pack1.js +87 -87
  102. package/lib/pack/statservice-rec.js +292 -292
  103. package/lib/pack/statservice-rec_dep.js +151 -151
  104. package/lib/pack/statsql-pack.js +69 -69
  105. package/lib/pack/statsql-rec.js +100 -100
  106. package/lib/pack/statuseragent-pack.js +43 -43
  107. package/lib/pack/tagcount-pack.js +398 -398
  108. package/lib/pack/tagctr.js +14 -14
  109. package/lib/pack/text-pack.js +49 -49
  110. package/lib/pack/time-count.js +25 -25
  111. package/lib/pack/websocket.js +14 -14
  112. package/lib/plugin/plugin-loadermanager.js +56 -56
  113. package/lib/plugin/plugin.js +75 -75
  114. package/lib/requestlog.js +326 -326
  115. package/lib/service/tx-record.js +288 -284
  116. package/lib/stat/stat-error.js +116 -116
  117. package/lib/stat/stat-httpc.js +97 -97
  118. package/lib/stat/stat-remoteip.js +46 -46
  119. package/lib/stat/stat-sql.js +112 -112
  120. package/lib/stat/stat-tranx.js +57 -57
  121. package/lib/stat/stat-tx-caller.js +159 -159
  122. package/lib/stat/stat-tx-domain.js +110 -110
  123. package/lib/stat/stat-tx-referer.js +111 -111
  124. package/lib/stat/stat-useragent.js +48 -48
  125. package/lib/stat/timingsender.js +72 -72
  126. package/lib/step/activestack-step.js +37 -37
  127. package/lib/step/dbc-step.js +35 -35
  128. package/lib/step/http-stepx.js +66 -66
  129. package/lib/step/message-step.js +39 -39
  130. package/lib/step/method-stepx.js +46 -46
  131. package/lib/step/resultset-step.js +39 -39
  132. package/lib/step/securemsg-step.js +43 -43
  133. package/lib/step/socket-step.js +46 -46
  134. package/lib/step/sql-stepx.js +67 -67
  135. package/lib/step/sqlxtype.js +15 -15
  136. package/lib/step/step.js +65 -65
  137. package/lib/step/stepenum.js +53 -53
  138. package/lib/trace/local-context.js +13 -13
  139. package/lib/trace/parsed-sql.js +13 -13
  140. package/lib/trace/profile-collector.js +70 -70
  141. package/lib/trace/serviceurl-pattern-detector.js +117 -117
  142. package/lib/trace/trace-context-manager.js +195 -195
  143. package/lib/trace/trace-context.js +134 -134
  144. package/lib/util/anylist.js +102 -102
  145. package/lib/util/array-util.js +100 -100
  146. package/lib/util/bitutil.js +27 -27
  147. package/lib/util/cardinality/hyperloglog.js +105 -105
  148. package/lib/util/cardinality/murmurhash.js +31 -31
  149. package/lib/util/cardinality/registerset.js +74 -74
  150. package/lib/util/config-util.js +17 -17
  151. package/lib/util/cypher.js +89 -89
  152. package/lib/util/datetimehelper.js +237 -229
  153. package/lib/util/dateutil.js +110 -106
  154. package/lib/util/errordata.js +20 -20
  155. package/lib/util/escape-literal-sql.js +342 -342
  156. package/lib/util/hashutil2.js +126 -126
  157. package/lib/util/hexa32.js +57 -57
  158. package/lib/util/index.js +78 -78
  159. package/lib/util/intint-map.js +47 -47
  160. package/lib/util/intkey-linkedmap.js +26 -26
  161. package/lib/util/intkey-map.js +25 -25
  162. package/lib/util/intset.js +82 -82
  163. package/lib/util/iputil.js +119 -119
  164. package/lib/util/iputil_x.js +526 -526
  165. package/lib/util/keygen.js +17 -17
  166. package/lib/util/kube-util.js +72 -72
  167. package/lib/util/longint-linkedmap.js +35 -35
  168. package/lib/util/longkey-linkedmap.js +25 -25
  169. package/lib/util/longlong-linkedmap.js +37 -37
  170. package/lib/util/nodeutil.js +67 -67
  171. package/lib/util/oidutil.js +96 -93
  172. package/lib/util/paramsecurity.js +78 -78
  173. package/lib/util/pathtree.js +172 -172
  174. package/lib/util/pre-process.js +13 -13
  175. package/lib/util/process-seq.js +165 -165
  176. package/lib/util/property-util.js +35 -35
  177. package/lib/util/request-queue.js +42 -42
  178. package/lib/util/requestdouble-queue.js +72 -72
  179. package/lib/util/resourceprofile.js +156 -156
  180. package/lib/util/seedrandom.js +242 -242
  181. package/lib/util/stop-watch.js +29 -29
  182. package/lib/util/string-util.js +9 -9
  183. package/lib/util/stringkey-linkedmap.js +28 -28
  184. package/lib/util/stringnum-linkedmap.js +31 -31
  185. package/lib/util/stringset.js +65 -65
  186. package/lib/util/system-util.js +9 -9
  187. package/lib/util/userid-util.js +57 -57
  188. package/lib/util/utils.js +67 -67
  189. package/lib/value/blob-value.js +61 -61
  190. package/lib/value/boolean-value.js +51 -51
  191. package/lib/value/decimal-value.js +71 -71
  192. package/lib/value/double-summary.js +105 -105
  193. package/lib/value/double-value.js +50 -50
  194. package/lib/value/float-array.js +59 -59
  195. package/lib/value/float-value.js +64 -64
  196. package/lib/value/int-array.js +59 -59
  197. package/lib/value/int-map-value.js +151 -151
  198. package/lib/value/int-value.js +64 -64
  199. package/lib/value/ip4-value.js +83 -83
  200. package/lib/value/list-value.js +136 -136
  201. package/lib/value/long-array.js +59 -59
  202. package/lib/value/long-summary.js +105 -105
  203. package/lib/value/map-value.js +175 -175
  204. package/lib/value/metric-value.js +157 -157
  205. package/lib/value/null-value.js +42 -42
  206. package/lib/value/number-value.js +34 -34
  207. package/lib/value/summary-value.js +29 -29
  208. package/lib/value/text-array.js +117 -117
  209. package/lib/value/text-value.js +59 -59
  210. package/lib/value/texthash-value.js +49 -49
  211. package/lib/value/value.js +14 -14
  212. package/lib/value/valueenum.js +99 -99
  213. package/logs/whatap-20230906.log +54 -0
  214. package/package.json +28 -28
  215. package/whatap.conf +1 -1
  216. package/logs/whatap-20230616.log +0 -13
package/lib/requestlog.js CHANGED
@@ -1,327 +1,327 @@
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
- var WHATAP_CONF = 'reqlog';
7
-
8
- var conf = require('./conf/configure'),
9
- DateUtil = require('./util/dateutil'),
10
- IPUtil = require('./util/iputil'),
11
- path = require('path'),
12
- fs = require('fs'),
13
- LOGGER = require('./logger');
14
-
15
- var PID=process.pid;
16
-
17
- var initializer = {
18
- last : DateUtil.currentTime(),
19
- lastDateUnit : DateUtil.getDateUnit(),
20
- lastFileRotation : true,
21
- reset : function () {
22
- if(RequestLog.printWriter) RequestLog.printWriter.close();
23
- RequestLog.logfile = null;
24
- RequestLog.openFile();
25
- },
26
- process : function () {
27
- conf = require('./conf/configure');
28
- var now = DateUtil.currentTime();
29
- if(now > this.last + DateUtil.MILLIS_PER_HOUR) {
30
- this.last = now;
31
- RequestLog.clearOldLog();
32
- }
33
- if(this.lastFileRotation !== conf.reqlog_rotation_enabled
34
- || this.lastDateUnit !== DateUtil.getDateUnit()
35
- || (RequestLog.logfile !== null && fs.existsSync(RequestLog.logfile) == false)) {
36
- try {
37
- if(RequestLog.printWriter){
38
- RequestLog.printWriter.close();
39
- }
40
- RequestLog.logfile = null;
41
- this.lastFileRotation = conf.reqlog_rotation_enabled;
42
- this.lastDateUnit = DateUtil.getDateUnit();
43
- } catch(e) {
44
- console.log(e);
45
- }
46
- }
47
- try {
48
- RequestLog.openFile();
49
- } catch(e) {
50
- console.log(e);
51
- return false;
52
- }
53
- return true;
54
- }
55
- };
56
-
57
- var RequestLog = {
58
- ONAME : null,
59
- logfile : null,
60
- lastLog : {},
61
- printWriter : null,
62
- setRecord : async function (ctx) {
63
- try{
64
- if(this.printWriter != null) {
65
- this.buildRecord(ctx).then(e => {
66
- this.printWriter.write(e + '\n');
67
- }).catch((err)=> {
68
- LOGGER.printError('[WHATAP-LOG]' ,'setRecord_1' , err , false);
69
- });
70
- } else {
71
- this.openFile();
72
- }
73
- } catch (e){
74
- LOGGER.printError('[WHATAP-LOG]' ,'setRecord_2' , err , false);
75
- }
76
- },
77
- checkOk : function (id, sec) {
78
- if(Object.keys(RequestLog.lastLog).length >= 1000) {
79
- RequestLog.lastLog = {};
80
- }
81
-
82
- if(sec > 0) {
83
- var last = RequestLog.lastLog[id];
84
- if(last == null) {
85
- last = 0;
86
- }
87
- var now = Date.now();
88
- if(now < last + sec * 1000) {
89
- return false;
90
- }
91
- RequestLog.lastLog[id] = now;
92
- }
93
- return true;
94
- },
95
- buildRecord : async function (ctx) {
96
- var str = '';
97
- let seperator = conf.reqlog_seperator;
98
- str += "stime=" + ctx.start_time;
99
- if (conf.reqlog_x_etime) {
100
- str += seperator + "etime=" + ctx.endTime;
101
- }
102
- if (conf.reqlog_x_elapsed) {
103
- str += seperator + "elapsed=" + ctx.elapsed;
104
- }
105
- if (conf.reqlog_x_url) {
106
- str += seperator + "url=" + ctx.service_name;
107
- }
108
- if (conf.reqlog_x_httphost && ctx.http_host!=null) {
109
- str += seperator + "httphost=" + ctx.http_host;
110
- }
111
- if (conf.reqlog_x_method) {
112
- str += seperator + "method=" + ctx.http_method;
113
- }
114
- if (conf.reqlog_x_ip && ctx.remoteIp != 0) {
115
- str += seperator + "ip=" + IPUtil.intToString(ctx.remoteIp);
116
- }
117
- if (conf.reqlog_x_status) {
118
- str += seperator + "status=" + ctx.status;
119
- }
120
- /*
121
- if (conf.reqlog_x_wcid && x.wclientId != 0) {
122
- str += seperator + "wcid=" + x.wclientId;
123
- }
124
- */
125
- if (conf.reqlog_x_login && ctx.login != null) {
126
- str += seperator + "login=" + ctx.login;
127
- }
128
-
129
- if (conf.reqlog_x_error && ctx.error != null && ctx.statusMessage !== undefined) {
130
- str += seperator + "errMsg=" + ctx.statusMessage;
131
- }
132
- if (conf.reqlog_x_useragent) {
133
- str += seperator + "userAgent=" + ctx.userAgentString;
134
- }
135
- if (conf.reqlog_x_txid) {
136
- str += seperator + "txid=" + ctx.txid;
137
- }
138
- if (ctx.custid != null) {
139
- if (conf.reqlog_x_custid) {
140
- str += seperator + "custid=" + ctx.custid;
141
- } else if (conf.reqlog_x_gtid) {
142
- str += seperator + "gtid=" + ctx.custid;
143
- }
144
- }
145
- if (conf.reqlog_x_mtid && ctx.mtid != 0) {
146
- str += seperator + "mtid=" + ctx.mtid;
147
- if (conf.reqlog_x_mdepth) {
148
- str += seperator + "mdepth=" + ctx.mdepth;
149
- }
150
- }
151
- /*
152
- if (conf.reqlog_x_dbc && x.dbc_time > 0) {
153
- str += seperator + "dbcTime=" + x.dbc_time;
154
- }
155
- */
156
- if (conf.reqlog_x_sql && ctx.sql_count > 0) {
157
- str += seperator + "sqlCnt=" + ctx.sql_count;
158
- str += seperator + "sqlTime=" + ctx.sql_time;
159
- }
160
- if (conf.reqlog_x_httpc && ctx.httpc_count > 0) {
161
- str += seperator + "httpCallCnt=" + ctx.httpc_count;
162
- str += seperator + "httpCallTime=" + ctx.httpc_time;
163
- }
164
- if (conf.reqlog_x_rs && ctx.rs_count > 0) {
165
- str += seperator + "rsCnt=" + ctx.rs_count;
166
- str += seperator + "rsTime=" + ctx.rs_time;
167
- }
168
-
169
- return str;
170
- },
171
- openFile : function () {
172
- if(conf.log_file_enabled === false ) { return; }
173
- var log_prefix = WHATAP_CONF+"-";
174
-
175
- var root = conf['app.root'];
176
- if(root==null || root ==undefined){
177
- console.log('[WHATAP]RequestLog Error - WHATAP ROOT DIR IS NULL!!!!!!!!!');
178
- return;
179
- }
180
- var dir = path.join(root, 'logs');
181
- if(fs.existsSync(dir) == false) {
182
- fs.mkdirSync(dir);
183
- }
184
-
185
- if(conf.reqlog_rotation_enabled) {
186
- var file = path.join(dir, log_prefix + DateUtil.yyyymmdd() + '.log');
187
- this.logfile = file;
188
- this.printWriter = fs.createWriteStream(file, {flags : 'a'});
189
- } else {
190
- var file = path.join(dir, 'reqlog.log');
191
- this.logfile = file;
192
- this.printWriter = fs.createWriteStream(file, {flags : 'a'});
193
- }
194
-
195
- },
196
- clearOldLog : function () {
197
- if(conf.reqlog_rotation_enabled === false || conf.reqlog_enabled === false) { return; }
198
- if(conf.reqlog_keep_days <= 0) { return; }
199
-
200
- var nowUnit = DateUtil.getDateUnit(),
201
- root = conf['app.root'],
202
- dir = path.join(root, 'logs'),
203
- log_prefix = WHATAP_CONF+"-";
204
-
205
- fs.readdir(dir, function (err, files) {
206
-
207
- for(var i=0; i<files.length; i++) {
208
- var stat = fs.statSync(path.join(dir, files[i]));
209
- if(stat.isDirectory()) {
210
- return true;
211
- }
212
- var name = files[i];
213
- if(name.indexOf(log_prefix) < 0) {
214
- return true;
215
- }
216
- var x = name.lastIndexOf('.');
217
- if(x < 0) {
218
- return true;
219
- }
220
- var date = name.substr(log_prefix.length + 1, (x - log_prefix.length - 1));
221
- if(date.length != 8) {
222
- return true;
223
- }
224
- var d = DateUtil.yyyymmdd(date);
225
- var fileUnit = DateUtil.getDateUnit(d);
226
- try {
227
- if (nowUnit - fileUnit > conflog_keep_days) {
228
- fs.unlinkSync(path.join(dir, files[i]));
229
- }
230
- } catch (e) { }
231
- }
232
-
233
- });
234
- },
235
- read : function( file, endpos, length , callback) {
236
-
237
- if ( file == null || length === 0)
238
- return null;
239
- if (file.startsWith(WHATAP_CONF) == false) return null;
240
-
241
- var root = conf['app.root'];
242
- if(root==null ){
243
- return null;
244
- }
245
- var dir = path.join(root, 'logs');
246
- var fileFullPath = path.join(dir, file);
247
-
248
- if(fs.existsSync(fileFullPath) == false) {
249
- return null;
250
- }
251
- const stats = fs.statSync(fileFullPath);
252
-
253
- if (endpos < 0) {
254
- endpos = stats.size;
255
- }
256
-
257
- var start = Math.max(0, endpos - length);
258
-
259
- if ( stats.size < start)
260
- return null;
261
-
262
- var available = stats.size - start;
263
- var readable = Math.min(available, length);
264
- var next=-1;
265
- var buffer = Buffer.alloc(readable);
266
- fs.open(fileFullPath, 'r', function (err, fd) {
267
- fs.read(fd, buffer, 0, buffer.length, start,function(e,l,b){
268
- next = endpos + l;
269
- if (next > stats.size) {
270
- next = -1;
271
- }
272
- callback(start, next,b.toString("utf8",0,l)) ;
273
- });
274
- fs.close(fd);
275
- });
276
-
277
- },
278
- getLogFiles : function () {
279
- var MapValue = require('./value/map-value');
280
- var log_prefix = WHATAP_CONF+"-";
281
-
282
- var o = new MapValue();
283
- if(conf.log_file_enabled === false ) { return o; }
284
- var root = conf['app.root'];
285
- if(root==null){
286
- return o;
287
- }
288
- var dir = path.join(root, 'logs');
289
- if(fs.existsSync(dir) === false) {
290
- return o;
291
- }
292
- var agoOneMonthTime=DateUtil.getMonth(Date.now(), -1);
293
-
294
- if(conf.reqlog_rotation_enabled) {
295
- var files = fs.readdirSync(dir);
296
- files.forEach(function (file) {
297
- if (file.startsWith(log_prefix) == false) {
298
- return;
299
- }
300
- var x = file.lastIndexOf('.');
301
- if (x < 0) {
302
- return;
303
- }
304
- var date = file.substring(log_prefix.length , x);
305
- if (date.length != 8) {
306
- return;
307
- }
308
- if (DateUtil.yyyymmdd(date) < agoOneMonthTime) {
309
- return;
310
- }
311
- const stats = fs.statSync(dir + '/'+file);
312
- if(stats){
313
- o.putLong(file, stats.size);
314
- }
315
- });
316
- } else {
317
- if (fs.existsSync(dir + "/reqlog.log")) {
318
- const stats = fs.statSync(dir + "/reqlog.log");
319
- o.putLong(file, stats.size);
320
- }
321
- }
322
- return o;
323
- },
324
- initializer : initializer
325
- };
326
-
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
+ var WHATAP_CONF = 'reqlog';
7
+
8
+ var conf = require('./conf/configure'),
9
+ DateUtil = require('./util/dateutil'),
10
+ IPUtil = require('./util/iputil'),
11
+ path = require('path'),
12
+ fs = require('fs'),
13
+ LOGGER = require('./logger');
14
+
15
+ var PID=process.pid;
16
+
17
+ var initializer = {
18
+ last : DateUtil.currentTime(),
19
+ lastDateUnit : DateUtil.getDateUnit(),
20
+ lastFileRotation : true,
21
+ reset : function () {
22
+ if(RequestLog.printWriter) RequestLog.printWriter.close();
23
+ RequestLog.logfile = null;
24
+ RequestLog.openFile();
25
+ },
26
+ process : function () {
27
+ conf = require('./conf/configure');
28
+ var now = DateUtil.currentTime();
29
+ if(now > this.last + DateUtil.MILLIS_PER_HOUR) {
30
+ this.last = now;
31
+ RequestLog.clearOldLog();
32
+ }
33
+ if(this.lastFileRotation !== conf.reqlog_rotation_enabled
34
+ || this.lastDateUnit !== DateUtil.getDateUnit()
35
+ || (RequestLog.logfile !== null && fs.existsSync(RequestLog.logfile) == false)) {
36
+ try {
37
+ if(RequestLog.printWriter){
38
+ RequestLog.printWriter.close();
39
+ }
40
+ RequestLog.logfile = null;
41
+ this.lastFileRotation = conf.reqlog_rotation_enabled;
42
+ this.lastDateUnit = DateUtil.getDateUnit();
43
+ } catch(e) {
44
+ console.log(e);
45
+ }
46
+ }
47
+ try {
48
+ RequestLog.openFile();
49
+ } catch(e) {
50
+ console.log(e);
51
+ return false;
52
+ }
53
+ return true;
54
+ }
55
+ };
56
+
57
+ var RequestLog = {
58
+ ONAME : null,
59
+ logfile : null,
60
+ lastLog : {},
61
+ printWriter : null,
62
+ setRecord : async function (ctx) {
63
+ try{
64
+ if(this.printWriter != null) {
65
+ this.buildRecord(ctx).then(e => {
66
+ this.printWriter.write(e + '\n');
67
+ }).catch((err)=> {
68
+ LOGGER.printError('[WHATAP-LOG]' ,'setRecord_1' , err , false);
69
+ });
70
+ } else {
71
+ this.openFile();
72
+ }
73
+ } catch (e){
74
+ LOGGER.printError('[WHATAP-LOG]' ,'setRecord_2' , err , false);
75
+ }
76
+ },
77
+ checkOk : function (id, sec) {
78
+ if(Object.keys(RequestLog.lastLog).length >= 1000) {
79
+ RequestLog.lastLog = {};
80
+ }
81
+
82
+ if(sec > 0) {
83
+ var last = RequestLog.lastLog[id];
84
+ if(last == null) {
85
+ last = 0;
86
+ }
87
+ var now = Date.now();
88
+ if(now < last + sec * 1000) {
89
+ return false;
90
+ }
91
+ RequestLog.lastLog[id] = now;
92
+ }
93
+ return true;
94
+ },
95
+ buildRecord : async function (ctx) {
96
+ var str = '';
97
+ let seperator = conf.reqlog_seperator;
98
+ str += "stime=" + ctx.start_time;
99
+ if (conf.reqlog_x_etime) {
100
+ str += seperator + "etime=" + ctx.endTime;
101
+ }
102
+ if (conf.reqlog_x_elapsed) {
103
+ str += seperator + "elapsed=" + ctx.elapsed;
104
+ }
105
+ if (conf.reqlog_x_url) {
106
+ str += seperator + "url=" + ctx.service_name;
107
+ }
108
+ if (conf.reqlog_x_httphost && ctx.http_host!=null) {
109
+ str += seperator + "httphost=" + ctx.http_host;
110
+ }
111
+ if (conf.reqlog_x_method) {
112
+ str += seperator + "method=" + ctx.http_method;
113
+ }
114
+ if (conf.reqlog_x_ip && ctx.remoteIp != 0) {
115
+ str += seperator + "ip=" + IPUtil.intToString(ctx.remoteIp);
116
+ }
117
+ if (conf.reqlog_x_status) {
118
+ str += seperator + "status=" + ctx.status;
119
+ }
120
+ /*
121
+ if (conf.reqlog_x_wcid && x.wclientId != 0) {
122
+ str += seperator + "wcid=" + x.wclientId;
123
+ }
124
+ */
125
+ if (conf.reqlog_x_login && ctx.login != null) {
126
+ str += seperator + "login=" + ctx.login;
127
+ }
128
+
129
+ if (conf.reqlog_x_error && ctx.error != null && ctx.statusMessage !== undefined) {
130
+ str += seperator + "errMsg=" + ctx.statusMessage;
131
+ }
132
+ if (conf.reqlog_x_useragent) {
133
+ str += seperator + "userAgent=" + ctx.userAgentString;
134
+ }
135
+ if (conf.reqlog_x_txid) {
136
+ str += seperator + "txid=" + ctx.txid;
137
+ }
138
+ if (ctx.custid != null) {
139
+ if (conf.reqlog_x_custid) {
140
+ str += seperator + "custid=" + ctx.custid;
141
+ } else if (conf.reqlog_x_gtid) {
142
+ str += seperator + "gtid=" + ctx.custid;
143
+ }
144
+ }
145
+ if (conf.reqlog_x_mtid && ctx.mtid != 0) {
146
+ str += seperator + "mtid=" + ctx.mtid;
147
+ if (conf.reqlog_x_mdepth) {
148
+ str += seperator + "mdepth=" + ctx.mdepth;
149
+ }
150
+ }
151
+ /*
152
+ if (conf.reqlog_x_dbc && x.dbc_time > 0) {
153
+ str += seperator + "dbcTime=" + x.dbc_time;
154
+ }
155
+ */
156
+ if (conf.reqlog_x_sql && ctx.sql_count > 0) {
157
+ str += seperator + "sqlCnt=" + ctx.sql_count;
158
+ str += seperator + "sqlTime=" + ctx.sql_time;
159
+ }
160
+ if (conf.reqlog_x_httpc && ctx.httpc_count > 0) {
161
+ str += seperator + "httpCallCnt=" + ctx.httpc_count;
162
+ str += seperator + "httpCallTime=" + ctx.httpc_time;
163
+ }
164
+ if (conf.reqlog_x_rs && ctx.rs_count > 0) {
165
+ str += seperator + "rsCnt=" + ctx.rs_count;
166
+ str += seperator + "rsTime=" + ctx.rs_time;
167
+ }
168
+
169
+ return str;
170
+ },
171
+ openFile : function () {
172
+ if(conf.log_file_enabled === false ) { return; }
173
+ var log_prefix = WHATAP_CONF+"-";
174
+
175
+ var root = conf['app.root'];
176
+ if(root==null || root ==undefined){
177
+ console.log('[WHATAP]RequestLog Error - WHATAP ROOT DIR IS NULL!!!!!!!!!');
178
+ return;
179
+ }
180
+ var dir = path.join(root, 'logs');
181
+ if(fs.existsSync(dir) == false) {
182
+ fs.mkdirSync(dir);
183
+ }
184
+
185
+ if(conf.reqlog_rotation_enabled) {
186
+ var file = path.join(dir, log_prefix + DateUtil.yyyymmdd() + '.log');
187
+ this.logfile = file;
188
+ this.printWriter = fs.createWriteStream(file, {flags : 'a'});
189
+ } else {
190
+ var file = path.join(dir, 'reqlog.log');
191
+ this.logfile = file;
192
+ this.printWriter = fs.createWriteStream(file, {flags : 'a'});
193
+ }
194
+
195
+ },
196
+ clearOldLog : function () {
197
+ if(conf.reqlog_rotation_enabled === false || conf.reqlog_enabled === false) { return; }
198
+ if(conf.reqlog_keep_days <= 0) { return; }
199
+
200
+ var nowUnit = DateUtil.getDateUnit(),
201
+ root = conf['app.root'],
202
+ dir = path.join(root, 'logs'),
203
+ log_prefix = WHATAP_CONF+"-";
204
+
205
+ fs.readdir(dir, function (err, files) {
206
+
207
+ for(var i=0; i<files.length; i++) {
208
+ var stat = fs.statSync(path.join(dir, files[i]));
209
+ if(stat.isDirectory()) {
210
+ return true;
211
+ }
212
+ var name = files[i];
213
+ if(name.indexOf(log_prefix) < 0) {
214
+ return true;
215
+ }
216
+ var x = name.lastIndexOf('.');
217
+ if(x < 0) {
218
+ return true;
219
+ }
220
+ var date = name.substr(log_prefix.length + 1, (x - log_prefix.length - 1));
221
+ if(date.length != 8) {
222
+ return true;
223
+ }
224
+ var d = DateUtil.yyyymmdd(date);
225
+ var fileUnit = DateUtil.getDateUnit(d);
226
+ try {
227
+ if (nowUnit - fileUnit > conflog_keep_days) {
228
+ fs.unlinkSync(path.join(dir, files[i]));
229
+ }
230
+ } catch (e) { }
231
+ }
232
+
233
+ });
234
+ },
235
+ read : function( file, endpos, length , callback) {
236
+
237
+ if ( file == null || length === 0)
238
+ return null;
239
+ if (file.startsWith(WHATAP_CONF) == false) return null;
240
+
241
+ var root = conf['app.root'];
242
+ if(root==null ){
243
+ return null;
244
+ }
245
+ var dir = path.join(root, 'logs');
246
+ var fileFullPath = path.join(dir, file);
247
+
248
+ if(fs.existsSync(fileFullPath) == false) {
249
+ return null;
250
+ }
251
+ const stats = fs.statSync(fileFullPath);
252
+
253
+ if (endpos < 0) {
254
+ endpos = stats.size;
255
+ }
256
+
257
+ var start = Math.max(0, endpos - length);
258
+
259
+ if ( stats.size < start)
260
+ return null;
261
+
262
+ var available = stats.size - start;
263
+ var readable = Math.min(available, length);
264
+ var next=-1;
265
+ var buffer = Buffer.alloc(readable);
266
+ fs.open(fileFullPath, 'r', function (err, fd) {
267
+ fs.read(fd, buffer, 0, buffer.length, start,function(e,l,b){
268
+ next = endpos + l;
269
+ if (next > stats.size) {
270
+ next = -1;
271
+ }
272
+ callback(start, next,b.toString("utf8",0,l)) ;
273
+ });
274
+ fs.close(fd);
275
+ });
276
+
277
+ },
278
+ getLogFiles : function () {
279
+ var MapValue = require('./value/map-value');
280
+ var log_prefix = WHATAP_CONF+"-";
281
+
282
+ var o = new MapValue();
283
+ if(conf.log_file_enabled === false ) { return o; }
284
+ var root = conf['app.root'];
285
+ if(root==null){
286
+ return o;
287
+ }
288
+ var dir = path.join(root, 'logs');
289
+ if(fs.existsSync(dir) === false) {
290
+ return o;
291
+ }
292
+ var agoOneMonthTime=DateUtil.getMonth(Date.now(), -1);
293
+
294
+ if(conf.reqlog_rotation_enabled) {
295
+ var files = fs.readdirSync(dir);
296
+ files.forEach(function (file) {
297
+ if (file.startsWith(log_prefix) == false) {
298
+ return;
299
+ }
300
+ var x = file.lastIndexOf('.');
301
+ if (x < 0) {
302
+ return;
303
+ }
304
+ var date = file.substring(log_prefix.length , x);
305
+ if (date.length != 8) {
306
+ return;
307
+ }
308
+ if (DateUtil.yyyymmdd(date) < agoOneMonthTime) {
309
+ return;
310
+ }
311
+ const stats = fs.statSync(dir + '/'+file);
312
+ if(stats){
313
+ o.putLong(file, stats.size);
314
+ }
315
+ });
316
+ } else {
317
+ if (fs.existsSync(dir + "/reqlog.log")) {
318
+ const stats = fs.statSync(dir + "/reqlog.log");
319
+ o.putLong(file, stats.size);
320
+ }
321
+ }
322
+ return o;
323
+ },
324
+ initializer : initializer
325
+ };
326
+
327
327
  module.exports = RequestLog;