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.
- package/agent/darwin/arm64/whatap_nodejs +0 -0
- package/agent/linux/amd64/whatap_nodejs +0 -0
- package/agent/linux/arm64/whatap_nodejs +0 -0
- package/build.txt +4 -0
- package/lib/conf/config-default.js +3 -10
- package/lib/conf/configure.js +349 -369
- package/lib/conf/license.js +1 -1
- package/lib/control/packagectr-helper.js +3 -34
- package/lib/core/agent.js +882 -176
- package/lib/core/interceptor.js +6 -6
- package/lib/core/shimmer.js +36 -82
- package/lib/counter/counter-manager.js +8 -79
- package/lib/counter/task/activetransaction.js +17 -68
- package/lib/io/data-inputx.js +3 -13
- package/lib/io/data-outputx.js +206 -268
- package/lib/logger.js +6 -6
- package/lib/net/security-master.js +20 -139
- package/lib/observers/apollo-server-observer.js +27 -33
- package/lib/observers/global-observer.js +80 -155
- package/lib/observers/http-observer.js +236 -666
- package/lib/observers/ioredis-observer.js +294 -0
- package/lib/observers/maria-observer.js +362 -204
- package/lib/observers/mongodb-observer.js +226 -169
- package/lib/observers/mongoose-observer.js +323 -518
- package/lib/observers/mssql-observer.js +418 -177
- package/lib/observers/mysql-observer.js +449 -342
- package/lib/observers/mysql2-observer.js +358 -396
- package/lib/observers/oracle-observer.js +384 -559
- package/lib/observers/pgsql-observer.js +489 -231
- package/lib/observers/prisma-observer.js +92 -303
- package/lib/observers/process-observer.js +35 -79
- package/lib/observers/redis-observer.js +331 -166
- package/lib/observers/socket.io-observer.js +187 -226
- package/lib/observers/websocket-observer.js +301 -175
- package/lib/pack/counter-pack.js +0 -3
- package/lib/pack/log-sink-pack.js +52 -14
- package/lib/pack/tagcount-pack.js +4 -4
- package/lib/{counter/task → system}/gc-action.js +74 -27
- package/lib/trace/trace-context-manager.js +25 -113
- package/lib/trace/trace-context.js +7 -21
- package/lib/trace/trace-httpc.js +11 -17
- package/lib/trace/trace-sql.js +21 -29
- package/lib/udp/async_sender.js +119 -0
- package/lib/udp/index.js +17 -0
- package/lib/udp/packet_enum.js +52 -0
- package/lib/udp/packet_queue.js +69 -0
- package/lib/udp/packet_type_enum.js +33 -0
- package/lib/udp/param_def.js +72 -0
- package/lib/udp/udp_session.js +336 -0
- package/lib/util/escape-literal-sql.js +5 -5
- package/lib/util/hashutil.js +18 -18
- package/lib/util/keygen.js +3 -0
- package/lib/util/linkedset.js +2 -1
- package/lib/util/nodeutil.js +1 -2
- package/lib/util/sql-util.js +178 -0
- package/lib/util/trace-helper.js +91 -0
- package/lib/util/transfer.js +58 -0
- package/lib/value/map-value.js +2 -3
- package/package.json +5 -10
- package/lib/conf/conf-sys-mon.js +0 -101
- package/lib/control/cmd-config.js +0 -24
- package/lib/control/control-handler.js +0 -367
- package/lib/core/request-agent.js +0 -27
- package/lib/counter/meter/meter-activex.js +0 -67
- package/lib/counter/meter/meter-httpc.js +0 -57
- package/lib/counter/meter/meter-resource.js +0 -9
- package/lib/counter/meter/meter-service.js +0 -168
- package/lib/counter/meter/meter-socket.io.js +0 -51
- package/lib/counter/meter/meter-sql.js +0 -71
- package/lib/counter/meter/meter-users.js +0 -58
- package/lib/counter/meter.js +0 -183
- package/lib/counter/task/agentinfo.js +0 -107
- package/lib/counter/task/gcstat.js +0 -34
- package/lib/counter/task/heapmem.js +0 -25
- package/lib/counter/task/httpc.js +0 -76
- package/lib/counter/task/metering-info.js +0 -125
- package/lib/counter/task/proc-cpu.js +0 -29
- package/lib/counter/task/realtimeuser.js +0 -31
- package/lib/counter/task/res/systemECSTask.js +0 -39
- package/lib/counter/task/res/systemKubeTask.js +0 -53
- package/lib/counter/task/res/util/awsEcsClientThread.js +0 -218
- package/lib/counter/task/res/util/linuxProcStatUtil.js +0 -14
- package/lib/counter/task/res-sys-cpu.js +0 -62
- package/lib/counter/task/service.js +0 -202
- package/lib/counter/task/socketio.js +0 -30
- package/lib/counter/task/sql.js +0 -105
- package/lib/counter/task/systemperf.js +0 -43
- package/lib/data/datapack-sender.js +0 -289
- package/lib/data/dataprofile-agent.js +0 -162
- package/lib/data/datatext-agent.js +0 -135
- package/lib/data/event-level.js +0 -15
- package/lib/data/test.js +0 -49
- package/lib/data/zipprofile.js +0 -197
- package/lib/env/constants.js +0 -21
- package/lib/error/error-handler.js +0 -437
- package/lib/kube/kube-client.js +0 -144
- package/lib/lang/text-types.js +0 -58
- package/lib/logsink/line-log-util.js +0 -87
- package/lib/logsink/line-log.js +0 -12
- package/lib/logsink/log-sender.js +0 -78
- package/lib/logsink/log-tracer.js +0 -40
- package/lib/logsink/sender-util.js +0 -56
- package/lib/logsink/zip/zip-send.js +0 -177
- package/lib/net/netflag.js +0 -55
- package/lib/net/receiver.js +0 -66
- package/lib/net/sender.js +0 -141
- package/lib/net/tcp-return.js +0 -18
- package/lib/net/tcp-session.js +0 -286
- package/lib/net/tcpreq-client-proxy.js +0 -70
- package/lib/net/tcprequest-mgr.js +0 -58
- package/lib/observers/cluster-observer.js +0 -22
- package/lib/observers/express-observer.js +0 -215
- package/lib/observers/file-observer.js +0 -184
- package/lib/observers/grpc-observer.js +0 -336
- package/lib/observers/memcached-observer.js +0 -56
- package/lib/observers/mongo-observer.js +0 -317
- package/lib/observers/net-observer.js +0 -77
- package/lib/observers/promise-observer.js +0 -31
- package/lib/observers/schedule-observer.js +0 -67
- package/lib/observers/stream-observer.js +0 -19
- package/lib/observers/thrift-observer.js +0 -197
- package/lib/pack/activestack-pack.js +0 -55
- package/lib/pack/apenum.js +0 -8
- package/lib/pack/errorsnap-pack.js +0 -69
- package/lib/pack/event-pack.js +0 -54
- package/lib/pack/hitmap-pack.js +0 -63
- package/lib/pack/hitmap-pack1.js +0 -152
- package/lib/pack/netstat.js +0 -15
- package/lib/pack/otype.js +0 -7
- package/lib/pack/profile-pack.js +0 -49
- package/lib/pack/realtimeuser-pack.js +0 -41
- package/lib/pack/stat-general-pack.js +0 -96
- package/lib/pack/staterror-pack.js +0 -120
- package/lib/pack/stathttpc-pack.js +0 -66
- package/lib/pack/stathttpc-rec.js +0 -78
- package/lib/pack/statremote-pack.js +0 -46
- package/lib/pack/statservice-pack.js +0 -63
- package/lib/pack/statservice-pack1.js +0 -88
- package/lib/pack/statservice-rec.js +0 -292
- package/lib/pack/statservice-rec_dep.js +0 -151
- package/lib/pack/statsql-pack.js +0 -69
- package/lib/pack/statsql-rec.js +0 -100
- package/lib/pack/statuseragent-pack.js +0 -44
- package/lib/pack/tagctr.js +0 -15
- package/lib/pack/text-pack.js +0 -50
- package/lib/pack/time-count.js +0 -25
- package/lib/pack/websocket.js +0 -15
- package/lib/pack/zip-pack.js +0 -70
- package/lib/pii/pii-item.js +0 -31
- package/lib/pii/pii-mask.js +0 -174
- package/lib/plugin/plugin-loadermanager.js +0 -57
- package/lib/plugin/plugin.js +0 -75
- package/lib/service/tx-record.js +0 -332
- package/lib/stat/stat-error.js +0 -116
- package/lib/stat/stat-httpc.js +0 -98
- package/lib/stat/stat-remote-ip.js +0 -46
- package/lib/stat/stat-remote-ipurl.js +0 -88
- package/lib/stat/stat-sql.js +0 -113
- package/lib/stat/stat-tranx.js +0 -58
- package/lib/stat/stat-tx-caller.js +0 -160
- package/lib/stat/stat-tx-domain.js +0 -111
- package/lib/stat/stat-tx-referer.js +0 -112
- package/lib/stat/stat-useragent.js +0 -48
- package/lib/stat/timingsender.js +0 -76
- package/lib/step/activestack-step.js +0 -38
- package/lib/step/dbc-step.js +0 -36
- package/lib/step/http-stepx.js +0 -67
- package/lib/step/message-step.js +0 -40
- package/lib/step/method-stepx.js +0 -45
- package/lib/step/resultset-step.js +0 -40
- package/lib/step/securemsg-step.js +0 -44
- package/lib/step/socket-step.js +0 -46
- package/lib/step/sql-stepx.js +0 -68
- package/lib/step/sqlxtype.js +0 -16
- package/lib/step/step.js +0 -66
- package/lib/step/stepenum.js +0 -54
- package/lib/topology/link.js +0 -63
- package/lib/topology/nodeinfo.js +0 -123
- package/lib/topology/status-detector.js +0 -111
- package/lib/util/anylist.js +0 -103
- package/lib/util/cardinality/hyperloglog.js +0 -106
- package/lib/util/cardinality/murmurhash.js +0 -31
- package/lib/util/cardinality/registerset.js +0 -75
- package/lib/util/errordata.js +0 -21
- package/lib/util/iputil_x.js +0 -527
- package/lib/util/kube-util.js +0 -73
- package/lib/util/paramsecurity.js +0 -80
- package/lib/util/pre-process.js +0 -13
- package/lib/util/process-seq.js +0 -166
- package/lib/util/property-util.js +0 -36
- package/lib/util/request-queue.js +0 -70
- package/lib/util/requestdouble-queue.js +0 -72
- package/lib/util/resourceprofile.js +0 -157
- package/lib/util/stop-watch.js +0 -30
- package/lib/util/system-util.js +0 -10
- 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
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
ctx.
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
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-
|
|
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) {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
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
|
-
|
|
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
|
-
|
|
457
|
-
if(mt_caller) {
|
|
458
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
483
|
-
if(inf != null && inf.length > 0) {
|
|
484
|
-
|
|
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-
|
|
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
|
-
|
|
504
|
-
|
|
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
|
-
|
|
523
|
-
|
|
524
|
-
|
|
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
|
-
|
|
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
|
-
|
|
549
|
-
|
|
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
|
-
|
|
575
|
-
|
|
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
|
-
|
|
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(
|
|
590
|
-
|
|
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
|
-
|
|
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.
|
|
394
|
+
if (ctx.isStaticContents) {
|
|
395
|
+
TraceContextManager.end(ctx.id);
|
|
617
396
|
ctx = null;
|
|
618
397
|
return;
|
|
619
398
|
}
|
|
620
399
|
|
|
621
400
|
try {
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
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-
|
|
697
|
-
TraceContextManager.end(ctx.
|
|
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
|
-
|
|
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
|
|
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__) {
|
|
421
|
+
if (mod.__whatap_observe__) {
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
783
424
|
mod.__whatap_observe__ = true;
|
|
784
425
|
Logger.initPrint("HttpObserver");
|
|
785
|
-
if(
|
|
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(
|
|
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
|
-
|
|
826
|
-
|
|
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'] =
|
|
837
|
-
}else{
|
|
838
|
-
options.headers = {'x-wtap-po':
|
|
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]=
|
|
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()
|
|
844
|
-
options.headers[conf._trace_mtrace_caller_key]=
|
|
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
|
-
|
|
853
|
-
|
|
854
|
-
|
|
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-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
893
|
-
|
|
894
|
-
|
|
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
|
|
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.
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
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
|
-
|
|
958
|
-
|
|
959
|
-
|
|
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-
|
|
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
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
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
|
-
|
|
987
|
-
|
|
988
|
-
ctx.
|
|
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;
|