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,66 +4,41 @@
4
4
  * can be found in the LICENSE file.
5
5
  */
6
6
 
7
- const { reqlog_x_txid } = require('../conf/config-default');
8
- const controlHandler = require('../control/control-handler');
9
- const RequestLog = require('../requestlog');
10
7
  var TraceContextManager = require('../trace/trace-context-manager'),
11
- URLPatternDetector = require('../trace/serviceurl-pattern-detector').Detector,
12
- DataTextAgent = require('../data/datatext-agent'),
13
- DataProfileAgent = require('../data/dataprofile-agent'),
14
- EventLevel = require('../data/event-level'),
15
- HttpStepX = require('../step/http-stepx'),
16
- TxRecord = require('../service/tx-record'),
17
- StatError = require('../stat/stat-error'),
18
- StatHttpc = require('../stat/stat-httpc'),
19
- StatTranxMtCaller = require('../stat/stat-tx-caller'),
20
- ProfilePack = require('../pack/profile-pack'),
21
- DataInputX = require('../io/data-inputx'),
22
- SecurityMaster = require('../net/security-master'),
23
- MeterService = require('../counter/meter/meter-service').MeterService,
24
- MeterUsers = require('../counter/meter/meter-users'),
25
- MeterHttpC = require('../counter/meter/meter-httpc'),
26
- conf = require('../conf/configure'),
27
- HashUtil = require('../util/hashutil'),
28
- UserIdUtil = require('../util/userid-util'),
29
- DateUtil = require('../util/dateutil'),
30
- IPUtil = require('../util/iputil'),
31
- Hexa32 = require('../util/hexa32'),
32
- ResourceProfile = require('../util/resourceprofile'),
33
- TextTypes = require('../lang/text-types'),
34
- MessageStep = require('../step/message-step'),
35
- SecureMsgStep = require('../step/securemsg-step'),
36
- PluginLoaderManager = require('../plugin/plugin-loadermanager'),
37
- Long = require('long'),
38
- KeyGen = require('../util/keygen'),
39
- Logger = require('../logger'),
40
- IntKeyLinkedMap = require("../util/intkey-linkedmap");
41
- const ParamSecurity = require("../util/paramsecurity");
8
+ URLPatternDetector = require('../trace/serviceurl-pattern-detector').Detector,
9
+ conf = require('../conf/configure'),
10
+ HashUtil = require('../util/hashutil'),
11
+ Hexa32 = require('../util/hexa32'),
12
+ KeyGen = require('../util/keygen'),
13
+ TraceHelper = require('../util/trace-helper'),
14
+ Logger = require('../logger'),
15
+ AsyncSender = require('../udp/async_sender'),
16
+ PacketTypeEnum = require('../udp/packet_type_enum'),
17
+ TraceHttpc = require('../trace/trace-httpc');
42
18
  const {Buffer} = require("buffer");
43
19
  const shimmer = require('../core/shimmer');
44
- const TraceHttpc = require('../trace/trace-httpc');
20
+ const os = require('os');
21
+ const Transfer = require('../util/transfer');
45
22
 
46
- var _exts=new Set([".css",".js",".png", ".htm", ".html", ".gif", ".jpg", ".css", ".txt", ".ico"]);
23
+ var _exts = new Set([".css", ".js", ".png", ".htm", ".html", ".gif", ".jpg", ".css", ".txt", ".ico"]);
47
24
 
48
25
  var configIpHeaderKey = conf.getProperty('trace_http_client_ip_header_key', 'x-forwarded-for');
49
26
  var configUserAgentKey = conf.getProperty('trace_user_agent_header_key', '');
50
27
  var configRefererKey = conf.getProperty('trace_referer_header_key', '');
51
- var trace_origin_url = conf.getProperty('trace_origin_url', false);
52
28
  var ignore_http_method = conf.getProperty('ignore_http_method', 'PATCH,OPTIONS,HEAD,TRACE');
53
29
  var transaction_status_error_enable = conf.getProperty('transaction_status_error_enable', true);
54
30
  var status_ignore = conf.getProperty('status_ignore', '');
55
31
  var httpc_status_ignore = conf.getProperty('httpc_status_ignore', '');
56
32
  var status_ignore_set = conf.getProperty('status_ignore_set', '');
57
33
  var httpc_status_ignore_set = conf.getProperty('httpc_status_ignore_set', '');
58
- var profile_error_step_enabled = conf.getProperty('profile_error_step_enabled', '');
59
- var httpc_not_found_ignore = conf.getProperty('httpc_not_found_ignore', false);
60
- var httpc_not_found_ignore_time = conf.getProperty('httpc_not_found_ignore_time', 300000);
61
34
  var profile_http_header_ignore_keys = conf.getProperty('profile_http_header_ignore_keys', 'Cookie,cookie,accept,user-agent,referer');
62
35
  var profile_http_parameter_enabled = conf.getProperty('profile_http_parameter_enabled', true);
63
36
  var profile_http_parameter_keys = conf.getProperty('profile_http_parameter_keys', '');
64
37
  var ignore_build_file_enabled = conf.getProperty('ignore_build_file_enabled', true);
65
38
  var ignore_build_file_path = conf.getProperty('ignore_build_file_path', '/_next/');
66
- conf.on('trace_http_client_ip_header_key', function(newProperty) {
39
+
40
+ // Configuration event handlers
41
+ conf.on('trace_http_client_ip_header_key', function (newProperty) {
67
42
  configIpHeaderKey = newProperty;
68
43
  });
69
44
  conf.on('trace_normalize_urls', function (newProps) {
@@ -81,9 +56,6 @@ conf.on('trace_user_agent_header_key', function (newProps) {
81
56
  conf.on('trace_referer_header_key', function (newProps) {
82
57
  configRefererKey = newProps;
83
58
  });
84
- conf.on('trace_origin_url', function (newProps) {
85
- trace_origin_url = newProps;
86
- })
87
59
  conf.on('ignore_http_method', function (newProps) {
88
60
  ignore_http_method = newProps;
89
61
  })
@@ -102,15 +74,6 @@ conf.on('status_ignore_set', function (newProps) {
102
74
  conf.on('httpc_status_ignore_set', function (newProps) {
103
75
  httpc_status_ignore_set = newProps;
104
76
  })
105
- conf.on('profile_error_step_enabled', function (newProps) {
106
- profile_error_step_enabled = newProps;
107
- })
108
- conf.on('httpc_not_found_ignore', function (newProps) {
109
- httpc_not_found_ignore = newProps;
110
- })
111
- conf.on('httpc_not_found_ignore_time', function (newProps) {
112
- httpc_not_found_ignore_time = newProps;
113
- })
114
77
  conf.on('profile_http_header_ignore_keys', function (newProps) {
115
78
  profile_http_header_ignore_keys = newProps;
116
79
  })
@@ -127,127 +90,66 @@ conf.on('ignore_build_file_path', function (newProps) {
127
90
  ignore_build_file_path = newProps;
128
91
  })
129
92
 
130
- let _trace_mtrace_traceparent_key = conf.getProperty('trace_mtrace_traceparent_key', 'traceparent');
131
- let custom_trace_header_enabled = conf.getProperty('custom_trace_header_enabled', false);
132
- let custom_trace_header_key = conf.getProperty('custom_trace_header_key', null);
133
-
134
- // conf 리스너 추가
135
- conf.on('trace_mtrace_traceparent_key', function(newProperty) {
136
- _trace_mtrace_traceparent_key = newProperty;
137
- });
138
-
139
- conf.on('custom_trace_header_enabled', function(newProperty) {
140
- custom_trace_header_enabled = newProperty;
141
- });
142
-
143
- conf.on('custom_trace_header_key', function(newProperty) {
144
- custom_trace_header_key = newProperty;
145
- });
146
93
  var staticConents = function (newProps) {
147
- var x=new Set();
148
- var words = !newProps?[]:newProps.split(',');
149
- for(var i = 0 ; i < words.length ; i++) {
94
+ var x = new Set();
95
+ var words = !newProps ? [] : newProps.split(',');
96
+ for (var i = 0; i < words.length; i++) {
150
97
  var ex = words[i].trim();
151
- if(ex.length>0){
152
- if(ex.startsWith(".")){
98
+ if (ex.length > 0) {
99
+ if (ex.startsWith(".")) {
153
100
  x.add(ex);
154
- }else{
155
- x.add("."+ex );
101
+ } else {
102
+ x.add("." + ex);
156
103
  }
157
104
  }
158
105
  }
159
-
160
- _exts =x;
106
+ _exts = x;
161
107
  };
162
108
  conf.on('web_static_content_extensions', staticConents);
163
109
  staticConents(conf["web_static_content_extensions"]);
164
110
 
165
- var httpc_not_found_ignore_map = null;
166
- var httpc_not_found_ignore_url = new Set();
167
-
168
- var HttpObserver = function(agent){
111
+ var HttpObserver = function (agent) {
169
112
  this.agent = agent;
170
- this.packages = ['http','https'];
113
+ this.packages = ['http', 'https'];
171
114
  URLPatternDetector.build(true);
172
115
  };
173
116
 
174
- HttpObserver.prototype.__createTransactionObserver = function(callback, isHttps, server) {
117
+ HttpObserver.prototype.__createTransactionObserver = function (callback, isHttps, server) {
175
118
  var self = this;
176
119
  var aop = this.agent.aop;
177
120
 
178
121
  return function (req, res) {
179
122
  TraceContextManager._asyncLocalStorage.run(initCtx(req, res), () => {
180
123
  var ctx = TraceContextManager._asyncLocalStorage.getStore();
181
- if(!ctx) {
124
+ if (!ctx) {
182
125
  return callback(req, res);
183
126
  }
184
127
 
185
- PluginLoaderManager.do('httpservicestart', ctx, req, res);
186
- if(trace_origin_url === true){
187
- var originUrlHash = HashUtil.hashFromString('Origin url');
188
- var step = new MessageStep();
189
- step.hash = originUrlHash;
190
- step.start_time = ctx.getElapsedTime();
191
- // step.desc = req.url;
192
-
193
- DataTextAgent.MESSAGE.add(originUrlHash, 'Origin url');
194
- ctx.profile.add(step);
195
- }
196
-
197
- // res.on('aborted', () => {
198
- // self.__endTransaction(null, ctx, req, res)
199
- // })
200
-
201
- res.on('close', () => {
202
- // 강제로 종료할 경우
203
- self.__endTransaction(null, ctx, req, res)
204
- });
205
-
206
- aop.after(res, 'end', function(obj, args) {
207
- if(ctx == null) { return; }
208
- PluginLoaderManager.do('httpserviceend', ctx, req, res);
209
-
210
- var not_found_ignore = httpc_not_found_ignore_url.has(req.url);
211
- if (httpc_not_found_ignore && !not_found_ignore && obj.statusCode === 404) {
212
- const url_hash = HashUtil.hashFromString(req.url);
213
- const currentTime = new Date().getTime();
214
-
215
- if (!httpc_not_found_ignore_map) {
216
- httpc_not_found_ignore_map = new IntKeyLinkedMap(500, 1).setMax(500);
217
- }
218
- updateNotFoundIgnoreMap(req.url, url_hash, currentTime);
219
- }
220
-
221
- ctx.isStaticContents = isStatic(req.url);
222
- ctx.http_method = req.method;
223
- if(conf.profile_http_querystring_enabled){
224
- ctx.http_query = JSON.stringify(req.query);
225
- }
226
- ctx.http_content_type = (req.headers['content_type'] || '');
227
- ctx.status = Math.floor(obj.statusCode / 100);
228
-
229
- // 에러가 발생했지만 스택수집안했을 경우
230
- if (transaction_status_error_enable && ctx.status >= 4) {
231
- if(ctx.error.isZero())
232
- ctx.error = StatError.addError(obj.statusCode, obj.statusMessage, ctx.service_hash);
233
- ctx.statusCode = obj.statusCode;
234
- ctx.statusTitle = obj.statusMessage;
235
- ctx.statusMessage = ctx.error_message;
236
- }
237
-
238
- var shouldEndTransaction = shouldEndCurrentTransaction(not_found_ignore, ctx, res, req.route ? req.route.path : '');
239
- if (shouldEndTransaction) {
240
- self.__endTransaction(null, ctx, req, res);
241
- } else {
242
- TraceContextManager.end(ctx._id);
243
- ctx = null;
128
+ ctx.service_name = req.url ? req.url : "";
129
+ let hostname = ctx.host && ctx.host.includes(':') ? ctx.host.split(':')[0] : '';
130
+ let datas = [
131
+ hostname,
132
+ ctx.service_name,
133
+ ctx.remoteIp,
134
+ ctx.userAgentString,
135
+ ctx.referer,
136
+ String(ctx.userid),
137
+ String(ctx.isStaticContents),
138
+ req.method
139
+ ];
140
+
141
+ aop.after(res, 'end', function (obj, args) {
142
+ if (ctx == null) {
143
+ return;
244
144
  }
145
+ self.__endTransaction(null, ctx, req, res);
245
146
  });
246
147
 
247
148
  try {
149
+ AsyncSender.send_packet(PacketTypeEnum.TX_START, ctx, datas)
248
150
  return callback.apply(this, arguments);
249
151
  } catch (e) {
250
- Logger.printError("WHATAP-606", 'Hooking request failed..', e, false);
152
+ Logger.printError("WHATAP-235", 'Hooking request failed..', e, false);
251
153
  self.__endTransaction(e, ctx, req, res);
252
154
  throw e;
253
155
  }
@@ -255,13 +157,14 @@ HttpObserver.prototype.__createTransactionObserver = function(callback, isHttps,
255
157
  };
256
158
  };
257
159
 
258
- function isStatic(u){
160
+ function isStatic(u) {
259
161
  var x = u.lastIndexOf('.');
260
- if(x<=0) return false;
162
+ if (x <= 0) return false;
261
163
 
262
164
  var ext = u.substring(x);
263
165
  return _exts.has(ext);
264
166
  }
167
+
265
168
  function initCtx(req, res) {
266
169
  /*url이 없으면 추적하지 않는다*/
267
170
  if(!req.url) { return null; }
@@ -274,70 +177,11 @@ function initCtx(req, res) {
274
177
  }
275
178
 
276
179
  var ctx = TraceContextManager.start();
277
- if(ctx == null) { return null; }
278
-
279
- req.__ctx_id__ = ctx._id;
280
-
281
- var url = req.url,
282
- index = url.indexOf('?');
283
- if(index >= 0) {
284
- url = url.slice(0, index);
285
- }
286
- ctx.service_name = URLPatternDetector.normalize(url);
287
- try {
288
- if(conf.trace_service_port_enabled === true && server.address()) {
289
- ctx.service_name += ' {' + server.address().port + '}';
290
- }
291
- } catch(e){
292
- }
293
-
294
- try {
295
- if(conf.trace_transaction_name_header_key != null) {
296
- ctx.service_name = req.headers[conf.trace_transaction_name_header_key] + ctx.service_name;
297
- }
298
- } catch(e) {
299
- }
300
-
301
- ctx.service_hash = HashUtil.hashFromString(ctx.service_name);
302
- // DataTextAgent.SERVICE.add(ctx.service_hash, ctx.service_name);
303
-
304
- ctx.isStaticContents = isStatic(req.url);
305
-
306
- var referer = undefined;
307
- if(configRefererKey && req.headers[configRefererKey]){
308
- referer = req.headers[configRefererKey];
309
- }else if(req.headers.referer){
310
- referer = req.headers.referer;
311
- }
312
- if (referer) {
313
- ctx.referer = HashUtil.hashFromString(referer);
314
- DataTextAgent.REFERER.add(ctx.referer, referer);
315
- }
316
-
317
- if(configUserAgentKey && req.headers[configUserAgentKey]){
318
- ctx.userAgentString = req.headers[configUserAgentKey];
319
- }else if(req.headers['user-agent']){
320
- ctx.userAgentString = req.headers['user-agent'];
321
- }
322
- if(ctx.userAgentString){
323
- ctx.userAgent = HashUtil.hashFromString(ctx.userAgentString);
324
- DataTextAgent.USERAGENT.add(ctx.userAgent, ctx.userAgentString);
325
- }
326
-
327
- ctx.http_host=req.headers.host;
328
- if (ctx.http_host) {
329
- ctx.http_host_hash = HashUtil.hashFromString(ctx.http_host);
330
- DataTextAgent.HTTP_DOMAIN.add(ctx.http_host_hash, ctx.http_host);
180
+ if (ctx == null) {
181
+ return null;
331
182
  }
332
183
 
333
- ctx.originUrl = req.url;
334
- ctx.start_malloc = ResourceProfile.getUsedHeapSize();
335
- ctx.start_cpu = ResourceProfile.getCPUTime();
336
- ctx.http_method = req.method;
337
- if(conf.profile_http_querystring_enabled){
338
- ctx.http_query = JSON.stringify(req.query);
339
- }
340
- ctx.http_content_type = (req.headers['content_type'] || '');
184
+ // RemoteIP
341
185
  var remote_addr;
342
186
  try {
343
187
  remote_addr = req.headers[configIpHeaderKey] || req.connection.remoteAddress || "0.0.0.0";
@@ -359,9 +203,27 @@ function initCtx(req, res) {
359
203
  MeterUsers.add(ctx.userid);
360
204
  break;
361
205
  }
362
-
363
206
  } catch (e) {
364
207
  }
208
+
209
+ // Referer
210
+ var referer = undefined;
211
+ if(configRefererKey && req.headers[configRefererKey]){
212
+ ctx.referer = req.headers[configRefererKey];
213
+ }else if(req.headers.referer){
214
+ ctx.referer = req.headers.referer;
215
+ }
216
+
217
+ // UserAgent
218
+ if(configUserAgentKey && req.headers[configUserAgentKey]){
219
+ ctx.userAgentString = req.headers[configUserAgentKey];
220
+ }else if(req.headers['user-agent']){
221
+ ctx.userAgentString = req.headers['user-agent'];
222
+ }
223
+
224
+ // Host
225
+ ctx.host = req.headers.host;
226
+
365
227
  /************************************/
366
228
  /* Header / param Trace */
367
229
  /************************************/
@@ -373,19 +235,26 @@ function initCtx(req, res) {
373
235
  header_enabled = false;
374
236
  }
375
237
  }
238
+ /************************************/
239
+ /* Header / param Trace */
240
+ /************************************/
241
+ var header_enabled = false;
242
+ if (conf.profile_http_header_enabled === true && req.headers) {
243
+ header_enabled = true;
244
+ var prefix = conf.profile_header_url_prefix;
245
+ if (prefix && ctx.service_name.indexOf(prefix) < 0) {
246
+ header_enabled = false;
247
+ }
248
+ }
376
249
 
377
- if(header_enabled) {
378
- var step = new MessageStep();
379
- step.hash = HashUtil.hashFromString("HTTP-HEADERS");
380
- step.start_time = ctx.getElapsedTime();
381
-
250
+ if (header_enabled) {
382
251
  var header_ignore_key_set = new Set();
383
- if(profile_http_header_ignore_keys) {
252
+ if (profile_http_header_ignore_keys) {
384
253
  header_ignore_key_set = new Set(profile_http_header_ignore_keys.split(','));
385
254
  }
386
255
 
387
- try{
388
- step.desc = Object.keys(req.headers).map(function (key) {
256
+ try {
257
+ var headerDesc = Object.keys(req.headers).map(function (key) {
389
258
  if (!header_ignore_key_set.has(key)) {
390
259
  return `${key}=${req.headers[key]}`;
391
260
  }
@@ -393,81 +262,40 @@ function initCtx(req, res) {
393
262
  if (element) return element
394
263
  }).join('\n');
395
264
 
396
- DataTextAgent.MESSAGE.add(step.hash, "HTTP-HEADERS");
397
- ctx.profile.push(step);
398
- }catch (e) {
399
- step = null;
400
- header_ignore_key_set = null;
401
- Logger.printError('WHATAP-614', 'Header parsing error', e, false);
265
+ if (headerDesc) {
266
+ let headerDatas = ['HTTP-HEADERS', 'HTTP-HEADERS', headerDesc];
267
+ ctx.start_time = Date.now();
268
+ AsyncSender.send_packet(PacketTypeEnum.TX_MSG, ctx, headerDatas);
269
+ }
270
+ } catch (e) {
271
+ Logger.printError('WHATAP-236', 'Header parsing error', e, false);
402
272
  }
403
273
  }
274
+
404
275
  /************************************/
405
276
  /* Multi Server Transaction Trace */
406
277
  /************************************/
407
- if(conf.getProperty('mtrace_enabled', false)) {
408
- // traceparent 헤더 처리 (W3C Trace Context 표준)
409
- const traceparentKey = req.headers[conf._trace_mtrace_traceparent_key];
410
- let hasTraceparentKey = false;
411
- let traceparentStepId = 0;
412
-
413
- if (traceparentKey) {
414
- hasTraceparentKey = true;
415
- const parts = traceparentKey.trim().split('-');
416
-
417
- if (parts.length >= 4) {
418
- // parts[0]: version (00)
419
- // parts[1]: 32자리 16진수 trace ID
420
- // parts[2]: 16자리 16진수 parent ID (span ID)
421
- // parts[3]: 2자리 16진수 trace flags
422
-
423
- const mcallerTraceIdValue = parts[1];
424
- ctx.mcallerTraceparentValue = mcallerTraceIdValue;
425
-
426
- try {
427
- // trace ID의 뒤 16자리를 가져와서 long으로 변환
428
- const mtidHex = mcallerTraceIdValue.substring(16);
429
- const mtidLong = Long.fromString(mtidHex, true, 16);
430
- ctx.mtid = mtidLong;
431
-
432
- if (!ctx.mtid.isZero()) {
433
- ctx.mtid_build_checked = true;
434
- }
435
- } catch (e) {
436
- Logger.printError('WHATAP-851', 'traceparent parse error', e, true);
437
- }
438
-
439
- try {
440
- // parent span ID 추출
441
- const parentSpanId = Long.fromString(parts[2], true, 16);
442
- ctx.mcaller_stepId = parentSpanId;
443
- traceparentStepId = parentSpanId;
444
- } catch (e) {
445
- Logger.printError('WHATAP-851', 'traceparent span id parse error', e, true);
446
- }
447
- }
448
- }
449
-
450
- // WhaTap 고유 헤더 처리
451
- const poid = req.headers['x-wtap-po'];
278
+ if (conf.getProperty('mtrace_enabled', false)) {
279
+ var poid = req.headers['x-wtap-po'];
452
280
  if (poid != null) {
453
281
  ctx.setCallerPOID(poid);
454
-
455
282
  try {
456
- const mt_caller = req.headers[conf._trace_mtrace_caller_key];
457
- if(mt_caller) {
458
- const x = mt_caller.indexOf(',');
283
+ var mt_caller = req.headers[conf._trace_mtrace_caller_key];
284
+ if (mt_caller) {
285
+ var x = mt_caller.indexOf(',');
459
286
  if (x > 0) {
460
287
  ctx.mtid = Hexa32.toLong32(mt_caller.substring(0, x));
461
288
  ctx.mtid_build_checked = true;
462
- const y = mt_caller.indexOf(',', x + 1);
289
+ var y = mt_caller.indexOf(',', x + 1);
463
290
  if (y > 0) {
464
291
  ctx.mdepth = parseInt(mt_caller.substring(x + 1, y));
465
- const z = mt_caller.indexOf(',', y + 1);
292
+ var z = mt_caller.indexOf(',', y + 1);
466
293
  if (z < 0) {
467
294
  ctx.mcaller_txid = Hexa32.toLong32(mt_caller.substring(y + 1));
468
295
  } else {
469
296
  ctx.mcaller_txid = Hexa32.toLong32(mt_caller.substring(y + 1, z));
470
- const z2 = mt_caller.indexOf(',', z + 1);
297
+
298
+ var z2 = mt_caller.indexOf(',', z + 1);
471
299
  if (z2 < 0) {
472
300
  ctx.mcaller_stepId = Hexa32.toLong32(mt_caller.substring(z + 1));
473
301
  } else {
@@ -477,91 +305,57 @@ function initCtx(req, res) {
477
305
  }
478
306
  }
479
307
  }
480
-
481
308
  if (conf.stat_mtrace_enabled) {
482
- const inf = req.headers[conf._trace_mtrace_spec_key1];
483
- if(inf != null && inf.length > 0) {
484
- const px = inf.indexOf(',');
309
+ var inf = req.headers[conf._trace_mtrace_spec_key1];
310
+ if (inf != null && inf.length > 0) {
311
+ var px = inf.indexOf(',');
485
312
  ctx.mcaller_spec = inf.substring(0, px);
486
313
  ctx.mcaller_url = inf.substring(px + 1);
314
+ ctx.mcaller_url_hash = HashUtil.hashFromString(ctx.mcaller_url);
487
315
  }
488
316
  }
489
- } catch(e) {
490
- Logger.printError('WHATAP-850', 'Multi Server Transaction', e, true);
491
- }
492
- }
493
-
494
- // Gateway가 header를 그대로 전달하는 경우 처리
495
- if (hasTraceparentKey) {
496
- if (!traceparentStepId.equals(ctx.mcaller_stepId)) {
497
- ctx.mcaller_stepId = traceparentStepId;
498
- ctx.mcaller_txid = Long.ZERO;
317
+ } catch (e) {
318
+ Logger.printError('WHATAP-237', 'Multi Server Transaction ', e, true);
499
319
  }
500
320
  }
501
321
  }
502
322
 
503
- var poid=req.headers['x-wtap-po'];
504
- if (poid != null) {
505
- ctx.setCallerPOID(poid);
506
- try{
507
- var mt_caller=req.headers[conf._trace_mtrace_caller_key];
508
- if(mt_caller){
509
- var x = mt_caller.indexOf(',');
510
- if (x > 0) {
511
- ctx.mtid = Hexa32.toLong32(mt_caller.substring(0, x));
512
- ctx.mtid_build_checked = true;
513
- var y = mt_caller.indexOf(',', x + 1);
514
- if (y > 0) {
515
- ctx.mdepth = parseInt(mt_caller.substring(x + 1, y));
516
- var z = mt_caller.indexOf(',', y + 1);
517
- if (z < 0) {
518
- ctx.mcaller_txid = Hexa32.toLong32(mt_caller.substring(y + 1));
519
- } else {
520
- ctx.mcaller_txid = Hexa32.toLong32(mt_caller.substring(y + 1, z));
323
+ return ctx;
324
+ };
521
325
 
522
- var z2 = mt_caller.indexOf(',', z + 1);
523
- if (z2 < 0) {
524
- ctx.mcaller_stepId = Hexa32.toLong32(mt_caller.substring(z + 1));
525
- } else {
526
- ctx.mcaller_stepId = Hexa32.toLong32(mt_caller.substring(z + 1, z2));
527
- }
528
- }
529
- }
530
- }
531
- }
532
- if (conf.stat_mtrace_enabled) {
533
- var inf=req.headers[conf._trace_mtrace_spec_key1];
534
- if(inf != null && inf.length > 0){
535
- var px = inf.indexOf(',');
536
- ctx.mcaller_spec = inf.substring(0, px);
537
- ctx.mcaller_url = inf.substring(px + 1);
538
- }
539
- }
540
- } catch(e) {
541
- Logger.printError('WHATAP-850', 'Multi Server Transaction ', e, true);
542
- }
326
+ function interceptorError(statusCode, error, ctx) {
327
+ if (!ctx) {
328
+ return;
543
329
  }
544
330
 
545
- return ctx;
546
- };
331
+ ctx.status = statusCode;
332
+ let errors = [];
333
+ let error_message = 'Request failed with status code ';
334
+ if (statusCode >= 400 && !ctx.error) {
335
+ ctx.error = 1;
336
+
337
+ errors.push(error.class)
338
+ if(error.message)
339
+ errors.push(error.message)
340
+ else
341
+ errors.push(error_message + statusCode);
547
342
 
548
- HttpObserver.prototype.__endTransaction = function(error, ctx, req, res) {
549
- if(ctx == null || TraceContextManager.isExist(ctx._id) === false) { return; }
343
+ AsyncSender.send_packet(PacketTypeEnum.TX_ERROR, ctx, errors);
344
+ }
345
+ }
550
346
 
347
+ HttpObserver.prototype.__endTransaction = function (error, ctx, req, res) {
551
348
  var param_enabled = false;
552
- if(conf.profile_http_parameter_enabled === true) {
349
+ if (conf.profile_http_parameter_enabled === true) {
553
350
  param_enabled = true;
554
351
  var prefix = conf.profile_http_parameter_url_prefix;
555
- if(prefix && ctx.service_name.indexOf(prefix) < 0) {
352
+ if (prefix && ctx.service_name.indexOf(prefix) < 0) {
556
353
  param_enabled = false;
557
354
  }
558
355
  }
559
356
 
560
357
  if (param_enabled && req.query && Object.keys(req.query).length > 0) {
561
358
  const query = req.query;
562
- let secureMsgStep = new SecureMsgStep(ctx.getElapsedTime());
563
- secureMsgStep.hash = HashUtil.hashFromString("HTTP-PARAMETERS");
564
-
565
359
  const profileHttpParameterKeysSet = profile_http_parameter_keys ? new Set(profile_http_parameter_keys.split(',')) : null;
566
360
 
567
361
  try {
@@ -571,218 +365,67 @@ HttpObserver.prototype.__endTransaction = function(error, ctx, req, res) {
571
365
  .join('\n');
572
366
 
573
367
  if (desc) {
574
- const crc = { value: 0 };
575
- secureMsgStep.value = toParamBytes(desc, crc);
576
- secureMsgStep.crc = crc.value;
577
-
578
- DataTextAgent.MESSAGE.add(secureMsgStep.hash, "HTTP-PARAMETERS");
579
- ctx.profile.push(secureMsgStep);
580
- } else {
581
- secureMsgStep = null;
368
+ let paramDatas = ['HTTP-PARAMETERS', req.method, desc];
369
+ AsyncSender.send_packet(PacketTypeEnum.TX_SECURE_MSG, ctx, paramDatas);
582
370
  }
583
371
  } catch (e) {
584
- secureMsgStep = null;
585
- Logger.printError('WHATAP-613', 'Parameter parsing error', e, false);
372
+ Logger.printError('WHATAP-238', 'Parameter parsing error', e, false);
586
373
  }
587
374
  }
588
375
 
589
- if(profile_error_step_enabled && ctx.statusMessage){
590
- var step = new MessageStep();
591
- var title = ctx.statusTitle ? ctx.statusTitle : "EXCEPTION";
592
- step.hash = HashUtil.hashFromString(title);
593
- step.start_time = ctx.getElapsedTime();
594
- step.desc = ctx.statusMessage;
595
- DataTextAgent.MESSAGE.add(step.hash, title);
596
- ctx.profile.push(step);
597
- }
598
-
599
- if(error) {
600
- TraceContextManager.end(ctx != null ? ctx._id : null);
376
+ if (error) {
377
+ TraceContextManager.end(ctx != null ? ctx.id : null);
601
378
  ctx = null;
602
379
  return;
603
380
  }
604
381
 
605
- // if(ctx == null || TraceContextManager.isExist(ctx._id) === false) { return; }
382
+ if (ctx == null || TraceContextManager.isExist(ctx.id) === false) {
383
+ return;
384
+ }
606
385
 
607
- if(ctx.isStaticContents !== true && conf._trace_ignore_url_set[ctx.service_hash]){
386
+ if (ctx.isStaticContents !== true && conf._trace_ignore_url_set[ctx.service_hash]) {
608
387
  ctx.isStaticContents = true;
609
388
  }
610
389
 
611
- if(conf._is_trace_ignore_url_prefix === true && ctx.service_name.startsWith(conf.trace_ignore_url_prefix) === true){
390
+ if (conf._is_trace_ignore_url_prefix === true && ctx.service_name.startsWith(conf.trace_ignore_url_prefix) === true) {
612
391
  ctx.isStaticContents = true;
613
392
  }
614
393
 
615
- if(ctx.isStaticContents){
616
- TraceContextManager.end(ctx._id);
394
+ if (ctx.isStaticContents) {
395
+ TraceContextManager.end(ctx.id);
617
396
  ctx = null;
618
397
  return;
619
398
  }
620
399
 
621
400
  try {
622
- var profile = new ProfilePack();
623
- var wtx = new TxRecord();
624
- // profile.time = ctx.start_time;
625
- wtx.endTime = DateUtil.currentTime();
626
- profile.time = wtx.endTime;
627
- wtx.elapsed = ctx.getElapsedTime();
628
-
629
- ctx.service_hash = HashUtil.hashFromString(ctx.service_name);
630
- DataTextAgent.SERVICE.add(ctx.service_hash, ctx.service_name);
631
-
632
- wtx.service = ctx.service_hash;
633
- wtx.cpuTime = ResourceProfile.getCPUTime() - ctx.start_cpu;
634
- wtx.malloc = ResourceProfile.getUsedHeapSize()-ctx.start_malloc;
635
- if(wtx.malloc < 0) { wtx.malloc = 0; }
636
- wtx.originUrl = ctx.originUrl;
637
-
638
- wtx.cipher = HashUtil.hash(ParamSecurity.key);
639
- wtx.seq = ctx.txid;
640
- wtx.sqlCount = ctx.sql_count;
641
- wtx.sqlTime = ctx.sql_time;
642
- wtx.sqlFetchCount = ctx.rs_count;
643
- wtx.sqlFetchTime = parseInt(ctx.rs_time);
644
- wtx.ipaddr = ctx.remoteIp;
645
- wtx.userid = ctx.userid;
646
-
647
- if (ctx.error.isZero() === false) {
648
- wtx.error = ctx.error;
649
- wtx.errorLevel = EventLevel.WARNING;
650
- }
651
- wtx.userAgent = ctx.userAgent;
652
- wtx.referer = ctx.referer;
653
-
654
- wtx.httpcCount = ctx.httpc_count;
655
- wtx.httpcTime = ctx.httpc_time;
656
- wtx.status = ctx.status;
657
-
658
- wtx.http_method=TxRecord.HTTP_METHOD[ctx.http_method] || TxRecord.WEB_GET;
659
- wtx.http_host = ctx.http_host;
660
- wtx.mtid=ctx.mtid;
661
- wtx.mdepth=ctx.mdepth;
662
- wtx.mcaller=ctx.mcaller_txid;
663
- wtx.mcallerStepId = ctx.mcaller_stepId;
664
- wtx.mcaller_pcode = ctx.mcaller_pcode;
665
- wtx.mcaller_okind = ctx.mcaller_okind;
666
- wtx.mcaller_oid = ctx.mcaller_oid;
667
-
668
- wtx.appctx = "";
669
- wtx.txName = ctx.service_name;
670
- if(ctx.error_class) wtx.error_class = ctx.error_class;
671
- if(ctx.error_message) wtx.error_message = ctx.error_message;
672
-
673
- if(conf.getProperty('txtext_txname_enabled', true)){
674
- wtx.txName = ctx.service_name;
675
- }
676
-
677
- MeterService.add(wtx.service, wtx.elapsed,
678
- wtx.errorLevel, ctx.mcaller_pcode, ctx.mcaller_okind, ctx.mcaller_oid);
679
-
680
- profile.oid = SecurityMaster.OID;
681
- profile.service = wtx;
682
- if(Boolean(conf.reqlog_enabled) == true) {
683
- ctx.endTime = wtx.endTime;
684
- ctx.elapsed = wtx.elapsed;
685
- RequestLog.setRecord(ctx);
686
- }
687
- //duplicated executed... so end() first
688
- TraceContextManager.end(ctx._id);
689
- setTimeout(function () {
690
- DataProfileAgent.sendProfile(ctx, profile, false);
691
- TraceContextManager.end(ctx._id);
692
- ctx = null;
693
- }, 100);
401
+ ctx.start_time = Date.now();
402
+ let datas = [os.hostname(), ctx.service_name, ctx.mtid, ctx.mdepth, ctx.mcaller_txid,
403
+ ctx.mcaller_pcode, ctx.mcaller_spec, String(ctx.mcaller_url_hash), ctx.status];
404
+ ctx.elapsed = Date.now() - ctx.start_time;
405
+ AsyncSender.send_packet(PacketTypeEnum.TX_END, ctx, datas);
694
406
 
407
+ TraceContextManager.end(ctx.id);
695
408
  } catch (e) {
696
- Logger.printError('WHATAP-607', 'End transaction error..', e, false);
697
- TraceContextManager.end(ctx._id);
409
+ Logger.printError('WHATAP-239', 'End transaction error..', e, false);
410
+ TraceContextManager.end(ctx.id);
698
411
  ctx = null;
699
412
  }
700
-
701
413
  };
702
414
 
703
- var transfer_poid;
704
- function transferPOID(ctx) {
705
- if (transfer_poid)
706
- return transfer_poid;
707
- transfer_poid=Hexa32.toString32(SecurityMaster.PCODE)+','
708
- +Hexa32.toString32(SecurityMaster.OKIND)+','+Hexa32.toString32(SecurityMaster.OID);
709
- return transfer_poid;
710
- }
415
+ // interTxTraceAutoOn function moved to util/trace-helper.js
711
416
 
712
- function transferMTID_CALLERTX(ctx) {
713
- if (ctx.transfer_id)
714
- return ctx.transfer_id;
715
- var x = Hexa32.toString32(ctx.mtid) + ',' + (ctx.mdepth + 1) + ',' + Hexa32.toString32(ctx.txid);
716
- ctx.transfer_id = x;
717
- return ctx.transfer_id;
718
- }
719
- function transferSPEC_URL(ctx) {
720
- if (ctx.transfer_info)
721
- return ctx.transfer_info;
722
- var x = conf.mtrace_spec + ',' + ctx.service_hash;
723
- ctx.transfer_info = x;
724
- return ctx.transfer_info;
725
- }
726
- var check_seq = 1;
727
- function interTxTraceAutoOn(ctx) {
728
- if (conf.mtrace_enabled ==false || ctx.httpc_checked || ctx.mtid.isZero()===false)
729
- return;
730
- ctx.httpc_checked = true;
731
- if(conf.mtrace_rate>=100){
732
- ctx.mtid = KeyGen.next();
733
- return;
734
- }
735
- check_seq++;
736
- switch (Math.floor(conf.mtrace_rate / 10)) {
737
- case 10:
738
- ctx.mtid = KeyGen.next();
739
- break;
740
- case 9:
741
- if (check_seq % 10 !== 0)
742
- ctx.mtid = KeyGen.next();
743
- break;
744
- case 8:
745
- if (check_seq % 5 !== 0)
746
- ctx.mtid = KeyGen.next();
747
- break;
748
- case 7:
749
- if (check_seq % 4 !== 0)
750
- ctx.mtid = KeyGen.next();
751
- break;
752
- case 6:
753
- if (check_seq % 3 !== 0)
754
- ctx.mtid = KeyGen.next();
755
- break;
756
- case 5:
757
- if (check_seq % 2 === 0)
758
- ctx.mtid = KeyGen.next();
759
- break;
760
- case 4:
761
- if (check_seq % 3 === 0 || check_seq % 5 === 0)
762
- ctx.mtid = KeyGen.next();
763
- break;
764
- case 3:
765
- if (check_seq % 4 === 0 || check_seq % 5 === 0)
766
- ctx.mtid = KeyGen.next();
767
- break;
768
- case 2:
769
- if (check_seq % 5 === 0)
770
- ctx.mtid = KeyGen.next();
771
- break;
772
- case 1:
773
- if (check_seq % 10 === 0)
774
- ctx.mtid = KeyGen.next();
775
- break;
776
- }
777
- }
778
- HttpObserver.prototype.inject = function( mod, moduleName ) {
417
+ HttpObserver.prototype.inject = function (mod, moduleName) {
779
418
  var self = this;
780
419
  var aop = self.agent.aop;
781
420
 
782
- if(mod.__whatap_observe__) { return; }
421
+ if (mod.__whatap_observe__) {
422
+ return;
423
+ }
783
424
  mod.__whatap_observe__ = true;
784
425
  Logger.initPrint("HttpObserver");
785
- if( conf.getProperty('profile_enabled', true) === false ) { return; }
426
+ if (conf.getProperty('profile_enabled', true) === false) {
427
+ return;
428
+ }
786
429
 
787
430
  aop.after(mod, 'createServer', function (obj, args, ret) {
788
431
  aop.before(ret, 'listen', function (obj, args) {
@@ -805,102 +448,83 @@ HttpObserver.prototype.inject = function( mod, moduleName ) {
805
448
  }
806
449
  );
807
450
 
808
- if( conf.getProperty('httpc_enabled', true) === false ) { return; }
451
+ if (conf.getProperty('httpc_enabled', true) === false) {
452
+ return;
453
+ }
809
454
 
810
455
  shimmer.wrap(mod, 'request', function (original) {
811
456
  return function wrappedRequest(options, callback) {
812
457
  var ctx = TraceContextManager.getCurrentContext();
813
- if(!ctx || (!options.host && !options.hostname)){
458
+ if (!ctx || (!options.host && !options.hostname)) {
814
459
  return original.apply(this, arguments);
815
460
  }
816
461
 
817
462
  var isHttpRepeat = false;
818
- if(moduleName === 'https'){
463
+ if (moduleName === 'https') {
819
464
  options.__isHttps = true;
820
465
  }
821
- if(moduleName === 'http' && options.__isHttps){
466
+ if (moduleName === 'http' && options.__isHttps) {
822
467
  isHttpRepeat = true;
823
468
  }
469
+ ctx.start_time = Date.now();
824
470
 
825
- var step = new HttpStepX();
826
- step.start_time = ctx.getElapsedTime();
827
-
828
- if(!isHttpRepeat){
829
- if(options.method === 'OPTION'){
471
+ if (!isHttpRepeat) {
472
+ if (options.method === 'OPTION') {
830
473
  return original.apply(this, arguments);
831
474
  }
832
- try{
833
- interTxTraceAutoOn(ctx);
834
- if(conf.getProperty('mtrace_enabled', false)){
835
- if(options.headers){
836
- options.headers['x-wtap-po'] = transferPOID(ctx);
837
- }else{
838
- options.headers = {'x-wtap-po': transferPOID(ctx)};
475
+ try {
476
+ TraceHelper.interTxTraceAutoOn(ctx);
477
+ if (conf.getProperty('mtrace_enabled', false)) {
478
+ if (options.headers) {
479
+ options.headers['x-wtap-po'] = Transfer.POID();
480
+ } else {
481
+ options.headers = {'x-wtap-po': Transfer.POID()};
839
482
  }
840
- if(conf.stat_mtrace_enabled){
841
- options.headers[conf._trace_mtrace_spec_key1]=transferSPEC_URL(ctx);
483
+ if (conf.stat_mtrace_enabled) {
484
+ options.headers[conf._trace_mtrace_spec_key1] = Transfer.SPEC_URL(ctx);
842
485
  }
843
- if(ctx.mtid.isZero()===false){
844
- options.headers[conf._trace_mtrace_caller_key]=transferMTID_CALLERTX(ctx);
486
+ if (!ctx.mtid.isZero()) {
487
+ options.headers[conf._trace_mtrace_caller_key] = Transfer.MTID_CALLERTX(ctx);
845
488
  }
489
+
490
+ ctx.mcallee = KeyGen.next();
491
+ options.headers[conf._trace_mtrace_callee_key] = Hexa32.toString32(ctx.mcallee);
846
492
  }
847
493
 
848
494
  ctx.httpc_url = options.path || '/';
849
495
  ctx.httpc_host = options.host || options.hostname || '';
850
496
  ctx.httpc_port = options.port || -1;
851
-
852
- ctx.footprint('Http Call Start');
853
-
854
- if (ctx.httpc_port < 0) { ctx.httpc_port = 80 };
855
-
856
- if(conf.getProperty('profile_httpc_start_step_enabled', false)){
857
- step.elapsed = ctx.getElapsedTime() - step.start_time;
858
- step.url = HashUtil.hashFromString(ctx.httpc_url);
859
- DataTextAgent.HTTPC_URL.add(step.url, ctx.httpc_url);
860
- step.host = HashUtil.hashFromString(ctx.httpc_host);
861
- DataTextAgent.HTTPC_HOST.add(step.host, ctx.httpc_host);
862
- step.port = ctx.httpc_port;
863
-
864
- ctx.active_httpc_hash = step.url;
865
- ctx.profile.push(step);
866
- endHttpc(ctx, step);
497
+ ctx.active_httpc_hash = true;
498
+
499
+ if (ctx.httpc_port < 0) {
500
+ ctx.httpc_port = 80
867
501
  }
868
- }catch (e) {
869
- Logger.printError('WHATAP-852', 'Http Repeat ', e, true);
502
+ } catch (e) {
503
+ Logger.printError('WHATAP-240', 'Http Setup Error', e, true);
870
504
  return original.apply(this, arguments);
871
505
  }
872
- }else{
506
+ } else {
873
507
  return original.apply(this, arguments);
874
508
  }
875
509
 
876
510
  var wrappedCallback;
877
511
  if (typeof callback === 'function') {
878
- wrappedCallback = function(response) {
879
- if (TraceContextManager.resume(ctx._id) === null) {
512
+ wrappedCallback = function (response) {
513
+ if (TraceContextManager.resume(ctx.id) === null) {
880
514
  return callback.apply(this, arguments);
881
515
  }
882
516
 
883
- response.on('end', function() {
884
- step.elapsed = ctx.getElapsedTime() - step.start_time;
885
- step.url = HashUtil.hashFromString(ctx.httpc_url);
886
- DataTextAgent.HTTPC_URL.add(step.url, ctx.httpc_url);
887
- step.host = HashUtil.hashFromString(ctx.httpc_host);
888
- DataTextAgent.HTTPC_HOST.add(step.host, ctx.httpc_host);
889
- step.port = ctx.httpc_port;
890
-
517
+ response.on('end', function () {
518
+ // HTTP 클라이언트 에러 처리 - Python 스타일로 단순화
891
519
  if (response.statusCode >= 400 && transaction_status_error_enable) {
892
- step.error = StatError.addError(response.statusCode, response.statusMessage,
893
- ctx.service_hash, TextTypes.HTTPC_URL, step.url);
894
- if (ctx.error.isZero()) {
895
- ctx.error = step.error;
896
- ctx.statusCode = response.statusCode;
897
- ctx.statusMessage = response.statusMessage;
520
+ let error = {
521
+ class: response.statusMessage,
522
+ message: ''
898
523
  }
524
+ interceptorError(response.statusCode, error, ctx);
899
525
  }
900
526
 
901
- ctx.active_httpc_hash = step.url;
902
- ctx.profile.push(step);
903
- endHttpc(ctx, step);
527
+ endHttpc(ctx);
904
528
  });
905
529
 
906
530
  return callback.apply(this, arguments);
@@ -908,36 +532,32 @@ HttpObserver.prototype.inject = function( mod, moduleName ) {
908
532
  }
909
533
 
910
534
  var req = original.apply(this, [options, wrappedCallback]);
911
- var httpc_url = options.path
912
535
 
913
536
  req.on('error', function (err) {
914
- if (TraceContextManager.resume(ctx._id) === null) { return; }
915
- const isIgnoreHttpc = shouldIgnoreError(
916
- err.code,
917
- httpc_url,
918
- httpc_status_ignore,
919
- httpc_status_ignore_set);
920
-
921
- if (!isIgnoreHttpc && transaction_status_error_enable && step.error.isZero()) {
922
- ctx.is_httpc_error = true;
923
-
924
- step.error = StatError.addError(
925
- err.code,
926
- err.message,
927
- ctx.service_hash,
928
- TextTypes.HTTPC_URL,
929
- step.url
930
- );
931
-
932
- if (ctx.error.isZero()) {
933
- ctx.error = step.error;
934
- ctx.statusCode = err.code;
935
- ctx.statusMessage = ctx.error_message = err.message;
537
+ if (TraceContextManager.resume(ctx.id) === null) {
538
+ return;
539
+ }
540
+
541
+ const isIgnoreHttpc = shouldIgnoreError(err.code, ctx.httpc_url, httpc_status_ignore, httpc_status_ignore_set);
542
+
543
+ const networkErrorToStatusCode = {
544
+ 'ECONNREFUSED': 503,
545
+ 'ETIMEDOUT': 504,
546
+ 'ENOTFOUND': 502,
547
+ 'ECONNRESET': 503,
548
+ 'EPIPE': 503,
549
+ 'EHOSTUNREACH': 503,
550
+ };
551
+ const statusCode = networkErrorToStatusCode[err.code] || 500;
936
552
 
553
+ if (!isIgnoreHttpc && transaction_status_error_enable) {
554
+ let error = {
555
+ class: err.code,
556
+ message: err.message || ''
937
557
  }
558
+ interceptorError(statusCode, error, ctx);
938
559
  }
939
-
940
- endHttpc(ctx, step);
560
+ endHttpc(ctx);
941
561
  });
942
562
 
943
563
  shimmer.wrap(req, 'write', function (original) {
@@ -953,18 +573,15 @@ HttpObserver.prototype.inject = function( mod, moduleName ) {
953
573
  if (arguments[0] instanceof Buffer) {
954
574
  bodyData = arguments[0].toString('utf8');
955
575
  }
956
- if(bodyData){
957
- var step = new MessageStep();
958
- step.hash = HashUtil.hashFromString("HTTPC-REQUEST-BODY");
959
- step.start_time = ctx.getElapsedTime();
960
- step.desc = bodyData;
961
- DataTextAgent.MESSAGE.add(step.hash, "HTTPC-REQUEST-BODY");
962
- ctx.profile.push(step);
576
+ if (bodyData) {
577
+ console.log(`body Data: ${bodyData}`)
578
+ let paramDatas = ['HTTP-PARAMETERS', options.method, bodyData];
579
+ AsyncSender.send_packet(PacketTypeEnum.TX_SECURE_MSG, ctx, paramDatas);
963
580
  }
964
581
  }
965
582
  }
966
583
  } catch (e) {
967
- Logger.printError('WHATAP-615', 'HTTP Write hook failed', e, false);
584
+ Logger.printError('WHATAP-241', 'HTTP Write hook failed', e, false);
968
585
  }
969
586
  return original.apply(this, arguments);
970
587
  }
@@ -974,18 +591,18 @@ HttpObserver.prototype.inject = function( mod, moduleName ) {
974
591
  }
975
592
  });
976
593
 
977
- function endHttpc(ctx, step) {
978
- if(ctx == null || step == null) { return; }
979
-
980
- step.elapsed = ctx.getElapsedTime() - step.start_time;
981
- TraceHttpc.isSlowHttpc(ctx, step);
982
-
983
- ctx.httpc_count++;
984
- ctx.httpc_time += step.elapsed;
594
+ // HTTP 클라이언트 종료 처리 - 단순화
595
+ function endHttpc(ctx) {
596
+ if (ctx == null) {
597
+ return;
598
+ }
985
599
 
986
- MeterHttpC.add(step.host, step.elapsed, step.error.isZero()===false);
987
- StatHttpc.addHttpcTime(ctx.service_hash, step.url, step.host, step.port, step.elapsed, step.error.isZero()===false);
988
- ctx.footprint('Http Call Done');
600
+ ctx.active_httpc_hash = false;
601
+ let urls = `${ctx.httpc_host}:${ctx.httpc_port}${ctx.httpc_url}`;
602
+ let httpcDatas = [urls, ctx.mcallee];
603
+ ctx.elapsed = Date.now() - ctx.start_time;
604
+ TraceHttpc.isSlowHttpc(ctx);
605
+ AsyncSender.send_packet(PacketTypeEnum.TX_HTTPC, ctx, httpcDatas);
989
606
  }
990
607
  };
991
608
 
@@ -1008,51 +625,4 @@ function shouldIgnoreError(statusCode, url, statusCodeIgnore, statusIgnoreSet) {
1008
625
  return false;
1009
626
  }
1010
627
 
1011
- function updateNotFoundIgnoreMap(url, url_hash, currentTime) {
1012
- var ignore_value = httpc_not_found_ignore_map.get(url_hash) || {
1013
- count: 0, start_time: currentTime, last_time: currentTime, url: url
1014
- };
1015
-
1016
- ignore_value.count++;
1017
- ignore_value.last_time = currentTime;
1018
-
1019
- if ((ignore_value.last_time - ignore_value.start_time) > httpc_not_found_ignore_time) {
1020
- ignore_value = { count: 1, start_time: currentTime, last_time: currentTime, url: url };
1021
- }
1022
-
1023
- if (ignore_value.count >= 50) {
1024
- httpc_not_found_ignore_url.add(url);
1025
- httpc_not_found_ignore_map.remove(url_hash);
1026
- Logger.print('WHATAP-610', "The ignore option for URL " + url + " is applied.", false);
1027
- }
1028
-
1029
- httpc_not_found_ignore_map.put(url_hash, ignore_value);
1030
- }
1031
-
1032
- function shouldEndCurrentTransaction(not_found_ignore, ctx, res, requestPath) {
1033
- if (not_found_ignore) return false;
1034
- const is_ignore = shouldIgnoreError(res.statusCode, requestPath, status_ignore, status_ignore_set);
1035
- return !is_ignore;
1036
- }
1037
-
1038
- var toParamBytes = function (p, crc) {
1039
- if (p == null || p.length === 0) {
1040
- return null;
1041
- }
1042
- try {
1043
- return ParamSecurity.encrypt(Buffer.from(p, 'utf8'), crc);
1044
- } catch (e) {
1045
- return null;
1046
- }
1047
- };
1048
-
1049
- function createMtraceId(userAgentString) {
1050
- // MTraceHelper.createId 구현
1051
- if (userAgentString) {
1052
- // userAgent 기반으로 ID 생성
1053
- return KeyGen.next();
1054
- }
1055
- return KeyGen.next();
1056
- }
1057
-
1058
628
  exports.HttpObserver = HttpObserver;