whatap 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/README.md +32 -78
  2. package/lib/conf/conf-sys-mon.js +101 -0
  3. package/lib/conf/config-default.js +10 -3
  4. package/lib/conf/configure.js +369 -349
  5. package/lib/conf/license.js +1 -1
  6. package/lib/control/cmd-config.js +24 -0
  7. package/lib/control/control-handler.js +367 -0
  8. package/lib/control/packagectr-helper.js +34 -3
  9. package/lib/core/agent.js +176 -882
  10. package/lib/core/interceptor.js +6 -6
  11. package/lib/core/request-agent.js +27 -0
  12. package/lib/core/shimmer.js +82 -36
  13. package/lib/counter/counter-manager.js +79 -8
  14. package/lib/counter/meter/meter-activex.js +67 -0
  15. package/lib/counter/meter/meter-httpc.js +57 -0
  16. package/lib/counter/meter/meter-resource.js +9 -0
  17. package/lib/counter/meter/meter-service.js +168 -0
  18. package/lib/counter/meter/meter-socket.io.js +51 -0
  19. package/lib/counter/meter/meter-sql.js +71 -0
  20. package/lib/counter/meter/meter-users.js +58 -0
  21. package/lib/counter/meter.js +183 -0
  22. package/lib/counter/task/activetransaction.js +68 -17
  23. package/lib/counter/task/agentinfo.js +107 -0
  24. package/lib/{system → counter/task}/gc-action.js +27 -74
  25. package/lib/counter/task/gcstat.js +34 -0
  26. package/lib/counter/task/heapmem.js +25 -0
  27. package/lib/counter/task/httpc.js +76 -0
  28. package/lib/counter/task/metering-info.js +125 -0
  29. package/lib/counter/task/proc-cpu.js +29 -0
  30. package/lib/counter/task/realtimeuser.js +31 -0
  31. package/lib/counter/task/res/systemECSTask.js +39 -0
  32. package/lib/counter/task/res/systemKubeTask.js +53 -0
  33. package/lib/counter/task/res/util/awsEcsClientThread.js +218 -0
  34. package/lib/counter/task/res/util/linuxProcStatUtil.js +14 -0
  35. package/lib/counter/task/res-sys-cpu.js +62 -0
  36. package/lib/counter/task/service.js +202 -0
  37. package/lib/counter/task/socketio.js +30 -0
  38. package/lib/counter/task/sql.js +105 -0
  39. package/lib/counter/task/systemperf.js +43 -0
  40. package/lib/data/datapack-sender.js +289 -0
  41. package/lib/data/dataprofile-agent.js +162 -0
  42. package/lib/data/datatext-agent.js +135 -0
  43. package/lib/data/event-level.js +15 -0
  44. package/lib/data/test.js +49 -0
  45. package/lib/data/zipprofile.js +197 -0
  46. package/lib/env/constants.js +21 -0
  47. package/lib/error/error-handler.js +437 -0
  48. package/lib/io/data-inputx.js +13 -3
  49. package/lib/io/data-outputx.js +268 -206
  50. package/lib/kube/kube-client.js +144 -0
  51. package/lib/lang/text-types.js +58 -0
  52. package/lib/logger.js +6 -6
  53. package/lib/logsink/line-log-util.js +87 -0
  54. package/lib/logsink/line-log.js +12 -0
  55. package/lib/logsink/log-sender.js +78 -0
  56. package/lib/logsink/log-tracer.js +40 -0
  57. package/lib/logsink/sender-util.js +56 -0
  58. package/lib/logsink/zip/zip-send.js +177 -0
  59. package/lib/net/netflag.js +55 -0
  60. package/lib/net/receiver.js +66 -0
  61. package/lib/net/security-master.js +139 -20
  62. package/lib/net/sender.js +141 -0
  63. package/lib/net/tcp-return.js +18 -0
  64. package/lib/net/tcp-session.js +286 -0
  65. package/lib/net/tcpreq-client-proxy.js +70 -0
  66. package/lib/net/tcprequest-mgr.js +58 -0
  67. package/lib/observers/apollo-server-observer.js +33 -27
  68. package/lib/observers/cluster-observer.js +22 -0
  69. package/lib/observers/express-observer.js +215 -0
  70. package/lib/observers/file-observer.js +184 -0
  71. package/lib/observers/global-observer.js +155 -80
  72. package/lib/observers/grpc-observer.js +336 -0
  73. package/lib/observers/http-observer.js +666 -236
  74. package/lib/observers/maria-observer.js +204 -362
  75. package/lib/observers/memcached-observer.js +56 -0
  76. package/lib/observers/mongo-observer.js +317 -0
  77. package/lib/observers/mongodb-observer.js +169 -226
  78. package/lib/observers/mongoose-observer.js +518 -323
  79. package/lib/observers/mssql-observer.js +177 -418
  80. package/lib/observers/mysql-observer.js +342 -449
  81. package/lib/observers/mysql2-observer.js +396 -358
  82. package/lib/observers/net-observer.js +77 -0
  83. package/lib/observers/oracle-observer.js +559 -384
  84. package/lib/observers/pgsql-observer.js +231 -489
  85. package/lib/observers/prisma-observer.js +303 -92
  86. package/lib/observers/process-observer.js +79 -35
  87. package/lib/observers/promise-observer.js +31 -0
  88. package/lib/observers/redis-observer.js +166 -331
  89. package/lib/observers/schedule-observer.js +67 -0
  90. package/lib/observers/socket.io-observer.js +226 -187
  91. package/lib/observers/stream-observer.js +19 -0
  92. package/lib/observers/thrift-observer.js +197 -0
  93. package/lib/observers/websocket-observer.js +175 -301
  94. package/lib/pack/activestack-pack.js +55 -0
  95. package/lib/pack/apenum.js +8 -0
  96. package/lib/pack/counter-pack.js +3 -0
  97. package/lib/pack/errorsnap-pack.js +69 -0
  98. package/lib/pack/event-pack.js +54 -0
  99. package/lib/pack/hitmap-pack.js +63 -0
  100. package/lib/pack/hitmap-pack1.js +152 -0
  101. package/lib/pack/log-sink-pack.js +14 -52
  102. package/lib/pack/netstat.js +15 -0
  103. package/lib/pack/otype.js +7 -0
  104. package/lib/pack/profile-pack.js +49 -0
  105. package/lib/pack/realtimeuser-pack.js +41 -0
  106. package/lib/pack/stat-general-pack.js +96 -0
  107. package/lib/pack/staterror-pack.js +120 -0
  108. package/lib/pack/stathttpc-pack.js +66 -0
  109. package/lib/pack/stathttpc-rec.js +78 -0
  110. package/lib/pack/statremote-pack.js +46 -0
  111. package/lib/pack/statservice-pack.js +63 -0
  112. package/lib/pack/statservice-pack1.js +88 -0
  113. package/lib/pack/statservice-rec.js +292 -0
  114. package/lib/pack/statservice-rec_dep.js +151 -0
  115. package/lib/pack/statsql-pack.js +69 -0
  116. package/lib/pack/statsql-rec.js +100 -0
  117. package/lib/pack/statuseragent-pack.js +44 -0
  118. package/lib/pack/tagcount-pack.js +4 -4
  119. package/lib/pack/tagctr.js +15 -0
  120. package/lib/pack/text-pack.js +50 -0
  121. package/lib/pack/time-count.js +25 -0
  122. package/lib/pack/websocket.js +15 -0
  123. package/lib/pack/zip-pack.js +70 -0
  124. package/lib/pii/pii-item.js +31 -0
  125. package/lib/pii/pii-mask.js +174 -0
  126. package/lib/plugin/plugin-loadermanager.js +57 -0
  127. package/lib/plugin/plugin.js +75 -0
  128. package/lib/service/tx-record.js +332 -0
  129. package/lib/stat/stat-error.js +116 -0
  130. package/lib/stat/stat-httpc.js +98 -0
  131. package/lib/stat/stat-remote-ip.js +46 -0
  132. package/lib/stat/stat-remote-ipurl.js +88 -0
  133. package/lib/stat/stat-sql.js +113 -0
  134. package/lib/stat/stat-tranx.js +58 -0
  135. package/lib/stat/stat-tx-caller.js +160 -0
  136. package/lib/stat/stat-tx-domain.js +111 -0
  137. package/lib/stat/stat-tx-referer.js +112 -0
  138. package/lib/stat/stat-useragent.js +48 -0
  139. package/lib/stat/timingsender.js +76 -0
  140. package/lib/step/activestack-step.js +38 -0
  141. package/lib/step/dbc-step.js +36 -0
  142. package/lib/step/http-stepx.js +67 -0
  143. package/lib/step/message-step.js +40 -0
  144. package/lib/step/method-stepx.js +45 -0
  145. package/lib/step/resultset-step.js +40 -0
  146. package/lib/step/securemsg-step.js +44 -0
  147. package/lib/step/socket-step.js +46 -0
  148. package/lib/step/sql-stepx.js +68 -0
  149. package/lib/step/sqlxtype.js +16 -0
  150. package/lib/step/step.js +66 -0
  151. package/lib/step/stepenum.js +54 -0
  152. package/lib/topology/link.js +63 -0
  153. package/lib/topology/nodeinfo.js +123 -0
  154. package/lib/topology/status-detector.js +111 -0
  155. package/lib/trace/trace-context-manager.js +113 -25
  156. package/lib/trace/trace-context.js +21 -7
  157. package/lib/trace/trace-httpc.js +17 -11
  158. package/lib/trace/trace-sql.js +29 -21
  159. package/lib/util/anylist.js +103 -0
  160. package/lib/util/cardinality/hyperloglog.js +106 -0
  161. package/lib/util/cardinality/murmurhash.js +31 -0
  162. package/lib/util/cardinality/registerset.js +75 -0
  163. package/lib/util/errordata.js +21 -0
  164. package/lib/util/escape-literal-sql.js +5 -5
  165. package/lib/util/hashutil.js +18 -18
  166. package/lib/util/iputil_x.js +527 -0
  167. package/lib/util/keygen.js +0 -3
  168. package/lib/util/kube-util.js +73 -0
  169. package/lib/util/linkedset.js +1 -2
  170. package/lib/util/nodeutil.js +2 -1
  171. package/lib/util/paramsecurity.js +80 -0
  172. package/lib/util/pre-process.js +13 -0
  173. package/lib/util/process-seq.js +166 -0
  174. package/lib/util/property-util.js +36 -0
  175. package/lib/util/request-queue.js +70 -0
  176. package/lib/util/requestdouble-queue.js +72 -0
  177. package/lib/util/resourceprofile.js +157 -0
  178. package/lib/util/stop-watch.js +30 -0
  179. package/lib/util/system-util.js +10 -0
  180. package/lib/util/userid-util.js +57 -0
  181. package/lib/value/map-value.js +3 -2
  182. package/package.json +9 -4
  183. package/whatap.conf +1 -4
  184. package/agent/darwin/arm64/whatap_nodejs +0 -0
  185. package/agent/linux/amd64/whatap_nodejs +0 -0
  186. package/agent/linux/arm64/whatap_nodejs +0 -0
  187. package/build.txt +0 -4
  188. package/lib/observers/ioredis-observer.js +0 -294
  189. package/lib/udp/async_sender.js +0 -119
  190. package/lib/udp/index.js +0 -17
  191. package/lib/udp/packet_enum.js +0 -52
  192. package/lib/udp/packet_queue.js +0 -69
  193. package/lib/udp/packet_type_enum.js +0 -33
  194. package/lib/udp/param_def.js +0 -72
  195. package/lib/udp/udp_session.js +0 -336
  196. package/lib/util/sql-util.js +0 -178
  197. package/lib/util/trace-helper.js +0 -91
  198. package/lib/util/transfer.js +0 -58
@@ -5,253 +5,196 @@
5
5
  */
6
6
 
7
7
  var TraceContextManager = require('../trace/trace-context-manager'),
8
- HashUtil = require('../util/hashutil'),
9
- Logger = require('../logger'),
10
- conf = require('../conf/configure'),
11
- AsyncSender = require('../udp/async_sender'),
12
- PacketTypeEnum = require('../udp/packet_type_enum'),
13
- shimmer = require('../core/shimmer'),
14
- AsyncResource = require('async_hooks').AsyncResource;
15
-
16
- var MongodbObserver = function (agent) {
8
+ SqlStepX = require('../step/sql-stepx'),
9
+ ResultSetStep = require('../step/resultset-step'),
10
+ DataTextAgent = require('../data/datatext-agent'),
11
+ StatError = require('../stat/stat-error'),
12
+ TextTypes = require('../lang/text-types'),
13
+ hashUtil = require('../util/hashutil'),
14
+ Logger = require('../logger');
15
+
16
+ var MongodbObserver = function(agent){
17
17
  this.agent = agent;
18
18
  this.packages = ['mongodb'];
19
- };
20
-
21
- var dbc_hash = 0;
22
- var dbc = '';
23
-
24
- var hookedConnections = new WeakSet();
19
+ }
25
20
 
26
- // MongoDB 명령어 매핑
27
- var MONGODB_COMMANDS = {
28
- 'insert': 'INSERT',
29
- 'insertOne': 'INSERTONE',
30
- 'insertMany': 'INSERTMANY',
31
- 'find': 'FIND',
32
- // 'findOne': 'FINDONE',
33
- 'count': 'COUNT',
34
- 'countDocuments': 'COUNTDOCUMENTS',
35
- 'update': 'UPDATE',
36
- 'updateOne': 'UPDATEONE',
37
- 'updateMany': 'UPDATEMANY',
38
- 'delete': 'DELETE',
39
- 'deleteOne': 'DELETEONE',
40
- 'deleteMany': 'DELETEMANY',
41
- 'remove': 'REMOVE',
42
- 'removeOne': 'REMOVEONE',
43
- 'removeMany': 'REMOVEMANY',
44
- 'replaceOne': 'REPLACEONE',
45
- 'findAndReplace': 'FINDANDREPLACE',
46
- 'findAndUpdate': 'FINDANDUPDATE',
47
- 'findAndDelete': 'FINDANDDELETE',
48
- 'findOneAndUpdate': 'FINDONEANDUPDATE',
49
- 'findOneAndReplace': 'FINDONEANDREPLACE',
50
- 'findOneAndDelete': 'FINDONEANDDELETE',
51
- 'findAndModify': 'FINDANDMODIFY'
52
- };
21
+ MongodbObserver.prototype.inject = function( mod, moduleName ) {
22
+ var self = this;
23
+ var aop = self.agent.aop;
53
24
 
54
- // MongoDB 에러 처리
55
- function handleMongoError(ctx, err) {
56
- if (!err) return;
25
+ if('instrument' in mod == false) {
26
+ return;
27
+ }
57
28
 
58
- try {
59
- var errorClass = err.code || err.name || 'MongoError';
60
- var errorMessage = err.message || 'mongodb error';
61
- var errorStack = '';
29
+ if(mod.__whatap_observe__) { return; }
30
+ mod.__whatap_observe__ = true;
62
31
 
63
- if (conf.trace_sql_error_stack && conf.trace_sql_error_depth && err.stack) {
64
- var traceDepth = conf.trace_sql_error_depth;
65
- var stackLines = err.stack.split("\n");
66
- if (stackLines.length > traceDepth) {
67
- stackLines = stackLines.slice(0, traceDepth + 1);
68
- }
69
- errorStack = stackLines.join("\n");
32
+ Logger.initPrint("MongodbObserver");
33
+
34
+ var requestTable = {},
35
+ nextRequest,
36
+ listener = mod.instrument({}, function(err, instrumentations) {});
37
+
38
+ listener.on('started', function (event) {
39
+ var requestId = event.requestId, request;
40
+ var ctx = TraceContextManager.getCurrentContext();
41
+ if(ctx == null) { return; }
42
+
43
+ if(nextRequest) {
44
+ requestTable[requestId] = { step : nextRequest.step, ctx : nextRequest.ctx };
45
+ nextRequest.requestId = requestId;
46
+ nextRequest = null;
47
+ } else if(event.commandName === 'findandmodify') {
48
+ var sql_step = new SqlStepX();
49
+ sql_step.start_time = ctx.getElapsedTime();
50
+ ctx.profile.add(sql_step);
51
+ requestTable[requestId] = {step : sql_step, ctx : ctx};
52
+ } else if( requestTable[requestId] == null ) {
53
+ return;
70
54
  }
71
55
 
72
- var shouldAddError = false;
73
- if (conf._is_trace_ignore_err_cls_contains === true && errorClass &&
74
- errorClass.toString().indexOf(conf.trace_ignore_err_cls_contains) < 0) {
75
- shouldAddError = true;
76
- } else if (conf._is_trace_ignore_err_msg_contains === true && errorMessage &&
77
- errorMessage.indexOf(conf.trace_ignore_err_msg_contains) < 0) {
78
- shouldAddError = true;
79
- } else if (conf._is_trace_ignore_err_cls_contains === false &&
80
- conf._is_trace_ignore_err_msg_contains === false) {
81
- shouldAddError = true;
56
+ var dbc = '',
57
+ dbc_hash = 0;
58
+ if(event.connectionId) {
59
+ var conn = event.connectionId;
60
+ dbc = 'mongodb://' + (conn.host || '') + ':' + (conn.port || '') + '/' + (event.databaseName || '');
61
+ dbc_hash = hashUtil.hashFromString(dbc);
62
+ DataTextAgent.DBC.add(dbc_hash, dbc);
82
63
  }
83
-
84
- if (shouldAddError) {
85
- if (!ctx.error) ctx.error = 1;
86
- ctx.status = 500;
87
- var errors = [errorClass];
88
- if (errorMessage) {
89
- errors.push(errorMessage);
90
- }
91
- if (errorStack || err.stack) {
92
- errors.push(errorStack || err.stack);
93
- }
94
-
95
- AsyncSender.send_packet(PacketTypeEnum.TX_ERROR, ctx, errors);
64
+ request = requestTable[requestId];
65
+ request.step.dbc = dbc_hash;
66
+
67
+ var dbName = event.databaseName,
68
+ collection = event.command[event.commandName],
69
+ command = Object.keys(event.command).reduce(function (result, key) {
70
+ if(key != event.commandName && key != 'filter' && key != 'documents') {
71
+ result[key] = event.command[key];
72
+ }
73
+ return result;
74
+ }, {});
75
+ command = JSON.stringify(command).slice(0, 1000);
76
+
77
+ var ctx = request.ctx;
78
+ ctx.sql_count++;
79
+
80
+ var command_string = '', queryKey = '', sql ='', sql_hash = '', crud ='';
81
+ if(event.commandName === 'find') {
82
+ queryKey = Object.keys(event.command.filter).toString().slice(0, 1000);
83
+ command_string = ',key='+queryKey + ',command=' + command;
84
+ crud = 'S';
85
+ ctx.sql_select++;
86
+ } else if(event.commandName === 'insert') {
87
+ queryKey = Object.keys(event.command.documents[0]).toString().slice(0, 1000);
88
+ command_string = ',documents='+queryKey + ',command=' + command;
89
+ crud = 'I';
90
+ ctx.sql_insert++;
91
+ } else if(event.commandName === 'delete') {
92
+ command_string = ',command=' + command;
93
+ crud = 'D';
94
+ ctx.sql_delete++;
95
+ } else if(event.commandName === 'findandmodify') {
96
+ command_string = ',command=' + command;
97
+ crud = 'U';
98
+ ctx.sql_update++;
99
+ } else if(event.commandName === 'update') {
100
+ command_string = ',command=' + command;
101
+ crud = 'U';
102
+ ctx.sql_update++;
103
+ } else {
104
+ ctx.sql_others++;
96
105
  }
97
- } catch (e) {
98
- Logger.printError('WHATAP-242', 'Error handling MongoDB error', e, false);
99
- }
100
- }
101
106
 
102
- // Collection 메서드 래퍼 생성
103
- function createCollectionMethodWrapper(methodName) {
104
- return function(original) {
105
- return function wrappedMethod() {
106
- var ctx = TraceContextManager.getCurrentContext();
107
- if (!ctx) {
108
- return original.apply(this, arguments);
107
+ sql = event.commandName + ' : databaseName=' + dbName +',collection=' + collection + command_string;
108
+ sql_hash = hashUtil.hashFromString(sql);
109
+ DataTextAgent.SQL.add(sql_hash, sql);
110
+ request.step.hash = sql_hash;
111
+ request.step.crud = crud.charCodeAt(0);
112
+ });
113
+
114
+ listener.on('succeeded', function (event) {
115
+ var requestId = event.requestId,
116
+ request = requestTable[event.requestId];
117
+
118
+ if(request == null) {
119
+ delete requestTable[requestId];
120
+ return;
121
+ }
122
+
123
+ TraceContextManager.resume(request.ctx._id);
124
+ request.step.elapsed = event.duration;
125
+ request.ctx.sql_time += request.step.elapsed;
126
+
127
+ var command = event.commandName || '';
128
+ if(command === 'find' && event.reply) {
129
+ var cursor = event.reply.cursor;
130
+ if(cursor != null) {
131
+ var fetch = cursor.firstBatch.length;
132
+ var rs_step = new ResultSetStep();
133
+ rs_step.elapsed = 0;
134
+ rs_step.dbc = request.step.dbc;
135
+ rs_step.sqlhash = request.step.hash;
136
+ rs_step.fetch = fetch;
137
+ request.ctx.profile.add(rs_step);
109
138
  }
139
+ }
110
140
 
111
- var args = Array.prototype.slice.call(arguments);
112
- var collectionName = this.collectionName || this.s?.name || 'unknown';
113
- var commandName = MONGODB_COMMANDS[methodName] || methodName.toUpperCase();
114
- var _dbc = this.dbName && dbc.indexOf(this.dbName) === -1 ? dbc + '/' + this.dbName : dbc;
115
-
116
- const asyncResource = new AsyncResource('mongodb-command');
117
-
118
- return asyncResource.runInAsyncScope(() => {
119
- // DB 연결 패킷 전송
120
- ctx.start_time = Date.now();
121
- ctx.elapsed = 0;
122
- ctx.active_sqlhash = true;
123
- AsyncSender.send_packet(PacketTypeEnum.TX_DB_CONN, ctx, [_dbc]);
124
-
125
- var command_start_time = Date.now();
126
- ctx.footprint(`MongoDB ${commandName} Start`);
127
-
128
- // 쿼리 텍스트 구성
129
- var queryParts = [commandName, collectionName];
130
- var fieldNames = [];
131
-
132
- try {
133
- // 첫 번째 인자에서 필드명 추출 (filter)
134
- if (args[0] && typeof args[0] === 'object' && !Array.isArray(args[0])) {
135
- fieldNames = Object.keys(args[0]);
136
- }
137
- if (fieldNames.length > 0) {
138
- queryParts.push('field=[' + fieldNames.join(',') + ']');
139
- }
140
- } catch (e) {
141
- Logger.printError('WHATAP-243', 'Error extracting field names', e, false);
142
- }
143
-
144
- var commandText = 'MongoDB ' + queryParts.join(' ');
145
-
146
- function executeCallback(err, result) {
147
- try {
148
- var command_elapsed = Date.now() - command_start_time;
149
-
150
- if (err) {
151
- handleMongoError(ctx, err);
152
- }
153
-
154
- ctx.elapsed = command_elapsed;
155
- ctx.active_sqlhash = false;
156
- AsyncSender.send_packet(PacketTypeEnum.TX_SQL, ctx, [dbc, commandText, '0']);
157
- ctx.footprint(`MongoDB ${commandName} Done`);
158
- } catch (e) {
159
- Logger.printError('WHATAP-244', 'Error in MongoDB callback', e, false);
160
- }
161
- }
141
+ if(command === 'update' && event.reply) {
142
+ request.step.updated = event.reply.nModified;
143
+ }
162
144
 
163
- // 콜백 처리
164
- var hasCallback = false;
165
- for (var i = args.length - 1; i >= 0; i--) {
166
- if (typeof args[i] === 'function') {
167
- hasCallback = true;
168
- var originalCallback = args[i];
145
+ if(command === 'findandmodify' && event.reply) {
146
+ var lastErrorObject = event.reply.lastErrorObject;
147
+ request.step.updated = lastErrorObject.n || 0;
148
+ }
169
149
 
170
- args[i] = asyncResource.bind(function() {
171
- var callbackArgs = Array.prototype.slice.call(arguments);
172
- executeCallback(callbackArgs[0], callbackArgs[1]);
150
+ delete requestTable[requestId];
151
+ });
173
152
 
174
- if (originalCallback && typeof originalCallback === 'function') {
175
- return originalCallback.apply(this, callbackArgs);
176
- }
177
- });
178
- break;
179
- }
180
- }
153
+ listener.on('failed', function (event) {
154
+ var requestId = event.requestId,
155
+ request = requestTable[event.requestId];
156
+ if(request == null) {
157
+ delete requestTable[requestId];
158
+ return;
159
+ }
160
+ TraceContextManager.resume(request.ctx._id);
161
+ request.step.elapsed = event.duration;
162
+ request.ctx.sql_time += request.step.elapsed;
163
+
164
+ request.ctx.error_class = event.failure.name || (event.failure.constructor && event.failure.constructor.name) || 'MongoDBError';
165
+ request.ctx.error_message = event.failure.message || 'MongoDB error';
166
+
167
+ var msgObj = { 'class': event.failure.message, 'msg': event.failure.message };
168
+ request.step.error = StatError.addError("mongodb", event.failure.message,
169
+ request.ctx.service_hash, TextTypes.SQL, request.step.hash);
170
+ if (request.ctx.error.isZero()) {
171
+ request.ctx.error = request.step.error;
172
+ }
173
+
174
+ delete requestTable[requestId];
175
+ });
181
176
 
182
- try {
183
- var result = original.apply(this, args);
177
+ ['cursor', 'insert', 'update', 'remove'].forEach( function(command) {
178
+ aop.before(mod.Server.prototype, command, function (obj, args) {
179
+ // Select but... DB name undefined return
180
+ if(command === 'cursor' && !args[1].find) return;
184
181
 
185
- // Promise 기반 처리
186
- if (!hasCallback && result && typeof result.then === 'function') {
187
- return result.then(function(res) {
188
- executeCallback(null, res);
189
- return res;
190
- }).catch(function(err) {
191
- executeCallback(err, null);
192
- throw err;
193
- });
194
- }
182
+ var ctx = TraceContextManager.getCurrentContext();
183
+ if(ctx == null) { return; }
195
184
 
196
- // 동기적 결과 처리
197
- if (!hasCallback) {
198
- executeCallback(null, result);
199
- }
185
+ var step = new SqlStepX();
186
+ step.start_time = ctx.getElapsedTime();
187
+ ctx.profile.add(step);
200
188
 
201
- return result;
202
- } catch (executeError) {
203
- executeCallback(executeError, null);
204
- throw executeError;
205
- }
189
+ var req = nextRequest = {step : step, ctx : ctx};
190
+ aop.functionHook(args, -1, function (obj, args) {
191
+ TraceContextManager.resume(ctx._id);
192
+ var requestId = req.requestId;
193
+ requestTable[requestId] = undefined;
206
194
  });
207
- };
208
- };
209
- }
210
-
211
- // Connection wrapper 함수
212
- var createConnectionWrapper = function() {
213
- return function(original) {
214
- return function wrappedConnect() {
215
- dbc = this.s && this.s.url ? this.s.url : 'mongodb://localhost:27017';
216
- dbc_hash = HashUtil.hashFromString(dbc);
217
- return original.apply(this, arguments);
218
- };
219
- };
220
- };
221
-
222
- MongodbObserver.prototype.inject = function(mod, moduleName) {
223
- if (mod.__whatap_observe__) {
224
- return;
225
- }
226
- mod.__whatap_observe__ = true;
227
- Logger.initPrint("MongodbObserver");
228
-
229
- if (conf.sql_enabled === false) {
230
- return;
231
- }
232
-
233
- var self = this;
234
-
235
- if (mod.MongoClient && !mod.MongoClient.__whatap_wrapped__) {
236
- // 정적 connect 메서드 래핑
237
- if (mod.MongoClient.prototype.connect && !mod.MongoClient.prototype.connect.__whatap_wrapped__) {
238
- shimmer.wrap(mod.MongoClient.prototype, 'connect', createConnectionWrapper());
239
- mod.MongoClient.connect.__whatap_wrapped__ = true;
240
- }
241
-
242
- mod.MongoClient.__whatap_wrapped__ = true;
243
- }
244
-
245
- // Collection 메서드들 래핑
246
- if (mod.Collection && mod.Collection.prototype && !mod.Collection.__whatap_wrapped__) {
247
- Object.keys(MONGODB_COMMANDS).forEach(function(methodName) {
248
- if (mod.Collection.prototype[methodName] && !mod.Collection.prototype[methodName].__whatap_wrapped__) {
249
- shimmer.wrap(mod.Collection.prototype, methodName, createCollectionMethodWrapper(methodName));
250
- mod.Collection.prototype[methodName].__whatap_wrapped__ = true;
251
- }
252
195
  });
253
- mod.Collection.__whatap_wrapped__ = true;
254
- }
196
+ });
255
197
  };
256
198
 
257
- exports.MongoObserver = MongodbObserver
199
+ exports.MongodbObserver = MongodbObserver;
200
+