whatap 1.0.1-canary.2 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/README.md +33 -77
  2. package/lib/conf/conf-sys-mon.js +101 -0
  3. package/lib/conf/config-default.js +10 -3
  4. package/lib/conf/configure.js +369 -349
  5. package/lib/conf/license.js +1 -1
  6. package/lib/control/cmd-config.js +24 -0
  7. package/lib/control/control-handler.js +367 -0
  8. package/lib/control/packagectr-helper.js +34 -3
  9. package/lib/core/agent.js +176 -888
  10. package/lib/core/interceptor.js +6 -6
  11. package/lib/core/request-agent.js +27 -0
  12. package/lib/core/shimmer.js +82 -36
  13. package/lib/counter/counter-manager.js +79 -8
  14. package/lib/counter/meter/meter-activex.js +67 -0
  15. package/lib/counter/meter/meter-httpc.js +57 -0
  16. package/lib/counter/meter/meter-resource.js +9 -0
  17. package/lib/counter/meter/meter-service.js +168 -0
  18. package/lib/counter/meter/meter-socket.io.js +51 -0
  19. package/lib/counter/meter/meter-sql.js +71 -0
  20. package/lib/counter/meter/meter-users.js +58 -0
  21. package/lib/counter/meter.js +183 -0
  22. package/lib/counter/task/activetransaction.js +68 -17
  23. package/lib/counter/task/agentinfo.js +107 -0
  24. package/lib/{system → counter/task}/gc-action.js +27 -74
  25. package/lib/counter/task/gcstat.js +34 -0
  26. package/lib/counter/task/heapmem.js +25 -0
  27. package/lib/counter/task/httpc.js +76 -0
  28. package/lib/counter/task/metering-info.js +125 -0
  29. package/lib/counter/task/proc-cpu.js +29 -0
  30. package/lib/counter/task/realtimeuser.js +31 -0
  31. package/lib/counter/task/res/systemECSTask.js +39 -0
  32. package/lib/counter/task/res/systemKubeTask.js +53 -0
  33. package/lib/counter/task/res/util/awsEcsClientThread.js +218 -0
  34. package/lib/counter/task/res/util/linuxProcStatUtil.js +14 -0
  35. package/lib/counter/task/res-sys-cpu.js +62 -0
  36. package/lib/counter/task/service.js +202 -0
  37. package/lib/counter/task/socketio.js +30 -0
  38. package/lib/counter/task/sql.js +105 -0
  39. package/lib/counter/task/systemperf.js +43 -0
  40. package/lib/data/datapack-sender.js +289 -0
  41. package/lib/data/dataprofile-agent.js +162 -0
  42. package/lib/data/datatext-agent.js +135 -0
  43. package/lib/data/event-level.js +15 -0
  44. package/lib/data/test.js +49 -0
  45. package/lib/data/zipprofile.js +197 -0
  46. package/lib/env/constants.js +21 -0
  47. package/lib/error/error-handler.js +437 -0
  48. package/lib/io/data-inputx.js +13 -3
  49. package/lib/io/data-outputx.js +268 -206
  50. package/lib/kube/kube-client.js +144 -0
  51. package/lib/lang/text-types.js +58 -0
  52. package/lib/logger.js +6 -6
  53. package/lib/logsink/line-log-util.js +87 -0
  54. package/lib/logsink/line-log.js +12 -0
  55. package/lib/logsink/log-sender.js +78 -0
  56. package/lib/logsink/log-tracer.js +40 -0
  57. package/lib/logsink/sender-util.js +56 -0
  58. package/lib/logsink/zip/zip-send.js +177 -0
  59. package/lib/net/netflag.js +55 -0
  60. package/lib/net/receiver.js +66 -0
  61. package/lib/net/security-master.js +139 -20
  62. package/lib/net/sender.js +141 -0
  63. package/lib/net/tcp-return.js +18 -0
  64. package/lib/net/tcp-session.js +286 -0
  65. package/lib/net/tcpreq-client-proxy.js +70 -0
  66. package/lib/net/tcprequest-mgr.js +58 -0
  67. package/lib/observers/apollo-server-observer.js +33 -27
  68. package/lib/observers/cluster-observer.js +22 -0
  69. package/lib/observers/express-observer.js +215 -0
  70. package/lib/observers/file-observer.js +184 -0
  71. package/lib/observers/global-observer.js +155 -80
  72. package/lib/observers/grpc-observer.js +336 -0
  73. package/lib/observers/http-observer.js +666 -236
  74. package/lib/observers/maria-observer.js +204 -362
  75. package/lib/observers/memcached-observer.js +56 -0
  76. package/lib/observers/mongo-observer.js +317 -0
  77. package/lib/observers/mongodb-observer.js +169 -226
  78. package/lib/observers/mongoose-observer.js +518 -323
  79. package/lib/observers/mssql-observer.js +177 -418
  80. package/lib/observers/mysql-observer.js +342 -449
  81. package/lib/observers/mysql2-observer.js +396 -358
  82. package/lib/observers/net-observer.js +77 -0
  83. package/lib/observers/oracle-observer.js +559 -384
  84. package/lib/observers/pgsql-observer.js +231 -489
  85. package/lib/observers/prisma-observer.js +303 -92
  86. package/lib/observers/process-observer.js +79 -35
  87. package/lib/observers/promise-observer.js +31 -0
  88. package/lib/observers/redis-observer.js +166 -331
  89. package/lib/observers/schedule-observer.js +67 -0
  90. package/lib/observers/socket.io-observer.js +226 -187
  91. package/lib/observers/stream-observer.js +19 -0
  92. package/lib/observers/thrift-observer.js +197 -0
  93. package/lib/observers/websocket-observer.js +175 -301
  94. package/lib/pack/activestack-pack.js +55 -0
  95. package/lib/pack/apenum.js +8 -0
  96. package/lib/pack/counter-pack.js +3 -0
  97. package/lib/pack/errorsnap-pack.js +69 -0
  98. package/lib/pack/event-pack.js +54 -0
  99. package/lib/pack/hitmap-pack.js +63 -0
  100. package/lib/pack/hitmap-pack1.js +152 -0
  101. package/lib/pack/log-sink-pack.js +14 -52
  102. package/lib/pack/netstat.js +15 -0
  103. package/lib/pack/otype.js +7 -0
  104. package/lib/pack/profile-pack.js +49 -0
  105. package/lib/pack/realtimeuser-pack.js +41 -0
  106. package/lib/pack/stat-general-pack.js +96 -0
  107. package/lib/pack/staterror-pack.js +120 -0
  108. package/lib/pack/stathttpc-pack.js +66 -0
  109. package/lib/pack/stathttpc-rec.js +78 -0
  110. package/lib/pack/statremote-pack.js +46 -0
  111. package/lib/pack/statservice-pack.js +63 -0
  112. package/lib/pack/statservice-pack1.js +88 -0
  113. package/lib/pack/statservice-rec.js +292 -0
  114. package/lib/pack/statservice-rec_dep.js +151 -0
  115. package/lib/pack/statsql-pack.js +69 -0
  116. package/lib/pack/statsql-rec.js +100 -0
  117. package/lib/pack/statuseragent-pack.js +44 -0
  118. package/lib/pack/tagcount-pack.js +4 -4
  119. package/lib/pack/tagctr.js +15 -0
  120. package/lib/pack/text-pack.js +50 -0
  121. package/lib/pack/time-count.js +25 -0
  122. package/lib/pack/websocket.js +15 -0
  123. package/lib/pack/zip-pack.js +70 -0
  124. package/lib/pii/pii-item.js +31 -0
  125. package/lib/pii/pii-mask.js +174 -0
  126. package/lib/plugin/plugin-loadermanager.js +57 -0
  127. package/lib/plugin/plugin.js +75 -0
  128. package/lib/service/tx-record.js +332 -0
  129. package/lib/stat/stat-error.js +116 -0
  130. package/lib/stat/stat-httpc.js +98 -0
  131. package/lib/stat/stat-remote-ip.js +46 -0
  132. package/lib/stat/stat-remote-ipurl.js +88 -0
  133. package/lib/stat/stat-sql.js +113 -0
  134. package/lib/stat/stat-tranx.js +58 -0
  135. package/lib/stat/stat-tx-caller.js +160 -0
  136. package/lib/stat/stat-tx-domain.js +111 -0
  137. package/lib/stat/stat-tx-referer.js +112 -0
  138. package/lib/stat/stat-useragent.js +48 -0
  139. package/lib/stat/timingsender.js +76 -0
  140. package/lib/step/activestack-step.js +38 -0
  141. package/lib/step/dbc-step.js +36 -0
  142. package/lib/step/http-stepx.js +67 -0
  143. package/lib/step/message-step.js +40 -0
  144. package/lib/step/method-stepx.js +45 -0
  145. package/lib/step/resultset-step.js +40 -0
  146. package/lib/step/securemsg-step.js +44 -0
  147. package/lib/step/socket-step.js +46 -0
  148. package/lib/step/sql-stepx.js +68 -0
  149. package/lib/step/sqlxtype.js +16 -0
  150. package/lib/step/step.js +66 -0
  151. package/lib/step/stepenum.js +54 -0
  152. package/lib/topology/link.js +63 -0
  153. package/lib/topology/nodeinfo.js +123 -0
  154. package/lib/topology/status-detector.js +111 -0
  155. package/lib/trace/trace-context-manager.js +113 -25
  156. package/lib/trace/trace-context.js +21 -7
  157. package/lib/trace/trace-httpc.js +17 -11
  158. package/lib/trace/trace-sql.js +29 -21
  159. package/lib/util/anylist.js +103 -0
  160. package/lib/util/cardinality/hyperloglog.js +106 -0
  161. package/lib/util/cardinality/murmurhash.js +31 -0
  162. package/lib/util/cardinality/registerset.js +75 -0
  163. package/lib/util/errordata.js +21 -0
  164. package/lib/util/escape-literal-sql.js +5 -5
  165. package/lib/util/hashutil.js +18 -18
  166. package/lib/util/iputil_x.js +527 -0
  167. package/lib/util/keygen.js +0 -3
  168. package/lib/util/kube-util.js +73 -0
  169. package/lib/util/linkedset.js +1 -2
  170. package/lib/util/nodeutil.js +2 -1
  171. package/lib/util/paramsecurity.js +80 -0
  172. package/lib/util/pre-process.js +13 -0
  173. package/lib/util/process-seq.js +166 -0
  174. package/lib/util/property-util.js +36 -0
  175. package/lib/util/request-queue.js +70 -0
  176. package/lib/util/requestdouble-queue.js +72 -0
  177. package/lib/util/resourceprofile.js +157 -0
  178. package/lib/util/stop-watch.js +30 -0
  179. package/lib/util/system-util.js +10 -0
  180. package/lib/util/userid-util.js +57 -0
  181. package/lib/value/map-value.js +3 -2
  182. package/package.json +9 -5
  183. package/whatap.conf +1 -4
  184. package/agent/darwin/arm64/whatap_nodejs +0 -0
  185. package/agent/linux/amd64/whatap_nodejs +0 -0
  186. package/agent/linux/arm64/whatap_nodejs +0 -0
  187. package/build.txt +0 -4
  188. package/lib/observers/ioredis-observer.js +0 -294
  189. package/lib/udp/async_sender.js +0 -119
  190. package/lib/udp/index.js +0 -17
  191. package/lib/udp/packet_enum.js +0 -52
  192. package/lib/udp/packet_queue.js +0 -69
  193. package/lib/udp/packet_type_enum.js +0 -33
  194. package/lib/udp/param_def.js +0 -72
  195. package/lib/udp/udp_session.js +0 -336
  196. package/lib/util/sql-util.js +0 -178
  197. package/lib/util/trace-helper.js +0 -91
  198. package/lib/util/transfer.js +0 -58
@@ -1,72 +0,0 @@
1
- class ParamDef {
2
- static get KEEPALIVE() { return 1; }
3
- static get AGENT_BOOT_ENV() { return 2; }
4
- static get CONFIGURE_UPDATE() { return 3; }
5
- static get CONFIGURE_GET() { return 4; }
6
- static get COMPO_VERSIONS() { return 5; }
7
- static get THREAD_LIST() { return 7; }
8
- static get THREAD_DETAIL() { return 8; }
9
- static get GET_ACTIVE_STACK() { return 9; }
10
- static get HEAP_HISTO() { return 10; }
11
- static get LOADED_CLASS_LIST() { return 11; }
12
- static get GET_ENV() { return 12; }
13
- static get SYSTEM_GC() { return 13; }
14
- static get SET_CONFIG() { return 14; }
15
- static get OPEN_SOCKET_LIST() { return 15; }
16
- static get LOADED_CLASS_DETAIL() { return 16; }
17
- static get LOADED_CLASS_REDEFINE() { return 17; }
18
- static get AGENT_JAR_LIST() { return 18; }
19
- static get AGENT_JAR_SAVE() { return 19; }
20
- static get AGENT_JAR_DELETE() { return 20; }
21
- static get RESET_STRING_SENT_MARK() { return 21; }
22
- static get AGENT_LOG_LIST() { return 22; }
23
- static get AGENT_LOG_READ() { return 23; }
24
- static get THREAD_CONTROL() { return 24; }
25
- static get GET_ACTIVE_TRANSACTION_LIST() { return 25; }
26
- static get GET_ACTIVE_TRANSACTION_DETAIL() { return 26; }
27
- static get GET_TOPOLOGY() { return 27; }
28
- static get INFRA_NET_STAT() { return 28; }
29
- static get INFRA_PS_EF() { return 29; }
30
- static get INFRA_DOCKER_LIST() { return 30; }
31
- static get INFRA_REMOTE_CMD() { return 33; }
32
- static get INFRA_PEER_LIST() { return 34; }
33
- static get INFRA_AGENT_UPDATE() { return 36; }
34
- static get AGENT_DUMP_LIST() { return 31; }
35
- static get AGENT_DUMP_READ() { return 32; }
36
- static get AGENT_STAT() { return 35; }
37
- static get JVM_THREAD_DUMP() { return 37; }
38
- static get JVM_HEAP_DUMP() { return 38; }
39
- static get KUBENETES() { return 39; }
40
- static get GET_ACTIVE_STATS() { return 40; }
41
- static get GET_DBCONN_POOL() { return 41; }
42
- static get MODULE_DEPENDENCY() { return 101; }
43
- static get DBX_INFO() { return 201; }
44
- static get DBX_SETTINGS() { return 202; }
45
- static get DBX_USER_SCRIPT() { return 207; }
46
- static get DBX_SCRIPT_LIST() { return 208; }
47
- static get DBX_SCRIPT_SQL() { return 209; }
48
- static get DBX_KILL_SESSION() { return 210; }
49
- static get DBX_GET_ALERT() { return 211; }
50
- static get DBX_SET_ALERT() { return 212; }
51
- static get DBX_PLAN() { return 213; }
52
- static get DBX_SESSION_LIST() { return 214; }
53
- static get DBX_SET_CPUCORES() { return 215; }
54
- static get DBX_SESSION_STAT() { return 203; }
55
- static get DBX_SESSION_EVENT() { return 204; }
56
- static get DBX_TOPSTAT() { return 205; }
57
- static get DBX_TOPEVENT() { return 206; }
58
- static get CONFIG_DBC() { return 301; }
59
- static get METHOD_PERF_STAT() { return 302; }
60
- static get BLOCKING_DETECT() { return 303; }
61
- static get CW_INFO() { return 401; }
62
- static get CW_EVENTS() { return 402; }
63
- static get CW_CREDENTIAL() { return 403; }
64
- static get CW_REGIONS() { return 404; }
65
- static get CW_METRIC_NAMES() { return 405; }
66
- static get CW_AWS_RESOURCE_IDS() { return 406; }
67
- static get CW_STATISTICS() { return 407; }
68
- static get CW_UNITS() { return 408; }
69
- static get CW_METRICS() { return 409; }
70
- }
71
-
72
- module.exports = ParamDef;
@@ -1,336 +0,0 @@
1
- /**
2
- * JavaScript implementation of Python's UdpSession
3
- */
4
-
5
- const dgram = require('dgram');
6
- const os = require('os');
7
- const fs = require('fs');
8
- const path = require('path');
9
-
10
- const PacketEnum = require('./packet_enum');
11
- const PacketTypeEnum = require('./packet_type_enum');
12
- const ParamDef = require('./param_def');
13
- const DataOutputX = require('../io/data-outputx');
14
- const TraceContextManager = require('../trace/trace-context-manager');
15
- const PackageCtrHelper = require('../../lib/control/packagectr-helper');
16
- const ActiveTransaction = require('../counter/task/activetransaction');
17
- const GCAction = require('../system/gc-action');
18
- const DataOuputX = require('../../lib/io/data-outputx');
19
-
20
- class UdpSession {
21
- constructor() {
22
- this.socket = null;
23
- this.bufferArr = [];
24
- this.threadLock = false; // Simple lock simulation
25
- this.readTimeout = 5000; // 5 seconds
26
- this.serverHost = PacketEnum.SERVER;
27
- this.serverPort = PacketEnum.PORT;
28
- this.isConnected = false; // connected-UDP 여부
29
- }
30
-
31
- /**
32
- * Initialize UDP socket
33
- */
34
- udp(config) {
35
- const self = this;
36
- const conf = config || {};
37
-
38
- // Close existing socket if open
39
- if (self.socket) {
40
- try {
41
- self.socket.close();
42
- } catch (e) {
43
- console.error("Error closing UDP socket:", e);
44
- }
45
- }
46
-
47
- // Create UDP socket
48
- self.socket = dgram.createSocket('udp4');
49
-
50
- // Check if Unix socket is configured
51
- const whatapHome = process.env.WHATAP_HOME;
52
-
53
- if (conf.unix_socket_enabled === true && whatapHome) {
54
- // Unix socket not directly supported in Node.js dgram
55
- // We'll use the regular UDP socket with the configured server and port
56
- console.log("Unix socket not supported in Node.js, using UDP instead");
57
- }
58
-
59
- // Configure server info
60
- self.serverHost = conf.net_udp_host || PacketEnum.SERVER;
61
- self.serverPort = parseInt(conf.net_udp_port || PacketEnum.PORT);
62
-
63
- // console.log(`UDP initialized with server ${self.serverHost}:${self.serverPort}`);
64
-
65
- // "connected UDP" 로 전환: lsof에서 peer가 보이도록
66
- self.socket.connect(self.serverPort, self.serverHost, () => {
67
- self.isConnected = true;
68
- // 참고: UDP라 실제 연결 성사 여부 확인 절차는 없음 (peer 고정만 됨)
69
- // 필요시 ephemeral 로컬 포트를 고정하고 싶으면 bind 후 connect 실행
70
- // self.socket.bind(0, '127.0.0.1', () => self.socket.connect(...));
71
- });
72
-
73
- // Set up error handling
74
- self.socket.on('error', function (err) {
75
- console.error("UDP socket error:", err);
76
- });
77
- self.socket.on('close', () => { self.isConnected = false; });
78
-
79
- self.socket.on('message', function (msg, rinfo) {
80
- self.handleMessage(msg, rinfo);
81
- });
82
-
83
- return self.socket;
84
- }
85
-
86
- /**
87
- * Handle incoming UDP messages
88
- */
89
- handleMessage(msg, rinfo) {
90
- const self = this;
91
- try {
92
- const received = msg.toString();
93
- const parts = received.split(',');
94
-
95
- if (parts.length >= 2) {
96
- const paramId = parseInt(parts[0]);
97
- const request = parts[1];
98
- const extra = parts.length > 2 ? parts[2] : '';
99
-
100
- self.handle(paramId, request, extra);
101
- }
102
- } catch (e) {
103
- console.error("Error handling UDP message:", e);
104
- }
105
- }
106
-
107
- /**
108
- * Handle received requests
109
- */
110
- handle(paramId, request, extra) {
111
- const self = this;
112
- if(!paramId)
113
- return;
114
-
115
- try {
116
- let threadId = 0;
117
- let pid = 0;
118
-
119
- if (extra) {
120
- const extraData = extra.replace(' ', ', ').split(', ');
121
- if (extraData.length > 1) {
122
- threadId = parseInt(extraData[1]);
123
- // In Node.js there's no direct thread ID, so using PID
124
- pid = process.pid;
125
- }
126
- }
127
-
128
- let data = '';
129
- let datas = [String(paramId), request];
130
-
131
- if (paramId === ParamDef.SYSTEM_GC){
132
- const gcAction = new GCAction();
133
- const p = gcAction.execSystemGC();
134
-
135
- const bout = new DataOuputX();
136
- bout.writePack(p, null);
137
- const packbytes = bout.toByteArray();
138
-
139
- self.send_relaypack(packbytes)
140
- } else if (paramId === ParamDef.MODULE_DEPENDENCY) {
141
- const dependencies = PackageCtrHelper.getDependencies();
142
- // result format: "axios x.x.x, whatap x.x.x, etc x,x,x"
143
- const result = Object.entries(dependencies)
144
- .map(([name, version]) => `${name} ${version}`)
145
- .join(', ');
146
- datas.push(result);
147
- self.send_packet(PacketTypeEnum.TX_PARAM, null, datas)
148
- } else if (paramId === ParamDef.GET_ACTIVE_STATS) {
149
- const stats = ActiveTransaction.getActiveStats();
150
- datas = [stats.join(',')];
151
- self.send_packet(PacketTypeEnum.ACTIVE_STATS, null, datas);
152
- }
153
- return;
154
- } catch (e) {
155
- console.error("Error in handle method:", e);
156
- }
157
- }
158
-
159
- /**
160
- * Send a packet with trace data
161
- * @param {number} packet_type - Type of packet from PacketTypeEnum
162
- * @param {object} ctx - Trace context
163
- * @param {array} datas - Array of data strings to send
164
- */
165
- send_packet(packet_type, ctx, datas = []) {
166
- const self = this;
167
-
168
- try {
169
- // Calculate total buffer size
170
- let totalSize = 0;
171
- for (let i = 0; i < self.bufferArr.length; i++) {
172
- totalSize += self.bufferArr[i].length;
173
- }
174
-
175
- // Add estimated size of new data
176
- let newDataSize = PacketEnum.PACKET_BODY_REQUIRED_SIZE + 1;
177
- for (let i = 0; i < datas.length; i++) {
178
- const data = String(datas[i]);
179
- newDataSize += Buffer.byteLength(data, 'utf8') + 2; // +2 for UTF encoding length
180
- }
181
-
182
- if (totalSize + newDataSize > PacketEnum.PACKET_BUFFER_SIZE) {
183
- self.send(packet_type, ctx);
184
- }
185
-
186
- if (!datas || datas.length === 0) {
187
- return;
188
- }
189
-
190
- // Create packet
191
- const dout = new DataOutputX();
192
- var startHeaderBufferSize = dout.size();
193
-
194
- // Write header
195
- dout.writeByte(packet_type);
196
- dout.writeInt(PacketEnum.PACKET_VERSION);
197
- dout.writeInt(0); // Placeholder for length
198
-
199
- const startBodyBufferSize = dout.size();
200
-
201
- // Write body if context exists
202
- if (ctx) {
203
- dout.writeLong(ctx.id);
204
- dout.writeLong(ctx.start_time);
205
- dout.writeInt(ctx.elapsed);
206
- dout.writeLong(Math.floor(Date.now() / 1000));
207
- dout.writeLong(0);
208
- dout.writeInt(process.pid);
209
- }
210
-
211
- // Write data with length limit check
212
- let diff = PacketEnum.PACKET_BUFFER_SIZE - totalSize - (PacketEnum.PACKET_BODY_REQUIRED_SIZE + 1);
213
-
214
- for (let i = 0; i < datas.length; i++) {
215
- let data = String(datas[i]).slice(0, PacketEnum.DATA_SIZE_LIMIT);
216
- diff -= (Buffer.byteLength(data, 'utf8') + 2); // Account for UTF encoding overhead
217
-
218
- if (diff < 0) {
219
- data = ' ';
220
- console.log('message too long.');
221
- }
222
-
223
- dout.writeUTF(data);
224
- }
225
-
226
- // Update length in header
227
- dout.writeToPos(
228
- startHeaderBufferSize + PacketEnum.PACKET_HEADER_LEN_POS,
229
- dout.size() - startBodyBufferSize
230
- );
231
-
232
- // Add to buffer array (simulating thread lock)
233
- if (!self.threadLock) {
234
- self.threadLock = true;
235
- self.bufferArr.push(dout.toByteArray());
236
- self.threadLock = false;
237
-
238
- // Flush in certain conditions
239
- if (!ctx || packet_type === PacketTypeEnum.TX_START || packet_type === PacketTypeEnum.TX_END) {
240
- self.send(packet_type, ctx);
241
- }
242
- }
243
- } catch (e) {
244
- console.error("Error sending packet:", e);
245
- }
246
- }
247
-
248
- /**
249
- * Send the buffered packets
250
- */
251
- send(packet_type, ctx) {
252
- const self = this;
253
-
254
- if (!self.socket || self.bufferArr.length === 0) {
255
- return;
256
- }
257
-
258
- try {
259
- // Combine all buffers
260
- const sendbuf = Buffer.concat(self.bufferArr);
261
-
262
- // Send via UDP
263
- const cb = (err) => {
264
- if (err) {
265
- console.error("Failed to send UDP packet:", err);
266
- // Consider reinitializing UDP connection on error
267
- self.udp();
268
- }
269
- };
270
-
271
- if (self.isConnected) {
272
- // connected UDP: 목적지 인자 없이 전송
273
- self.socket.send(sendbuf, cb);
274
- } else {
275
- // fallback (미연결 상태)
276
- self.socket.send(sendbuf, 0, sendbuf.length, self.serverPort, self.serverHost, cb);
277
- }
278
- } catch (e) {
279
- console.error("Error in send method:", e);
280
- } finally {
281
- // Clear buffer array
282
- self.bufferArr = [];
283
-
284
- // Handle context cleanup for TX_END
285
- if (packet_type === PacketTypeEnum.TX_END && ctx && ctx.id) {
286
- if (ctx.id) {
287
- TraceContextManager.end(ctx.id)
288
- }
289
- }
290
- }
291
- }
292
-
293
- /**
294
- * Send relay pack data
295
- */
296
- send_relaypack(packbytes) {
297
- const self = this;
298
- const packet_type = PacketTypeEnum.RELAY_PACK;
299
-
300
- try {
301
- // Check buffer size and flush if needed
302
- let totalSize = 0;
303
- for (let i = 0; i < self.bufferArr.length; i++) {
304
- totalSize += self.bufferArr[i].length;
305
- }
306
-
307
- if (totalSize + PacketEnum.PACKET_BODY_REQUIRED_SIZE + 1 > PacketEnum.PACKET_BUFFER_SIZE) {
308
- self.send(packet_type, null);
309
- }
310
-
311
- if (!packbytes) {
312
- return;
313
- }
314
-
315
- // Create packet
316
- const dout = new DataOutputX();
317
-
318
- // Write header
319
- dout.writeByte(packet_type);
320
- dout.writeInt(PacketEnum.PACKET_VERSION);
321
- dout.writeIntBytes(packbytes);
322
-
323
- // Add to buffer
324
- if (!self.threadLock) {
325
- self.threadLock = true;
326
- self.bufferArr.push(dout.toByteArray());
327
- self.threadLock = false;
328
- }
329
- } catch (e) {
330
- console.error("Error sending relay pack:", e);
331
- }
332
- }
333
- }
334
-
335
- // Export a singleton instance
336
- module.exports = new UdpSession();
@@ -1,178 +0,0 @@
1
- /**
2
- * Copyright 2016 the WHATAP project authors. All rights reserved.
3
- * Use of this source code is governed by a license that
4
- * can be found in the LICENSE file.
5
- */
6
-
7
- var ParsedSql = require('../trace/parsed-sql'),
8
- EscapeLiteralSQL = require('./escape-literal-sql'),
9
- HashUtil = require('./hashutil'),
10
- Logger = require('../logger'),
11
- DateUtil = require('./dateutil');
12
-
13
- /**
14
- * SQL 리터럴을 이스케이프하고 파싱된 SQL 객체를 반환합니다.
15
- * @param {string} sql - 원본 SQL 문자열
16
- * @param {IntKeyMap} checkedSqlCache - 파라미터가 있는 SQL 캐시
17
- * @param {IntKeyMap} nonLiteSqlCache - 파라미터가 없는 SQL 캐시
18
- * @param {string} currentDate - 현재 날짜 (캐시 클리어용)
19
- * @returns {ParsedSql} 파싱된 SQL 객체 (type, sql hash, parameters 포함)
20
- */
21
- function escapeLiteral(sql, checkedSqlCache, nonLiteSqlCache, currentDate) {
22
- if (sql == null) {
23
- sql = '';
24
- }
25
-
26
- var sqlHash = HashUtil.hashFromString(sql);
27
- var psql = nonLiteSqlCache.get(sqlHash);
28
-
29
- // 캐시에서 찾기 (literal이 없는 경우)
30
- if (psql != null) {
31
- return psql;
32
- }
33
-
34
- // 캐시에서 찾기 (literal이 있는 경우)
35
- psql = checkedSqlCache.get(sqlHash);
36
- if (psql != null) {
37
- return psql;
38
- }
39
-
40
- // SQL 파싱 및 리터럴 이스케이프
41
- var els = new EscapeLiteralSQL(sql);
42
- els.process();
43
-
44
- var hash = HashUtil.hashFromString(els.getParsedSql());
45
-
46
- // 원본과 파싱된 SQL이 동일한 경우 (리터럴이 없음)
47
- if (hash === sqlHash) {
48
- psql = new ParsedSql(els.sqlType, hash, null);
49
- nonLiteSqlCache.put(sqlHash, psql);
50
- } else {
51
- // 리터럴이 있어서 파싱된 경우
52
- psql = new ParsedSql(els.sqlType, hash, els.getParameter());
53
- checkedSqlCache.put(sqlHash, psql);
54
- }
55
-
56
- return psql;
57
- }
58
-
59
- /**
60
- * SQL 타입을 문자열로 변환합니다.
61
- * @param {string} sqlType - SQL 타입 ('S', 'I', 'U', 'D' 등)
62
- * @returns {string} SQL 타입 설명
63
- */
64
- function getSqlTypeDescription(sqlType) {
65
- switch (sqlType) {
66
- case 'S': return 'SELECT';
67
- case 'I': return 'INSERT';
68
- case 'U': return 'UPDATE';
69
- case 'D': return 'DELETE';
70
- case 'C': return 'CREATE';
71
- case 'A': return 'ALTER';
72
- case 'R': return 'DROP';
73
- default: return 'UNKNOWN';
74
- }
75
- }
76
-
77
- /**
78
- * SQL이 SELECT 쿼리인지 확인합니다.
79
- * @param {ParsedSql} psql - 파싱된 SQL 객체
80
- * @returns {boolean} SELECT 쿼리 여부
81
- */
82
- function isSelectQuery(psql) {
83
- return psql && psql.type === 'S';
84
- }
85
-
86
- /**
87
- * SQL이 DML(Data Manipulation Language) 쿼리인지 확인합니다.
88
- * @param {ParsedSql} psql - 파싱된 SQL 객체
89
- * @returns {boolean} DML 쿼리 여부 (SELECT, INSERT, UPDATE, DELETE)
90
- */
91
- function isDMLQuery(psql) {
92
- return psql && ['S', 'I', 'U', 'D'].includes(psql.type);
93
- }
94
-
95
- /**
96
- * SQL이 DDL(Data Definition Language) 쿼리인지 확인합니다.
97
- * @param {ParsedSql} psql - 파싱된 SQL 객체
98
- * @returns {boolean} DDL 쿼리 여부 (CREATE, ALTER, DROP)
99
- */
100
- function isDDLQuery(psql) {
101
- return psql && ['C', 'A', 'R'].includes(psql.type);
102
- }
103
-
104
- /**
105
- * 캐시 날짜를 확인하고 필요시 클리어합니다.
106
- * @param {IntKeyMap} checkedSqlCache - 파라미터가 있는 SQL 캐시
107
- * @param {IntKeyMap} nonLiteSqlCache - 파라미터가 없는 SQL 캐시
108
- * @param {string} lastDate - 마지막 캐시 날짜
109
- * @param {string} observerName - Observer 이름 (로그용)
110
- * @returns {string} 현재 날짜
111
- */
112
- function checkAndClearCache(checkedSqlCache, nonLiteSqlCache, lastDate, observerName) {
113
- var currentDate = DateUtil.yyyymmdd();
114
-
115
- if (lastDate !== currentDate) {
116
- checkedSqlCache.clear();
117
- nonLiteSqlCache.clear();
118
- Logger.print('WHATAP-SQL-CLEAR', `${observerName} CLEAR OK!!!!!!!!!!!!!!!!`, false);
119
- }
120
-
121
- return currentDate;
122
- }
123
-
124
- /**
125
- * SQL 캐시 통계 정보를 반환합니다.
126
- * @param {IntKeyMap} checkedSqlCache - 파라미터가 있는 SQL 캐시
127
- * @param {IntKeyMap} nonLiteSqlCache - 파라미터가 없는 SQL 캐시
128
- * @param {string} lastDate - 마지막 캐시 날짜
129
- * @returns {Object} 캐시 통계 정보
130
- */
131
- function getCacheStats(checkedSqlCache, nonLiteSqlCache, lastDate) {
132
- return {
133
- checkedSqlSize: checkedSqlCache.size(),
134
- nonLiteSqlSize: nonLiteSqlCache.size(),
135
- checkedSqlMaxSize: checkedSqlCache.getMax(),
136
- nonLiteSqlMaxSize: nonLiteSqlCache.getMax(),
137
- lastClearDate: lastDate
138
- };
139
- }
140
-
141
- /**
142
- * SQL 문자열을 안전하게 자릅니다.
143
- * @param {string} sql - SQL 문자열
144
- * @param {number} maxLength - 최대 길이 (기본값: 200)
145
- * @returns {string} 잘린 SQL 문자열
146
- */
147
- function truncateSql(sql, maxLength) {
148
- maxLength = maxLength || 200;
149
- if (!sql || typeof sql !== 'string') {
150
- return '';
151
- }
152
- return sql.length > maxLength ? sql.substring(0, maxLength) + '...' : sql;
153
- }
154
-
155
- /**
156
- * SQL 문자열을 정규화합니다 (공백 정리).
157
- * @param {string} sql - SQL 문자열
158
- * @returns {string} 정규화된 SQL 문자열
159
- */
160
- function normalizeSql(sql) {
161
- if (!sql || typeof sql !== 'string') {
162
- return '';
163
- }
164
- return sql.trim().replace(/\s+/g, ' ');
165
- }
166
-
167
- // 내보내기
168
- module.exports = {
169
- escapeLiteral: escapeLiteral,
170
- checkAndClearCache: checkAndClearCache,
171
- getCacheStats: getCacheStats,
172
- getSqlTypeDescription: getSqlTypeDescription,
173
- isSelectQuery: isSelectQuery,
174
- isDMLQuery: isDMLQuery,
175
- isDDLQuery: isDDLQuery,
176
- truncateSql: truncateSql,
177
- normalizeSql: normalizeSql
178
- };
@@ -1,91 +0,0 @@
1
- /**
2
- * Copyright 2016 the WHATAP project authors. All rights reserved.
3
- * Use of this source code is governed by a license that
4
- * can be found in the LICENSE file.
5
- */
6
-
7
- var conf = require('../conf/configure'),
8
- KeyGen = require('./keygen');
9
-
10
- var TraceHelper = {
11
- check_seq: 1
12
- };
13
-
14
- /**
15
- * Inter-transaction trace auto-on functionality
16
- * Used for multi-transaction tracing based on sampling rate
17
- */
18
- TraceHelper.interTxTraceAutoOn = function(ctx) {
19
- if (conf.mtrace_enabled == false || ctx.httpc_checked || !ctx.mtid.isZero())
20
- return;
21
-
22
- ctx.httpc_checked = true;
23
-
24
- if (conf.mtrace_rate >= 100) {
25
- ctx.mtid = KeyGen.getMtid();
26
- return;
27
- }
28
-
29
- TraceHelper.check_seq++;
30
-
31
- switch (Math.floor(conf.mtrace_rate / 10)) {
32
- case 10:
33
- ctx.mtid = KeyGen.getMtid();
34
- break;
35
- case 9:
36
- if (TraceHelper.check_seq % 10 !== 0)
37
- ctx.mtid = KeyGen.getMtid();
38
- break;
39
- case 8:
40
- if (TraceHelper.check_seq % 5 !== 0)
41
- ctx.mtid = KeyGen.getMtid();
42
- break;
43
- case 7:
44
- if (TraceHelper.check_seq % 4 !== 0)
45
- ctx.mtid = KeyGen.getMtid();
46
- break;
47
- case 6:
48
- if (TraceHelper.check_seq % 3 !== 0)
49
- ctx.mtid = KeyGen.getMtid();
50
- break;
51
- case 5:
52
- if (TraceHelper.check_seq % 2 === 0)
53
- ctx.mtid = KeyGen.getMtid();
54
- break;
55
- case 4:
56
- if (TraceHelper.check_seq % 3 === 0 || TraceHelper.check_seq % 5 === 0)
57
- ctx.mtid = KeyGen.getMtid();
58
- break;
59
- case 3:
60
- if (TraceHelper.check_seq % 4 === 0)
61
- ctx.mtid = KeyGen.getMtid();
62
- break;
63
- case 2:
64
- if (TraceHelper.check_seq % 5 === 0)
65
- ctx.mtid = KeyGen.getMtid();
66
- break;
67
- case 1:
68
- if (TraceHelper.check_seq % 10 === 0)
69
- ctx.mtid = KeyGen.getMtid();
70
- break;
71
- case 0:
72
- default:
73
- break;
74
- }
75
- };
76
-
77
- /**
78
- * Reset the sequence counter (useful for testing or long-running processes)
79
- */
80
- TraceHelper.resetSequence = function() {
81
- TraceHelper.check_seq = 1;
82
- };
83
-
84
- /**
85
- * Get current sequence counter (for debugging)
86
- */
87
- TraceHelper.getSequence = function() {
88
- return TraceHelper.check_seq;
89
- };
90
-
91
- module.exports = TraceHelper;