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
@@ -4,7 +4,7 @@
4
4
  * can be found in the LICENSE file.
5
5
  */
6
6
 
7
- var WHATAP_CONF = process.env.WHATAP_CONF || 'whatap';
7
+ var WHATAP_CONF = process.env.WHATAP_CONF || 'whatap';
8
8
 
9
9
  var fs = require('fs'),
10
10
  path = require('path'),
@@ -12,14 +12,340 @@ var fs = require('fs'),
12
12
 
13
13
  var DataInputX = require('./../io/data-inputx'),
14
14
  secu = require('./../net/security-master'),
15
+ NodeUtil = require('./../util/nodeutil'),
15
16
  HashUtil = require('./../util/hashutil'),
17
+ StringUtil = require('./../util/string-util'),
16
18
  Cypher = require('./../util/cypher'),
17
19
  ConfigDefault = require("./config-default"),
18
20
  LogConfigDefault = require("./log-config-default"),
21
+ ConfSysMon = require('./conf-sys-mon'),
19
22
  MapValue = require('./../value/map-value'),
20
23
  IntKeyLinkedMap = require('./../util/intkey-linkedmap'),
21
24
  lastModifiedTime = 0;
22
25
 
26
+ //Object.assign(ConfigDefault, require('./config-default'));
27
+ var Configuration = function() {
28
+ var self = this;
29
+ EventEmitter.call(this);
30
+ this.apply(ConfigDefault);
31
+ this.apply(LogConfigDefault);
32
+
33
+ this.inx = 0;
34
+ this._customProps = {};
35
+ this._propertyFilePath = undefined;
36
+ this._log_ignore_set = new Set();
37
+ this.socketChk = new IntKeyLinkedMap(500,1).setMax(500);
38
+ // this._profile_position_sql = new Set();
39
+ // this._profile_position_httpc = new Set();
40
+ // this._profile_position_method = new Set();
41
+
42
+ setInterval(function(){
43
+ self.reload();
44
+ }, 10000);
45
+ };
46
+
47
+ Configuration.prototype = new EventEmitter();
48
+ Configuration.prototype.constructor = Configuration;
49
+ Configuration.prototype.init = function(userOpt, cb) {
50
+ this.reload(cb);
51
+ };
52
+
53
+ var applyEmptyConf=false;
54
+ Configuration.prototype.reload = function(cb) {
55
+ var self = this;
56
+
57
+ this.getPropertyFilePath( function(err, propertyFile) {
58
+ if(err) {
59
+ if(applyEmptyConf==false){
60
+ applyEmptyConf=true;
61
+ require('../logger').print("WHATAP-001", "No Configure file '"+propertyFile+"'", true);
62
+
63
+ var defKeys = Object.keys(ConfigDefault);
64
+ var p = {};
65
+ defKeys.forEach(function (key) {
66
+ if(ConfigDefault[key]) {
67
+ p[key] = ConfigDefault[key];
68
+ }
69
+ });
70
+ var logDefKeys = Object.keys(LogConfigDefault);
71
+ logDefKeys.forEach(function (key) {
72
+ if(LogConfigDefault[key]) {
73
+ p[key] = LogConfigDefault[key];
74
+ }
75
+ });
76
+
77
+ if(process.env.WHATAP_SERVER_HOST){
78
+ p['whatap.server.host']=process.env.WHATAP_SERVER_HOST;
79
+ }
80
+ if(process.env.WHATAP_LICENSE){
81
+ p['license']=process.env.WHATAP_LICENSE;
82
+ }
83
+ self.apply(p);
84
+ updatePrivate(self);
85
+ if(cb) cb();
86
+ }
87
+ } else {
88
+ if(propertyFile == null) { return; }
89
+ applyEmptyConf=false;
90
+ var propStats = fs.lstatSync(propertyFile);
91
+ if(lastModifiedTime >= propStats.mtime) { return; }
92
+ lastModifiedTime = propStats.mtime;
93
+
94
+ var props = fs.readFileSync(propertyFile, 'utf8');
95
+ if(props.constructor == String){
96
+ var rowProps = props.split('\n');
97
+ var oldCustom = self._customProps || {};
98
+ self._customProps = {};
99
+ for(var i = 0 ; i < rowProps.length; i++) {
100
+ var p = rowProps[i].split('=');
101
+ if(p.length > 1) {
102
+
103
+ var boolValue = toBoolean(p[1]);
104
+ if(boolValue != null) {
105
+ self._customProps[p[0]] = toBoolean(p[1]);
106
+ continue;
107
+ }
108
+
109
+ var numberValue = toNumber(p[1]);
110
+ if(numberValue != null) {
111
+ self._customProps[p[0]] = numberValue;
112
+ continue;
113
+ }
114
+ self._customProps[p[0]] = p[1];
115
+ }
116
+ }
117
+
118
+ var oldKeys = Object.keys(oldCustom);
119
+ var newKeys = Object.keys(self._customProps);
120
+
121
+ oldKeys.forEach(function (key) {
122
+ if(newKeys.indexOf(key) < 0) {
123
+ if(ConfigDefault[key] !== null || LogConfigDefault[key] !== null) {
124
+ self[key] = ConfigDefault[key] !== null ? ConfigDefault[key] : LogConfigDefault[key];
125
+ } else {
126
+ delete self[key];
127
+ }
128
+ }
129
+ });
130
+ require('../logger').print("WHATAP-203", "Config file reloaded", false);
131
+ }
132
+
133
+ if(!self._customProps['license'] && process.env.WHATAP_LICENSE)
134
+ self._customProps['license'] = process.env.WHATAP_LICENSE;
135
+ if(!self._customProps['whatap.server.host'] && process.env.WHATAP_SERVER_HOST)
136
+ self._customProps['whatap.server.host'] = process.env.WHATAP_SERVER_HOST;
137
+ self.apply( self._customProps );
138
+ updatePrivate(self);
139
+ if(cb) cb();
140
+ }
141
+ });
142
+
143
+ };
144
+ function updatePrivate(self){
145
+ if(self.trace_user_using_ip) {
146
+ self.trace_user_using_type = 1;
147
+ } else {
148
+ self.trace_user_using_type = 3;
149
+ }
150
+
151
+ self._log_ignore_set = self.getStringSet('log_ignore_set', null, ',');
152
+ // self._profile_position_sql = self.getStringSet('profile_position_sql', null, ',');
153
+ // self._profile_position_httpc = self.getStringSet('profile_position_httpc', null, ',');
154
+ // self._profile_position_method = self.getStringSet('profile_position_method', null, ',');
155
+ }
156
+
157
+ Configuration.prototype.apply = function(properties) {
158
+ for(var k in properties) {
159
+ this.setProperty(k, properties[k]);
160
+ }
161
+
162
+ var set = this.getStringSet("whatap.server.host", "127.0.0.1", "/");
163
+ var ips = Array.from(set);
164
+ this.whatap_server_host = ips;
165
+
166
+ if( this.getProperty('whatap_micro_enabled', false) === true || process.env.WHATAP_MICRO_ENABLED === "true"){
167
+ this.kubeNodeName(properties);
168
+ }
169
+
170
+ ConfSysMon.apply(properties);
171
+ };
172
+
173
+ Configuration.prototype.kubeNodeName = function(properties){
174
+ var POD_NAME = process.env['POD_NAME'] || process.env['PODNAME'];
175
+ this.OKIND_NAME = this.getProperty('whatap.okind');
176
+ if(!this.OKIND_NAME || this.OKIND_NAME.length < 1){
177
+ this.OKIND_NAME = POD_NAME ? cutOut(POD_NAME, '-') : '';
178
+ this.setProperty('whatap.okind', this.OKIND_NAME);
179
+ }
180
+ this.OKIND = StringUtil.isEmpty(this.OKIND_NAME) ? 0 : HashUtil.hash(this.OKIND_NAME);
181
+ secu.OKIND = this.OKIND;
182
+ secu.OKIND_NAME = this.OKIND_NAME;
183
+
184
+ this.ONODE_NAME = this.getProperty("whatap.onode");
185
+ if (!this.ONODE_NAME || (this.ONODE_NAME && this.ONODE_NAME.length < 1)) {
186
+ this.ONODE_NAME = process.env['NODE_NAME'] || process.env['WHATAP_ONODE'];
187
+ }
188
+ if (!this.ONODE_NAME || (this.ONODE_NAME && this.ONODE_NAME.length < 1)) {
189
+ this.ONODE_NAME = process.env["NODE_IP"];
190
+ }
191
+ this.ONODE = StringUtil.isEmpty(this.ONODE_NAME) ? 0 : HashUtil.hashFromString(this.ONODE_NAME);
192
+ secu.ONODE = this.ONODE;
193
+ secu.ONODE_NAME = this.ONODE_NAME;
194
+ }
195
+
196
+ Configuration.prototype.getPropertyFilePath = function(cb) {
197
+ var self = this;
198
+ if(self._propertyFilePath) {
199
+ if(cb) {
200
+ cb(null, self._propertyFilePath);
201
+ }
202
+ }
203
+
204
+ var confDir= '.';
205
+ if(process.env.WHATAP_CONF_DIR){
206
+ confDir= process.env.WHATAP_CONF_DIR;
207
+ }else{
208
+ confDir =this.getProperty('app.root', process.cwd());
209
+ }
210
+
211
+ var default_conf = WHATAP_CONF+".conf";
212
+ var configFile = this.getProperty('whatap.config', default_conf);
213
+
214
+ var confFullPathFile=path.join(confDir, configFile);
215
+ fs.access(confFullPathFile, function (err) {
216
+ if (err) {
217
+ self._propertyFilePath = null;
218
+ if (cb) cb(err, confFullPathFile);
219
+ } else {
220
+ self._propertyFilePath = confFullPathFile;
221
+ if (cb) cb(null, confFullPathFile);
222
+ }
223
+ });
224
+ };
225
+ Configuration.prototype.getCustomProps = function(){
226
+ var props = {};
227
+ for(var k in this._customProps){
228
+ props[k] = this._customProps[k];
229
+ }
230
+ return props;
231
+ };
232
+ Configuration.prototype.saveProperty = function(keyValues){
233
+ var self = this;
234
+ this.getPropertyFilePath(function(err, propertyFile){
235
+ for(var k in keyValues){
236
+ var v = keyValues[k];
237
+ if(!v || v.length < 1){
238
+ delete self._customProps[k];
239
+ }else{
240
+ self._customProps[k] = v;
241
+ }
242
+ }
243
+
244
+ if(!self._customProps['whatap.server.host'] && process.env.WHATAP_SERVER_HOST){
245
+ self._customProps['whatap.server.host']=process.env.WHATAP_SERVER_HOST;
246
+ }
247
+ if(!self._customProps['license'] && process.env.WHATAP_LICENSE){
248
+ self._customProps['license']=process.env.WHATAP_LICENSE;
249
+ }
250
+ var writeContents = '';
251
+ for(var k in self._customProps){
252
+ var v = self._customProps[k];
253
+ writeContents += k +'=' + v +'\n';
254
+ }
255
+ fs.writeFile(propertyFile, writeContents , 'utf-8', function(err, data){
256
+ if(err){
257
+ return console.error(err);
258
+ }
259
+ })
260
+ for(var k in self._customProps){
261
+ var v = self._customProps[k];
262
+ self.setProperty(k, v);
263
+ }
264
+ });
265
+ };
266
+ Configuration.prototype.setProperty = function(key, value) {
267
+ if(this[key] == value) { return; }
268
+ this[key] = value;
269
+ this.emit(key, value);
270
+ };
271
+ Configuration.prototype.getProperty = function(key, defaultValue) {
272
+ if(this[key] === undefined){
273
+ return defaultValue;
274
+ } else{
275
+ return this[key];
276
+ }
277
+ };
278
+
279
+ Configuration.prototype.getWhatapServerHost = function () {
280
+ var _len = this.whatap_server_host.length;
281
+ switch (_len) {
282
+ case 0:
283
+ return '127.0.0.1';
284
+ case 1:
285
+ return this.whatap_server_host[0];
286
+ }
287
+ var _inx = this.inx;
288
+ var out = this.whatap_server_host[_inx];
289
+ this.inx = (_inx + 1) % _len;
290
+ return out;
291
+ };
292
+ Configuration.prototype.updateNetCypherKey = function(data /* byte[] */) {
293
+ try{
294
+ var data = secu.cypher.decrypt(data);
295
+ var inD = new DataInputX(data);
296
+ this.TRANSFER_KEY = inD.readInt();
297
+ this.SECURE_KEY = inD.readBlob();
298
+ this.HIDE_KEY = inD.readInt();
299
+ this.cypher = new Cypher(this.SECURE_KEY, this.HIDE_KEY);
300
+ } catch(e) {
301
+
302
+ }
303
+ };
304
+ Configuration.prototype.readCustomConfig = function(){
305
+ var props = this.getCustomProps();
306
+ var mv = new MapValue();
307
+ for(var k in props){
308
+ mv.putString(k, props[k]);
309
+ }
310
+ return mv;
311
+ };
312
+ Configuration.prototype.isIgnoreLog = function (id) {
313
+ return this._log_ignore_set.has(id);
314
+ };
315
+ Configuration.prototype.setSocketChk = function (socket) {
316
+ if(socket.whatapId == undefined) {
317
+ socket.whatapId = (new Date()).getTime().toString(36) + Math.random().toString(36).slice(2);
318
+ //require('../logger').print("WHATAP-TEST", 'Socket whatapId : ' + socket.whatapId, false);
319
+ }
320
+ //else {
321
+ // require('../logger').print("WHATAP-TEST", '[REUSE] Socket whatapId : ' + socket.whatapId, false);
322
+ //}
323
+ if(this.socketChk.get(socket.whatapId) == null) {
324
+ this.socketChk.put(socket.whatapId , socket.whatapId);
325
+ return false;
326
+ } else return true;
327
+ }
328
+ Configuration.prototype.getStringSet = function (key, defaultValue, deli) {
329
+ var set = new Set();
330
+ var value = this[key] || defaultValue;
331
+ if(value == null) { return set; }
332
+
333
+ var arr = value.split(deli);
334
+ for(var i=0; i<arr.length; i++) {
335
+ var x = arr[i].trim();
336
+ if(x)set.add(replaceCarriageReturns(x));
337
+ }
338
+ return set;
339
+ };
340
+
341
+ Configuration.prototype.getLogSinkProperty = function (id, key) {
342
+ return this.getProperty("pii_mask_logsink_"+id + "_" + key);
343
+ }
344
+
345
+ Configuration.prototype.getSqlProperty = function (id, key) {
346
+ return this.getProperty("pii_mask_sql_"+id + "_" + key)
347
+ }
348
+
23
349
  function toNumber(value) {
24
350
  if(typeof value == 'number') {
25
351
  return value;
@@ -32,7 +358,6 @@ function toNumber(value) {
32
358
  return number;
33
359
  }
34
360
  }
35
-
36
361
  function toBoolean(value) {
37
362
  if(typeof value == 'boolean') {
38
363
  return value;
@@ -67,359 +392,54 @@ function cutOut(val, delim) {
67
392
  }
68
393
  }
69
394
 
70
- function updatePrivate(self){
71
- if(self.trace_user_using_ip) {
72
- self.trace_user_using_type = 1;
73
- } else {
74
- self.trace_user_using_type = 3;
75
- }
76
-
77
- self._log_ignore_set = self.getStringSet('log_ignore_set', null, ',');
78
- }
79
-
80
- /**
81
- * Configuration 클래스 - 싱글톤 패턴으로 구현
82
- */
83
- var Configuration = (function() {
84
- // 싱글톤 인스턴스
85
- var instance;
86
- var applyEmptyConf = false;
87
-
88
- // 싱글톤 인스턴스 초기화 함수
89
- function init() {
90
- // Configuration 기본 객체 생성
91
- var configInstance = {};
92
-
93
- // EventEmitter 상속
94
- EventEmitter.call(configInstance);
95
- Object.setPrototypeOf(configInstance, EventEmitter.prototype);
96
-
97
- // 기본 속성 설정
98
- configInstance.PCODE = 0;
99
- configInstance.OID = 0;
100
- configInstance.ONAME = null;
101
- configInstance.OKIND = 0;
102
- configInstance.OKIND_NAME = null;
103
- configInstance.ONODE = 0;
104
- configInstance.ONODE_NAME = null;
105
- configInstance.inx = 0;
106
- configInstance._customProps = {};
107
- configInstance._propertyFilePath = undefined;
108
- configInstance._log_ignore_set = new Set();
109
- configInstance.socketChk = new IntKeyLinkedMap(500,1).setMax(500);
110
-
111
- // 메서드 정의
112
- configInstance.getProperty = function(key, defaultValue) {
113
- if(this[key] === undefined){
114
- return defaultValue;
115
- } else{
116
- return this[key];
117
- }
118
- };
119
-
120
- configInstance.setProperty = function(key, value) {
121
- if(this[key] == value) { return; }
122
- this[key] = value;
123
- this.emit(key, value);
124
- };
125
-
126
- configInstance.getStringSet = function (key, defaultValue, deli) {
127
- var set = new Set();
128
- var value = this[key] || defaultValue;
129
- if(value == null) { return set; }
130
-
131
- var arr = value.split(deli);
132
- for(var i=0; i<arr.length; i++) {
133
- var x = arr[i].trim();
134
- if(x) set.add(replaceCarriageReturns(x));
135
- }
136
- return set;
137
- };
138
-
139
- configInstance.apply = function(properties) {
140
- for(var k in properties) {
141
- this.setProperty(k, properties[k]);
142
- }
143
-
144
- };
145
-
146
- configInstance.init = function(userOpt, cb) {
147
- this.reload(cb);
148
- };
149
-
150
- configInstance.reload = function(cb) {
151
- var self = this;
152
-
153
- this.getPropertyFilePath(function(err, propertyFile) {
154
- if(err) {
155
- if(applyEmptyConf==false){
156
- applyEmptyConf=true;
157
- require('../logger').print("WHATAP-301", "No Configure file '"+propertyFile+"'", true);
158
-
159
- var defKeys = Object.keys(ConfigDefault);
160
- var p = {};
161
- defKeys.forEach(function (key) {
162
- if(ConfigDefault[key]) {
163
- p[key] = ConfigDefault[key];
164
- }
165
- });
166
- var logDefKeys = Object.keys(LogConfigDefault);
167
- logDefKeys.forEach(function (key) {
168
- if(LogConfigDefault[key]) {
169
- p[key] = LogConfigDefault[key];
170
- }
171
- });
172
-
173
- if(process.env.WHATAP_SERVER_HOST){
174
- p['whatap.server.host']=process.env.WHATAP_SERVER_HOST;
175
- }
176
- if(process.env.WHATAP_LICENSE){
177
- p['license']=process.env.WHATAP_LICENSE;
178
- }
179
- self.apply(p);
180
- updatePrivate(self);
181
- if(cb) cb();
182
- }
183
- } else {
184
- if(propertyFile == null) { return; }
185
- applyEmptyConf=false;
186
- var propStats = fs.lstatSync(propertyFile);
187
- if(lastModifiedTime >= propStats.mtime) { return; }
188
- lastModifiedTime = propStats.mtime;
189
-
190
- var props = fs.readFileSync(propertyFile, 'utf8');
191
- if(props.constructor == String){
192
- var rowProps = props.split('\n');
193
- var oldCustom = self._customProps || {};
194
- self._customProps = {};
195
- for(var i = 0 ; i < rowProps.length; i++) {
196
- var p = rowProps[i].split('=');
197
- if(p.length > 1) {
198
-
199
- var boolValue = toBoolean(p[1]);
200
- if(boolValue != null) {
201
- self._customProps[p[0]] = toBoolean(p[1]);
202
- continue;
203
- }
204
-
205
- var numberValue = toNumber(p[1]);
206
- if(numberValue != null) {
207
- self._customProps[p[0]] = numberValue;
208
- continue;
209
- }
210
- self._customProps[p[0]] = p[1];
211
- }
212
- }
213
-
214
- var oldKeys = Object.keys(oldCustom);
215
- var newKeys = Object.keys(self._customProps);
216
-
217
- oldKeys.forEach(function (key) {
218
- if(newKeys.indexOf(key) < 0) {
219
- if(ConfigDefault[key] !== null || LogConfigDefault[key] !== null) {
220
- self[key] = ConfigDefault[key] !== null ? ConfigDefault[key] : LogConfigDefault[key];
221
- } else {
222
- delete self[key];
223
- }
224
- }
225
- });
226
- require('../logger').print("WHATAP-302", "Config file reloaded", false);
227
- }
228
-
229
- if(!self._customProps['license'] && process.env.WHATAP_LICENSE)
230
- self._customProps['license'] = process.env.WHATAP_LICENSE;
231
- if(!self._customProps['whatap.server.host'] && process.env.WHATAP_SERVER_HOST)
232
- self._customProps['whatap.server.host'] = process.env.WHATAP_SERVER_HOST;
233
- self.apply(self._customProps);
234
- updatePrivate(self);
235
- if(cb) cb();
236
- }
237
- });
238
- };
239
-
240
- configInstance.getPropertyFilePath = function(cb) {
241
- var self = this;
242
- if(self._propertyFilePath) {
243
- if(cb) {
244
- cb(null, self._propertyFilePath);
245
- }
246
- return;
247
- }
248
-
249
- var confDir= '.';
250
- if(process.env.WHATAP_CONF_DIR || process.env.WHATAP_HOME){
251
- confDir = process.env.WHATAP_CONF_DIR || process.env.WHATAP_HOME;
252
- }else{
253
- confDir = this.getProperty('app.root', process.cwd());
254
- }
255
-
256
- var default_conf = WHATAP_CONF+".conf";
257
- var configFile = this.getProperty('whatap.config', default_conf);
258
-
259
- var confFullPathFile = path.join(confDir, configFile);
260
- fs.access(confFullPathFile, function (err) {
261
- if (err) {
262
- self._propertyFilePath = null;
263
- if (cb) cb(err, confFullPathFile);
264
- } else {
265
- self._propertyFilePath = confFullPathFile;
266
- if (cb) cb(null, confFullPathFile);
267
- }
268
- });
269
- };
395
+ const conf = new Configuration();
270
396
 
271
- configInstance.getCustomProps = function(){
272
- var props = {};
273
- for(var k in this._customProps){
274
- props[k] = this._customProps[k];
275
- }
276
- return props;
277
- };
278
-
279
- configInstance.saveProperty = function(keyValues){
280
- var self = this;
281
- this.getPropertyFilePath(function(err, propertyFile){
282
- for(var k in keyValues){
283
- var v = keyValues[k];
284
- if(!v || v.length < 1){
285
- delete self._customProps[k];
286
- }else{
287
- self._customProps[k] = v;
288
- }
289
- }
290
-
291
- var writeContents = '';
292
- for(var k in self._customProps){
293
- var v = self._customProps[k];
294
- writeContents += k +'=' + v +'\n';
295
- }
296
- fs.writeFile(propertyFile, writeContents, 'utf-8', function(err, data){
297
- if(err){
298
- return console.error(err);
299
- }
300
- });
301
- for(var k in self._customProps){
302
- var v = self._customProps[k];
303
- self.setProperty(k, v);
304
- }
305
- });
306
- };
307
-
308
- configInstance.updateNetCypherKey = function(data /* byte[] */) {
309
- try{
310
- var data = secu.cypher.decrypt(data);
311
- var inD = new DataInputX(data);
312
- this.TRANSFER_KEY = inD.readInt();
313
- this.SECURE_KEY = inD.readBlob();
314
- this.HIDE_KEY = inD.readInt();
315
- this.cypher = new Cypher(this.SECURE_KEY, this.HIDE_KEY);
316
- } catch(e) {
317
- // 에러 처리
318
- }
319
- };
320
-
321
- configInstance.readCustomConfig = function(){
322
- var props = this.getCustomProps();
323
- var mv = new MapValue();
324
- for(var k in props){
325
- mv.putString(k, props[k]);
326
- }
327
- return mv;
328
- };
329
-
330
- configInstance.isIgnoreLog = function (id) {
331
- return this._log_ignore_set.has(id);
332
- };
397
+ conf.on('trace_ignore_url_set', function(props){
398
+ if(!props || props.constructor !== String){
399
+ return;
400
+ }
333
401
 
334
- configInstance.setSocketChk = function (socket) {
335
- if(socket.whatapId == undefined) {
336
- socket.whatapId = (new Date()).getTime().toString(36) + Math.random().toString(36).slice(2);
337
- }
338
- if(this.socketChk.get(socket.whatapId) == null) {
339
- this.socketChk.put(socket.whatapId, socket.whatapId);
340
- return false;
341
- } else return true;
342
- };
343
-
344
- configInstance.getLogSinkProperty = function (id, key) {
345
- return this.getProperty("pii_mask_logsink_"+id + "_" + key);
346
- };
347
-
348
- configInstance.getSqlProperty = function (id, key) {
349
- return this.getProperty("pii_mask_sql_"+id + "_" + key);
350
- };
351
-
352
- // 기본 설정 적용
353
- configInstance.apply(ConfigDefault);
354
- configInstance.apply(LogConfigDefault);
355
-
356
- // 정기적인 설정 리로드
357
- setInterval(function() {
358
- configInstance.reload();
359
- }, 10000);
360
-
361
- // 이벤트 리스너 설정
362
- configInstance.on('trace_ignore_url_set', function(props){
363
- if(!props || props.constructor !== String){
364
- return;
365
- }
402
+ var ignoreUrls = props.split(',');
403
+ conf._trace_ignore_url_set = {};
404
+ for(var i = 0; i < ignoreUrls.length; i++){
405
+ var ignoreUrl = ignoreUrls[i];
406
+ var serviceHash = HashUtil.hashFromString(ignoreUrl);
407
+ conf._trace_ignore_url_set[serviceHash] = true;
408
+ }
409
+ });
366
410
 
367
- var ignoreUrls = props.split(',');
368
- configInstance._trace_ignore_url_set = {};
369
- for(var i = 0; i < ignoreUrls.length; i++){
370
- var ignoreUrl = ignoreUrls[i];
371
- var serviceHash = HashUtil.hashFromString(ignoreUrl);
372
- configInstance._trace_ignore_url_set[serviceHash] = true;
373
- }
374
- });
411
+ conf.on('trace_ignore_url_prefix', function(props){
412
+ if(props && props.constructor === String && props.length > 0 ){
413
+ conf._is_trace_ignore_url_prefix = true;
414
+ }else{
415
+ conf._is_trace_ignore_url_prefix = false;
416
+ }
417
+ });
375
418
 
376
- configInstance.on('trace_ignore_url_prefix', function(props){
377
- if(props && props.constructor === String && props.length > 0){
378
- configInstance._is_trace_ignore_url_prefix = true;
379
- }else{
380
- configInstance._is_trace_ignore_url_prefix = false;
381
- }
382
- });
419
+ conf.on('trace_ignore_err_cls_contains', function(props){
420
+ if(props && props.constructor === String && props.length > 0 ){
421
+ conf._is_trace_ignore_err_cls_contains = true;
422
+ }else{
423
+ conf._is_trace_ignore_err_cls_contains = false;
424
+ }
425
+ });
383
426
 
384
- configInstance.on('trace_ignore_err_cls_contains', function(props){
385
- if(props && props.constructor === String && props.length > 0){
386
- configInstance._is_trace_ignore_err_cls_contains = true;
387
- }else{
388
- configInstance._is_trace_ignore_err_cls_contains = false;
389
- }
390
- });
427
+ conf.on('trace_ignore_err_msg_contains', function(props){
428
+ if(props && props.constructor === String && props.length > 0 ){
429
+ conf._is_trace_ignore_err_msg_contains = true;
430
+ }else{
431
+ conf._is_trace_ignore_err_msg_contains = false;
432
+ }
433
+ });
391
434
 
392
- configInstance.on('trace_ignore_err_msg_contains', function(props){
393
- if(props && props.constructor === String && props.length > 0){
394
- configInstance._is_trace_ignore_err_msg_contains = true;
395
- }else{
396
- configInstance._is_trace_ignore_err_msg_contains = false;
397
- }
398
- });
399
-
400
- configInstance.on('mtrace_spec', function(props){
401
- if (!props || props.length == 0) {
402
- configInstance.mtrace_spec_hash = 0;
403
- } else {
404
- props = props.replace(',', '_');
405
- configInstance.mtrace_spec_hash = HashUtil.hash(props);
406
- }
407
- });
408
435
 
409
- return configInstance;
436
+ conf.on('mtrace_spec', function(props){
437
+ if (!props || props.length == 0) {
438
+ conf.mtrace_spec_hash = 0;
439
+ } else {
440
+ props = props.replace(',', '_');
441
+ conf.mtrace_spec_hash = HashUtil.hash(props);
410
442
  }
443
+ })
411
444
 
412
- // 싱글톤 객체를 반환하는 공개 메서드
413
- return {
414
- // 싱글톤 인스턴스 가져오기
415
- getInstance: function() {
416
- if(!instance) {
417
- instance = init();
418
- }
419
- return instance;
420
- }
421
- };
422
- })();
423
-
424
- // 모듈로 내보내기
425
- module.exports = Configuration.getInstance();
445
+ module.exports = conf;