whatap 0.5.26 → 1.0.0

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 (196) hide show
  1. package/agent/darwin/arm64/whatap_nodejs +0 -0
  2. package/agent/linux/amd64/whatap_nodejs +0 -0
  3. package/agent/linux/arm64/whatap_nodejs +0 -0
  4. package/build.txt +4 -0
  5. package/lib/conf/config-default.js +3 -10
  6. package/lib/conf/configure.js +349 -369
  7. package/lib/conf/license.js +1 -1
  8. package/lib/control/packagectr-helper.js +3 -34
  9. package/lib/core/agent.js +882 -176
  10. package/lib/core/interceptor.js +6 -6
  11. package/lib/core/shimmer.js +36 -82
  12. package/lib/counter/counter-manager.js +8 -79
  13. package/lib/counter/task/activetransaction.js +17 -68
  14. package/lib/io/data-inputx.js +3 -13
  15. package/lib/io/data-outputx.js +206 -268
  16. package/lib/logger.js +6 -6
  17. package/lib/net/security-master.js +20 -139
  18. package/lib/observers/apollo-server-observer.js +27 -33
  19. package/lib/observers/global-observer.js +80 -155
  20. package/lib/observers/http-observer.js +236 -666
  21. package/lib/observers/ioredis-observer.js +294 -0
  22. package/lib/observers/maria-observer.js +362 -204
  23. package/lib/observers/mongodb-observer.js +226 -169
  24. package/lib/observers/mongoose-observer.js +323 -518
  25. package/lib/observers/mssql-observer.js +418 -177
  26. package/lib/observers/mysql-observer.js +449 -342
  27. package/lib/observers/mysql2-observer.js +358 -396
  28. package/lib/observers/oracle-observer.js +384 -559
  29. package/lib/observers/pgsql-observer.js +489 -231
  30. package/lib/observers/prisma-observer.js +92 -303
  31. package/lib/observers/process-observer.js +35 -79
  32. package/lib/observers/redis-observer.js +331 -166
  33. package/lib/observers/socket.io-observer.js +187 -226
  34. package/lib/observers/websocket-observer.js +301 -175
  35. package/lib/pack/counter-pack.js +0 -3
  36. package/lib/pack/log-sink-pack.js +52 -14
  37. package/lib/pack/tagcount-pack.js +4 -4
  38. package/lib/{counter/task → system}/gc-action.js +74 -27
  39. package/lib/trace/trace-context-manager.js +25 -113
  40. package/lib/trace/trace-context.js +7 -21
  41. package/lib/trace/trace-httpc.js +11 -17
  42. package/lib/trace/trace-sql.js +21 -29
  43. package/lib/udp/async_sender.js +119 -0
  44. package/lib/udp/index.js +17 -0
  45. package/lib/udp/packet_enum.js +52 -0
  46. package/lib/udp/packet_queue.js +69 -0
  47. package/lib/udp/packet_type_enum.js +33 -0
  48. package/lib/udp/param_def.js +72 -0
  49. package/lib/udp/udp_session.js +336 -0
  50. package/lib/util/escape-literal-sql.js +5 -5
  51. package/lib/util/hashutil.js +18 -18
  52. package/lib/util/keygen.js +3 -0
  53. package/lib/util/linkedset.js +2 -1
  54. package/lib/util/nodeutil.js +1 -2
  55. package/lib/util/sql-util.js +178 -0
  56. package/lib/util/trace-helper.js +91 -0
  57. package/lib/util/transfer.js +58 -0
  58. package/lib/value/map-value.js +2 -3
  59. package/package.json +5 -10
  60. package/lib/conf/conf-sys-mon.js +0 -101
  61. package/lib/control/cmd-config.js +0 -24
  62. package/lib/control/control-handler.js +0 -367
  63. package/lib/core/request-agent.js +0 -27
  64. package/lib/counter/meter/meter-activex.js +0 -67
  65. package/lib/counter/meter/meter-httpc.js +0 -57
  66. package/lib/counter/meter/meter-resource.js +0 -9
  67. package/lib/counter/meter/meter-service.js +0 -168
  68. package/lib/counter/meter/meter-socket.io.js +0 -51
  69. package/lib/counter/meter/meter-sql.js +0 -71
  70. package/lib/counter/meter/meter-users.js +0 -58
  71. package/lib/counter/meter.js +0 -183
  72. package/lib/counter/task/agentinfo.js +0 -107
  73. package/lib/counter/task/gcstat.js +0 -34
  74. package/lib/counter/task/heapmem.js +0 -25
  75. package/lib/counter/task/httpc.js +0 -76
  76. package/lib/counter/task/metering-info.js +0 -125
  77. package/lib/counter/task/proc-cpu.js +0 -29
  78. package/lib/counter/task/realtimeuser.js +0 -31
  79. package/lib/counter/task/res/systemECSTask.js +0 -39
  80. package/lib/counter/task/res/systemKubeTask.js +0 -53
  81. package/lib/counter/task/res/util/awsEcsClientThread.js +0 -218
  82. package/lib/counter/task/res/util/linuxProcStatUtil.js +0 -14
  83. package/lib/counter/task/res-sys-cpu.js +0 -62
  84. package/lib/counter/task/service.js +0 -202
  85. package/lib/counter/task/socketio.js +0 -30
  86. package/lib/counter/task/sql.js +0 -105
  87. package/lib/counter/task/systemperf.js +0 -43
  88. package/lib/data/datapack-sender.js +0 -289
  89. package/lib/data/dataprofile-agent.js +0 -162
  90. package/lib/data/datatext-agent.js +0 -135
  91. package/lib/data/event-level.js +0 -15
  92. package/lib/data/test.js +0 -49
  93. package/lib/data/zipprofile.js +0 -197
  94. package/lib/env/constants.js +0 -21
  95. package/lib/error/error-handler.js +0 -437
  96. package/lib/kube/kube-client.js +0 -144
  97. package/lib/lang/text-types.js +0 -58
  98. package/lib/logsink/line-log-util.js +0 -87
  99. package/lib/logsink/line-log.js +0 -12
  100. package/lib/logsink/log-sender.js +0 -78
  101. package/lib/logsink/log-tracer.js +0 -40
  102. package/lib/logsink/sender-util.js +0 -56
  103. package/lib/logsink/zip/zip-send.js +0 -177
  104. package/lib/net/netflag.js +0 -55
  105. package/lib/net/receiver.js +0 -66
  106. package/lib/net/sender.js +0 -141
  107. package/lib/net/tcp-return.js +0 -18
  108. package/lib/net/tcp-session.js +0 -286
  109. package/lib/net/tcpreq-client-proxy.js +0 -70
  110. package/lib/net/tcprequest-mgr.js +0 -58
  111. package/lib/observers/cluster-observer.js +0 -22
  112. package/lib/observers/express-observer.js +0 -215
  113. package/lib/observers/file-observer.js +0 -184
  114. package/lib/observers/grpc-observer.js +0 -336
  115. package/lib/observers/memcached-observer.js +0 -56
  116. package/lib/observers/mongo-observer.js +0 -317
  117. package/lib/observers/net-observer.js +0 -77
  118. package/lib/observers/promise-observer.js +0 -31
  119. package/lib/observers/schedule-observer.js +0 -67
  120. package/lib/observers/stream-observer.js +0 -19
  121. package/lib/observers/thrift-observer.js +0 -197
  122. package/lib/pack/activestack-pack.js +0 -55
  123. package/lib/pack/apenum.js +0 -8
  124. package/lib/pack/errorsnap-pack.js +0 -69
  125. package/lib/pack/event-pack.js +0 -54
  126. package/lib/pack/hitmap-pack.js +0 -63
  127. package/lib/pack/hitmap-pack1.js +0 -152
  128. package/lib/pack/netstat.js +0 -15
  129. package/lib/pack/otype.js +0 -7
  130. package/lib/pack/profile-pack.js +0 -49
  131. package/lib/pack/realtimeuser-pack.js +0 -41
  132. package/lib/pack/stat-general-pack.js +0 -96
  133. package/lib/pack/staterror-pack.js +0 -120
  134. package/lib/pack/stathttpc-pack.js +0 -66
  135. package/lib/pack/stathttpc-rec.js +0 -78
  136. package/lib/pack/statremote-pack.js +0 -46
  137. package/lib/pack/statservice-pack.js +0 -63
  138. package/lib/pack/statservice-pack1.js +0 -88
  139. package/lib/pack/statservice-rec.js +0 -292
  140. package/lib/pack/statservice-rec_dep.js +0 -151
  141. package/lib/pack/statsql-pack.js +0 -69
  142. package/lib/pack/statsql-rec.js +0 -100
  143. package/lib/pack/statuseragent-pack.js +0 -44
  144. package/lib/pack/tagctr.js +0 -15
  145. package/lib/pack/text-pack.js +0 -50
  146. package/lib/pack/time-count.js +0 -25
  147. package/lib/pack/websocket.js +0 -15
  148. package/lib/pack/zip-pack.js +0 -70
  149. package/lib/pii/pii-item.js +0 -31
  150. package/lib/pii/pii-mask.js +0 -174
  151. package/lib/plugin/plugin-loadermanager.js +0 -57
  152. package/lib/plugin/plugin.js +0 -75
  153. package/lib/service/tx-record.js +0 -332
  154. package/lib/stat/stat-error.js +0 -116
  155. package/lib/stat/stat-httpc.js +0 -98
  156. package/lib/stat/stat-remote-ip.js +0 -46
  157. package/lib/stat/stat-remote-ipurl.js +0 -88
  158. package/lib/stat/stat-sql.js +0 -113
  159. package/lib/stat/stat-tranx.js +0 -58
  160. package/lib/stat/stat-tx-caller.js +0 -160
  161. package/lib/stat/stat-tx-domain.js +0 -111
  162. package/lib/stat/stat-tx-referer.js +0 -112
  163. package/lib/stat/stat-useragent.js +0 -48
  164. package/lib/stat/timingsender.js +0 -76
  165. package/lib/step/activestack-step.js +0 -38
  166. package/lib/step/dbc-step.js +0 -36
  167. package/lib/step/http-stepx.js +0 -67
  168. package/lib/step/message-step.js +0 -40
  169. package/lib/step/method-stepx.js +0 -45
  170. package/lib/step/resultset-step.js +0 -40
  171. package/lib/step/securemsg-step.js +0 -44
  172. package/lib/step/socket-step.js +0 -46
  173. package/lib/step/sql-stepx.js +0 -68
  174. package/lib/step/sqlxtype.js +0 -16
  175. package/lib/step/step.js +0 -66
  176. package/lib/step/stepenum.js +0 -54
  177. package/lib/topology/link.js +0 -63
  178. package/lib/topology/nodeinfo.js +0 -123
  179. package/lib/topology/status-detector.js +0 -111
  180. package/lib/util/anylist.js +0 -103
  181. package/lib/util/cardinality/hyperloglog.js +0 -106
  182. package/lib/util/cardinality/murmurhash.js +0 -31
  183. package/lib/util/cardinality/registerset.js +0 -75
  184. package/lib/util/errordata.js +0 -21
  185. package/lib/util/iputil_x.js +0 -527
  186. package/lib/util/kube-util.js +0 -73
  187. package/lib/util/paramsecurity.js +0 -80
  188. package/lib/util/pre-process.js +0 -13
  189. package/lib/util/process-seq.js +0 -166
  190. package/lib/util/property-util.js +0 -36
  191. package/lib/util/request-queue.js +0 -70
  192. package/lib/util/requestdouble-queue.js +0 -72
  193. package/lib/util/resourceprofile.js +0 -157
  194. package/lib/util/stop-watch.js +0 -30
  195. package/lib/util/system-util.js +0 -10
  196. package/lib/util/userid-util.js +0 -57
@@ -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,340 +12,14 @@ 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'),
16
15
  HashUtil = require('./../util/hashutil'),
17
- StringUtil = require('./../util/string-util'),
18
16
  Cypher = require('./../util/cypher'),
19
17
  ConfigDefault = require("./config-default"),
20
18
  LogConfigDefault = require("./log-config-default"),
21
- ConfSysMon = require('./conf-sys-mon'),
22
19
  MapValue = require('./../value/map-value'),
23
20
  IntKeyLinkedMap = require('./../util/intkey-linkedmap'),
24
21
  lastModifiedTime = 0;
25
22
 
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
-
349
23
  function toNumber(value) {
350
24
  if(typeof value == 'number') {
351
25
  return value;
@@ -358,6 +32,7 @@ function toNumber(value) {
358
32
  return number;
359
33
  }
360
34
  }
35
+
361
36
  function toBoolean(value) {
362
37
  if(typeof value == 'boolean') {
363
38
  return value;
@@ -392,54 +67,359 @@ function cutOut(val, delim) {
392
67
  }
393
68
  }
394
69
 
395
- const conf = new Configuration();
396
-
397
- conf.on('trace_ignore_url_set', function(props){
398
- if(!props || props.constructor !== String){
399
- return;
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;
400
75
  }
401
76
 
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
- });
77
+ self._log_ignore_set = self.getStringSet('log_ignore_set', null, ',');
78
+ }
410
79
 
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
- });
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
+ };
418
138
 
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
- });
139
+ configInstance.apply = function(properties) {
140
+ for(var k in properties) {
141
+ this.setProperty(k, properties[k]);
142
+ }
426
143
 
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
- });
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
+ }
434
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
+ }
435
228
 
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);
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
+ };
270
+
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
+ };
333
+
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
+ }
366
+
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
+ });
375
+
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
+ });
383
+
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
+ });
391
+
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
+
409
+ return configInstance;
442
410
  }
443
- })
444
411
 
445
- module.exports = conf;
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();