whatap 0.4.78 → 0.4.80

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 (216) hide show
  1. package/.vscode/keep-context.json +3 -3
  2. package/README.md +51 -51
  3. package/bindings/darwin/x64/whatap.node +0 -0
  4. package/bindings/linux/ia32/whatap.node +0 -0
  5. package/bindings/linux/x64/whatap.node +0 -0
  6. package/help.txt +10 -10
  7. package/index.js +8 -8
  8. package/lib/conf/conf-sys-mon.js +100 -100
  9. package/lib/conf/config-default.js +238 -238
  10. package/lib/conf/configure.js +423 -423
  11. package/lib/conf/license.js +41 -41
  12. package/lib/control/cmd-config.js +23 -23
  13. package/lib/control/control-handler.js +344 -344
  14. package/lib/control/packagectr-helper.js +149 -149
  15. package/lib/core/agent.js +329 -328
  16. package/lib/core/interceptor.js +142 -142
  17. package/lib/core/request-agent.js +26 -26
  18. package/lib/counter/counter-manager.js +127 -127
  19. package/lib/counter/meter/meter-activex.js +66 -66
  20. package/lib/counter/meter/meter-httpc.js +57 -57
  21. package/lib/counter/meter/meter-resource.js +9 -9
  22. package/lib/counter/meter/meter-service.js +167 -167
  23. package/lib/counter/meter/meter-socket.io.js +50 -50
  24. package/lib/counter/meter/meter-sql.js +70 -70
  25. package/lib/counter/meter/meter-users.js +57 -57
  26. package/lib/counter/meter.js +183 -183
  27. package/lib/counter/task/activetransaction.js +93 -93
  28. package/lib/counter/task/agentinfo.js +105 -105
  29. package/lib/counter/task/counter-task.js +9 -9
  30. package/lib/counter/task/gcstat.js +34 -34
  31. package/lib/counter/task/heapmem.js +24 -24
  32. package/lib/counter/task/httpc.js +75 -75
  33. package/lib/counter/task/proc-cpu.js +28 -28
  34. package/lib/counter/task/realtimeuser.js +30 -30
  35. package/lib/counter/task/res/systemECSTask.js +54 -54
  36. package/lib/counter/task/res/systemKubeTask.js +52 -52
  37. package/lib/counter/task/res/util/awsEcsClientThread.js +166 -166
  38. package/lib/counter/task/res/util/linuxProcStatUtil.js +13 -13
  39. package/lib/counter/task/res-sys-cpu.js +61 -61
  40. package/lib/counter/task/service.js +201 -201
  41. package/lib/counter/task/socketio.js +29 -29
  42. package/lib/counter/task/sql.js +104 -104
  43. package/lib/counter/task/systemperf.js +42 -42
  44. package/lib/data/datapack-sender.js +256 -256
  45. package/lib/data/dataprofile-agent.js +136 -136
  46. package/lib/data/datatext-agent.js +135 -135
  47. package/lib/data/event-level.js +15 -15
  48. package/lib/data/test.js +48 -48
  49. package/lib/env/constants.js +20 -20
  50. package/lib/kube/kube-client.js +143 -143
  51. package/lib/lang/text-types.js +58 -58
  52. package/lib/logger.js +319 -319
  53. package/lib/net/netflag.js +54 -54
  54. package/lib/net/paramdef.js +40 -40
  55. package/lib/net/receiver.js +65 -65
  56. package/lib/net/security-master.js +182 -173
  57. package/lib/net/sender.js +140 -140
  58. package/lib/net/tcp-return.js +17 -17
  59. package/lib/net/tcp-session.js +285 -285
  60. package/lib/net/tcpreq-client-proxy.js +69 -69
  61. package/lib/net/tcprequest-mgr.js +57 -57
  62. package/lib/observers/cluster-observer.js +21 -21
  63. package/lib/observers/express-observer.js +214 -214
  64. package/lib/observers/file-observer.js +184 -184
  65. package/lib/observers/global-observer.js +30 -30
  66. package/lib/observers/http-observer.js +704 -704
  67. package/lib/observers/maria-observer.js +382 -382
  68. package/lib/observers/memcached-observer.js +55 -55
  69. package/lib/observers/mongo-observer.js +262 -265
  70. package/lib/observers/mongodb-observer.js +197 -197
  71. package/lib/observers/mongoose-observer.js +83 -83
  72. package/lib/observers/mssql-observer.js +205 -205
  73. package/lib/observers/mysql-observer.js +436 -394
  74. package/lib/observers/net-observer.js +72 -72
  75. package/lib/observers/pgsql-observer.js +295 -295
  76. package/lib/observers/process-observer.js +25 -25
  77. package/lib/observers/promise-observer.js +31 -31
  78. package/lib/observers/redis-observer.js +156 -109
  79. package/lib/observers/schedule-observer.js +66 -66
  80. package/lib/observers/socket.io-observer.js +54 -54
  81. package/lib/observers/stream-observer.js +19 -19
  82. package/lib/observers/thrift-observer.js +196 -196
  83. package/lib/pack/activestack-pack.js +54 -54
  84. package/lib/pack/counter-pack.js +649 -649
  85. package/lib/pack/errorsnap-pack.js +68 -68
  86. package/lib/pack/event-pack.js +53 -53
  87. package/lib/pack/hitmap-pack.js +62 -62
  88. package/lib/pack/hitmap-pack1.js +146 -146
  89. package/lib/pack/netstat.js +14 -14
  90. package/lib/pack/pack.js +49 -49
  91. package/lib/pack/packenum.js +60 -60
  92. package/lib/pack/param-pack.js +213 -213
  93. package/lib/pack/profile-pack.js +48 -48
  94. package/lib/pack/realtimeuser-pack.js +40 -40
  95. package/lib/pack/stat-general-pack.js +95 -95
  96. package/lib/pack/staterror-pack.js +119 -119
  97. package/lib/pack/stathttpc-pack.js +66 -66
  98. package/lib/pack/stathttpc-rec.js +78 -78
  99. package/lib/pack/statremote-pack.js +45 -45
  100. package/lib/pack/statservice-pack.js +62 -62
  101. package/lib/pack/statservice-pack1.js +87 -87
  102. package/lib/pack/statservice-rec.js +292 -292
  103. package/lib/pack/statservice-rec_dep.js +151 -151
  104. package/lib/pack/statsql-pack.js +69 -69
  105. package/lib/pack/statsql-rec.js +100 -100
  106. package/lib/pack/statuseragent-pack.js +43 -43
  107. package/lib/pack/tagcount-pack.js +398 -398
  108. package/lib/pack/tagctr.js +14 -14
  109. package/lib/pack/text-pack.js +49 -49
  110. package/lib/pack/time-count.js +25 -25
  111. package/lib/pack/websocket.js +14 -14
  112. package/lib/plugin/plugin-loadermanager.js +56 -56
  113. package/lib/plugin/plugin.js +75 -75
  114. package/lib/requestlog.js +326 -326
  115. package/lib/service/tx-record.js +288 -284
  116. package/lib/stat/stat-error.js +116 -116
  117. package/lib/stat/stat-httpc.js +97 -97
  118. package/lib/stat/stat-remoteip.js +46 -46
  119. package/lib/stat/stat-sql.js +112 -112
  120. package/lib/stat/stat-tranx.js +57 -57
  121. package/lib/stat/stat-tx-caller.js +159 -159
  122. package/lib/stat/stat-tx-domain.js +110 -110
  123. package/lib/stat/stat-tx-referer.js +111 -111
  124. package/lib/stat/stat-useragent.js +48 -48
  125. package/lib/stat/timingsender.js +72 -72
  126. package/lib/step/activestack-step.js +37 -37
  127. package/lib/step/dbc-step.js +35 -35
  128. package/lib/step/http-stepx.js +66 -66
  129. package/lib/step/message-step.js +39 -39
  130. package/lib/step/method-stepx.js +46 -46
  131. package/lib/step/resultset-step.js +39 -39
  132. package/lib/step/securemsg-step.js +43 -43
  133. package/lib/step/socket-step.js +46 -46
  134. package/lib/step/sql-stepx.js +67 -67
  135. package/lib/step/sqlxtype.js +15 -15
  136. package/lib/step/step.js +65 -65
  137. package/lib/step/stepenum.js +53 -53
  138. package/lib/trace/local-context.js +13 -13
  139. package/lib/trace/parsed-sql.js +13 -13
  140. package/lib/trace/profile-collector.js +70 -70
  141. package/lib/trace/serviceurl-pattern-detector.js +117 -117
  142. package/lib/trace/trace-context-manager.js +195 -195
  143. package/lib/trace/trace-context.js +134 -134
  144. package/lib/util/anylist.js +102 -102
  145. package/lib/util/array-util.js +100 -100
  146. package/lib/util/bitutil.js +27 -27
  147. package/lib/util/cardinality/hyperloglog.js +105 -105
  148. package/lib/util/cardinality/murmurhash.js +31 -31
  149. package/lib/util/cardinality/registerset.js +74 -74
  150. package/lib/util/config-util.js +17 -17
  151. package/lib/util/cypher.js +89 -89
  152. package/lib/util/datetimehelper.js +237 -229
  153. package/lib/util/dateutil.js +110 -106
  154. package/lib/util/errordata.js +20 -20
  155. package/lib/util/escape-literal-sql.js +342 -342
  156. package/lib/util/hashutil2.js +126 -126
  157. package/lib/util/hexa32.js +57 -57
  158. package/lib/util/index.js +78 -78
  159. package/lib/util/intint-map.js +47 -47
  160. package/lib/util/intkey-linkedmap.js +26 -26
  161. package/lib/util/intkey-map.js +25 -25
  162. package/lib/util/intset.js +82 -82
  163. package/lib/util/iputil.js +119 -119
  164. package/lib/util/iputil_x.js +526 -526
  165. package/lib/util/keygen.js +17 -17
  166. package/lib/util/kube-util.js +72 -72
  167. package/lib/util/longint-linkedmap.js +35 -35
  168. package/lib/util/longkey-linkedmap.js +25 -25
  169. package/lib/util/longlong-linkedmap.js +37 -37
  170. package/lib/util/nodeutil.js +67 -67
  171. package/lib/util/oidutil.js +96 -93
  172. package/lib/util/paramsecurity.js +78 -78
  173. package/lib/util/pathtree.js +172 -172
  174. package/lib/util/pre-process.js +13 -13
  175. package/lib/util/process-seq.js +165 -165
  176. package/lib/util/property-util.js +35 -35
  177. package/lib/util/request-queue.js +42 -42
  178. package/lib/util/requestdouble-queue.js +72 -72
  179. package/lib/util/resourceprofile.js +156 -156
  180. package/lib/util/seedrandom.js +242 -242
  181. package/lib/util/stop-watch.js +29 -29
  182. package/lib/util/string-util.js +9 -9
  183. package/lib/util/stringkey-linkedmap.js +28 -28
  184. package/lib/util/stringnum-linkedmap.js +31 -31
  185. package/lib/util/stringset.js +65 -65
  186. package/lib/util/system-util.js +9 -9
  187. package/lib/util/userid-util.js +57 -57
  188. package/lib/util/utils.js +67 -67
  189. package/lib/value/blob-value.js +61 -61
  190. package/lib/value/boolean-value.js +51 -51
  191. package/lib/value/decimal-value.js +71 -71
  192. package/lib/value/double-summary.js +105 -105
  193. package/lib/value/double-value.js +50 -50
  194. package/lib/value/float-array.js +59 -59
  195. package/lib/value/float-value.js +64 -64
  196. package/lib/value/int-array.js +59 -59
  197. package/lib/value/int-map-value.js +151 -151
  198. package/lib/value/int-value.js +64 -64
  199. package/lib/value/ip4-value.js +83 -83
  200. package/lib/value/list-value.js +136 -136
  201. package/lib/value/long-array.js +59 -59
  202. package/lib/value/long-summary.js +105 -105
  203. package/lib/value/map-value.js +175 -175
  204. package/lib/value/metric-value.js +157 -157
  205. package/lib/value/null-value.js +42 -42
  206. package/lib/value/number-value.js +34 -34
  207. package/lib/value/summary-value.js +29 -29
  208. package/lib/value/text-array.js +117 -117
  209. package/lib/value/text-value.js +59 -59
  210. package/lib/value/texthash-value.js +49 -49
  211. package/lib/value/value.js +14 -14
  212. package/lib/value/valueenum.js +99 -99
  213. package/logs/whatap-20230906.log +54 -0
  214. package/package.json +28 -28
  215. package/whatap.conf +1 -1
  216. package/logs/whatap-20230616.log +0 -13
@@ -1,383 +1,383 @@
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 TraceContextManager = require('../trace/trace-context-manager'),
8
- ParsedSql = require('../trace/parsed-sql'),
9
- SqlStepX = require('../step/sql-stepx'),
10
- DBCStep = require('../step/dbc-step'),
11
- ResultSetStep = require('../step/resultset-step'),
12
- DataTextAgent = require('../data/datatext-agent'),
13
- StatSql = require('../stat/stat-sql'),
14
- MeterSql = require('../counter/meter/meter-sql'),
15
- conf = require('../conf/configure'),
16
- IntKeyMap = require('../util/intkey-map'),
17
- EscapeLiteralSQL = require('../util/escape-literal-sql'),
18
- HashUtil = require('../util/hashutil'),
19
- StatError = require('../stat/stat-error'),
20
- TextTypes = require('../lang/text-types'),
21
- ParamSecurity = require('../util/paramsecurity'),
22
- Logger = require('../logger'),
23
- conf = require('../conf/configure'),
24
- DateUtil = require('../util/dateutil'),
25
- Buffer = require('buffer').Buffer;
26
-
27
- var MariaObserver = function (agent) {
28
- this.agent = agent;
29
- this.packages = ['mariadb/callback'];
30
- };
31
-
32
- var queryHook = function (dbc_hash, agent) {
33
-
34
- return function (obj, args) {
35
- var ctx = TraceContextManager.getCurrentContext();
36
-
37
- if (ctx == null || args[0] == null) { return; }
38
- if(args[0].sql == null && typeof args[0] != 'string') { return; }
39
-
40
- var sql_step = new SqlStepX();
41
- sql_step.start_time = ctx.getElapsedTime();
42
- ctx.profile.push(sql_step);
43
-
44
- ctx.footprint('Maria Query Start');
45
-
46
- ctx.sql_count++;
47
-
48
- var sql = args.length > 0 ? args[0] : undefined,
49
- psql = null;
50
-
51
- if(typeof sql !== 'string') {
52
- sql = args[0].sql || undefined;
53
- }
54
-
55
- if (typeof sql === 'string' && sql.length > 0) {
56
- try {
57
- psql = escapeLiteral(sql);
58
- } catch (e) {
59
- Logger.printError('WHATAP-191', 'MariaObserver escapeliteral error', e);
60
- }
61
- } else {
62
- sql = '';
63
- psql = escapeLiteral(sql);
64
- }
65
-
66
- if(psql != null) {
67
- sql_step.hash = psql.sql;
68
- // sql_step.crud = psql.type.charCodeAt(0);
69
- }
70
- sql_step.dbc = dbc_hash;
71
-
72
- var els = new EscapeLiteralSQL(sql);
73
- els.process();
74
-
75
- ctx.active_sqlhash = sql_step.hash;
76
- ctx.active_dbc = sql_step.dbc;
77
- //ctx.active_crud = sql_step.crud;
78
-
79
- if(conf.profile_sql_param_enabled) {
80
- var params = args.length > 1 && Array.isArray(args[1]) ? args[1] : undefined;
81
- sql_step.setTrue(1);
82
- var crc = {value : 0};
83
- sql_step.p1 = toParamBytes(psql.param, crc);
84
- if(params != undefined) {
85
- const result = params.map((param) => {
86
- if(typeof param === 'string'){
87
- return `'${param}'`
88
- }
89
- return param
90
- }).toString()
91
- sql_step.p2 = toParamBytes(result, crc);
92
- }
93
- sql_step.pcrc = crc.value;
94
- }
95
-
96
- var lastCallback = false;
97
-
98
- function queryCallback(obj, args) {
99
- if (ctx == null) { return; }
100
- TraceContextManager.resume(ctx._id);
101
-
102
- if(args[0]) {
103
- try{
104
- if(conf._is_trace_ignore_err_cls_contains === true && args[0].code.indexOf(conf.trace_ignore_err_cls_contains) < 0){
105
- sql_step.error = StatError.addError( 'Maria-'+args[0].code, args[0].message || 'Maria error', ctx.service_hash, TextTypes.SQL, step.hash); /*long*/
106
- if (ctx.error.isZero()) { ctx.error = sql_step.error; }
107
- } else if(conf._is_trace_ignore_err_msg_contains === true && args[0].message.indexOf(conf.trace_ignore_err_msg_contains) < 0){
108
- sql_step.error = StatError.addError( 'Maria-'+args[0].code, args[0].message || 'Maria error', ctx.service_hash, TextTypes.SQL, step.hash); /*long*/
109
- if (ctx.error.isZero()) { ctx.error = sql_step.error; }
110
- } else if(conf._is_trace_ignore_err_cls_contains === false && conf._is_trace_ignore_err_msg_contains === false) {
111
- sql_step.error = StatError.addError( 'Maria-'+args[0].code, args[0].message || 'Maria error', ctx.service_hash, TextTypes.SQL, step.hash); /*long*/
112
- if (ctx.error.isZero()) { ctx.error = sql_step.error; }
113
- }
114
- }catch(e) {
115
-
116
- }
117
- }
118
-
119
- sql_step.elapsed = ctx.getElapsedTime() - sql_step.start_time;
120
- ctx.sql_time += sql_step.elapsed;
121
-
122
- ctx.footprint('Maria Query Done');
123
-
124
- MeterSql.add(dbc_hash, sql_step.elapsed, false);
125
- StatSql.addSqlTime( ctx.service_hash, sql_step.dbc,
126
- sql_step.hash, sql_step.elapsed, args[0] != null, 0);
127
-
128
- if (Array.isArray(args[1]) && psql != null && psql.type === 'S') {
129
- var result_step = new ResultSetStep();
130
- result_step.start_time = ctx.getElapsedTime();
131
- result_step.elapsed = 0;
132
- result_step.fetch = args[1].length;
133
- result_step.sqlhash = psql.sql;
134
- result_step.dbc = dbc_hash;
135
- ctx.profile.push(result_step);
136
- MeterSql.addFetch(result_step.dbc, result_step.fetch, 0);
137
- StatSql.addFetch(result_step.dbc, result_step.sqlhash, result_step.fetch, 0);
138
- }
139
-
140
- if (args[1] != null && psql != null && psql.type === 'U') {
141
- sql_step.updated = args[1].affectedRows || 0;
142
- //StatSql.addUpdate(dbc_hash, psql.sql, sql_step.updated);
143
- }
144
- }
145
-
146
- lastCallback = agent.aop.functionHook(args, -1, queryCallback);
147
-
148
- if(lastCallback === false && args.length>0 && args[0]._callback){
149
- agent.aop.both(args[0], '_callback', queryCallback);
150
- }
151
- }
152
- };
153
-
154
- var toParamBytes = function(p, crc) {
155
- if(p == null || p.length === 0) {
156
- return null;
157
- }
158
- try{
159
- return ParamSecurity.encrypt(Buffer.from(p), crc);
160
- } catch(e) {
161
- return null;
162
- }
163
- };
164
-
165
- var errorDelegate = function () {
166
- return function (obj, args) {
167
- var ctx = TraceContextManager.getCurrentContext();
168
- if(ctx == null) { return; }
169
-
170
- var laststep = ctx.profile.getLastSteps(1);
171
- if(laststep == null || laststep.length === 0) { return; }
172
-
173
- var step = laststep[0];
174
- if(!args[0].fatal) {
175
- MeterSql.add(step.dbc, step.elapsed, true);
176
- StatSql.addSqlTime(ctx, ctx.service_hash, step.dbc, step.hash, step.elapsed, true, 0);
177
- }
178
-
179
- try{
180
- if(args[0].fatal) {
181
- // Connection Error
182
- step.error = StatError.addError( 'Maria-'+args[0].code, args[0].message, ctx.service_hash); /*long*/
183
- if (ctx.error.isZero()) { ctx.error = step.error; }
184
- } else {
185
- if(conf._is_trace_ignore_err_cls_contains === true && args[0].code.indexOf(conf.trace_ignore_err_cls_contains) < 0){
186
- step.error = StatError.addError( 'Maria-'+args[0].code, args[0].message || 'Maria error', ctx.service_hash, TextTypes.SQL, step.hash); /*long*/
187
- if (ctx.error.isZero()) { ctx.error = step.error; }
188
- } else if(conf._is_trace_ignore_err_msg_contains === true && args[0].message.indexOf(conf.trace_ignore_err_msg_contains) < 0){
189
- step.error = StatError.addError( 'Maria-'+args[0].code, args[0].message || 'Maria error', ctx.service_hash, TextTypes.SQL, step.hash); /*long*/
190
- if (ctx.error.isZero()) { ctx.error = step.error; }
191
- } else if(conf._is_trace_ignore_err_cls_contains === false && conf._is_trace_ignore_err_msg_contains === false) {
192
- step.error = StatError.addError( 'Maria-'+args[0].code, args[0].message || 'Maria error', ctx.service_hash, TextTypes.SQL, step.hash); /*long*/
193
- if (ctx.error.isZero()) { ctx.error = step.error; }
194
- }
195
- }
196
- } catch(e) {
197
- }
198
- }
199
- };
200
-
201
- MariaObserver.prototype.inject = function (mod, moduleName) {
202
- if(mod.__whatap_observe__) { return; }
203
- mod.__whatap_observe__ = true;
204
-
205
- Logger.initPrint("MariaObserver");
206
-
207
- var self = this;
208
- var aop = self.agent.aop;
209
-
210
- if( conf.sql_enabled === false ) { return; }
211
- var dbc_hash=0;
212
- aop.both(mod, 'createConnection',
213
- function (obj, args, lctx) {
214
- var ctx = lctx.context;
215
- if(ctx == null || ctx.db_opening) { return; }
216
- ctx.db_opening = true;
217
- ctx.footprint('Maria Connecting Start');
218
-
219
- var dbc_step = new DBCStep();
220
- dbc_step.start_time = ctx.getElapsedTime();
221
- lctx.step = dbc_step;
222
- },
223
- function (obj, args, ret, lctx) {
224
- if(dbc_hash === 0){
225
- var dbc;
226
- if(args.length > 0) {
227
- var info = (args[0] || {});
228
- dbc = 'maria://';
229
- dbc += info.user || '';
230
- dbc += "@";
231
- dbc += info.host || '';
232
- dbc += '/';
233
- dbc += info.database || '';
234
- dbc_hash = HashUtil.hashFromString(dbc);
235
- DataTextAgent.DBC.add(dbc_hash, dbc);
236
- DataTextAgent.METHOD.add(dbc_hash, dbc);
237
- DataTextAgent.ERROR.add(dbc_hash, dbc);
238
- }
239
- }
240
-
241
- aop.both(ret, 'query', queryHook(dbc_hash, self.agent), function (obj, args, ret, lctx) {
242
- var ctx = lctx.context;
243
- TraceContextManager.resume(ctx);
244
- });
245
-
246
- aop.both(ret, 'execute', queryHook(dbc_hash, self.agent), function (obj, args, ret, lctx) {
247
- var ctx = lctx.context;
248
- TraceContextManager.resume(ctx);
249
- });
250
-
251
- aop.after(ret._protocol, '_delegateError', errorDelegate());
252
-
253
- var ctx = lctx.context,
254
- step = lctx.step;
255
-
256
- if (ctx == null || step == null) { return; }
257
-
258
- TraceContextManager.resume(ctx);
259
- ctx.footprint('Maria Connecting Done');
260
- ctx.db_opening = false;
261
- step.hash = dbc_hash;
262
-
263
- aop.both(ret, 'connect', function (obj, args) {
264
- var ctx = TraceContextManager.getCurrentContext();
265
- if (ctx == null) { return; }
266
-
267
- ctx.footprint('Maria Connecting Start');
268
-
269
- ctx.db_opening=true;
270
-
271
- aop.functionHook(args, -1, function (obj, args) {
272
- if (args[0] && step.error.isZero()) {
273
- step.error = StatError.addError('Maria-'+args[0].code,
274
- args[0].message, ctx.service_hash);
275
- step.elapsed = ctx.getElapsedTime() - step.start_time;
276
- }
277
- TraceContextManager.resume(ctx._id);
278
- });
279
- ctx.profile.push(step);
280
- }
281
- ,
282
- function (obj, args, ret, lctx) {
283
- if(lctx.context){
284
- ctx.db_opening=false;
285
- ctx.footprint('Maria Connecting Done');
286
- }
287
- }
288
- );
289
- });
290
-
291
-
292
- var dbc_pool_hash=0;
293
- aop.after(mod, ['createPool', 'createPoolCluster'], function (obj, args, ret) {
294
-
295
- var dbc = 'maria://';
296
- if(dbc_pool_hash==0){
297
- if(args.length > 0) {
298
- var info = args[0];
299
- //Open [DatabaseName] connection 메세지 보여줄때 필요함.
300
- dbc += info.user || '';
301
- dbc += "@";
302
- dbc += info.host || '';
303
- dbc += '/';
304
- dbc += info.database || '';
305
- }
306
-
307
- dbc_pool_hash = HashUtil.hashFromString(dbc);
308
- DataTextAgent.DBC.add(dbc_pool_hash, dbc);
309
- DataTextAgent.METHOD.add(dbc_pool_hash, dbc);
310
- DataTextAgent.ERROR.add(dbc_pool_hash, dbc);
311
- }
312
- aop.both(ret, 'getConnection', function (obj, args, lctx) {
313
- var ctx = TraceContextManager.getCurrentContext();
314
- if(ctx == null) {return;}
315
-
316
- var dbc_step = new DBCStep();
317
- dbc_step.hash = dbc_pool_hash;
318
- dbc_step.start_time = ctx.getElapsedTime();
319
-
320
- aop.functionHook(args, -1, function (obj, args) {
321
- dbc_step.elapsed = ctx.getElapsedTime() - dbc_step.start_time;
322
- ctx.profile.push(dbc_step);
323
-
324
- TraceContextManager.resume(ctx._id);
325
- DataTextAgent.DBC.add(dbc_hash, dbc);
326
-
327
- if(args[0] != null) { return; }
328
- var conn = args[1];
329
- if(conn.__query_hook__) { return; }
330
- conn.__query_hook__ = true;
331
- aop.before(conn, 'query', queryHook(dbc_pool_hash, self.agent));
332
- aop.before(conn, 'execute', queryHook(dbc_pool_hash, self.agent));
333
- aop.before(conn._protocol, '_delegateError', errorDelegate(ctx));
334
- });
335
- }, function (obj, args, ret, lctx) {
336
- MeterSql.setConnection(1, 0, dbc);
337
- });
338
- });
339
- };
340
-
341
- var checkedSql = new IntKeyMap(2000).setMax(2000);
342
- var nonLiteSql = new IntKeyMap(5000).setMax(5000);
343
- var date = DateUtil.yyyymmdd();
344
-
345
- function escapeLiteral(sql) {
346
- if(sql == null) { sql = ''; }
347
-
348
- if(date !== DateUtil.yyyymmdd()) {
349
- checkedSql.clear();
350
- nonLiteSql.clear();
351
- date = DateUtil.yyyymmdd();
352
- Logger.print('WHATAP-SQL-CLEAR', 'MariaObserver CLEAR OK!!!!!!!!!!!!!!!!', false);
353
- }
354
-
355
- var sqlHash = HashUtil.hashFromString(sql);
356
- var psql = nonLiteSql.get(sqlHash);
357
-
358
- if(psql != null) {
359
- return psql;
360
- }
361
- psql = checkedSql.get(sqlHash);
362
-
363
- if(psql != null) {
364
- return psql;
365
- }
366
-
367
- var els = new EscapeLiteralSQL(sql);
368
- els.process();
369
-
370
- var hash = HashUtil.hashFromString(els.getParsedSql());
371
- DataTextAgent.SQL.add(hash, els.getParsedSql());
372
-
373
- if(hash === sqlHash) {
374
- psql = new ParsedSql(els.sqlType, hash, null);
375
- nonLiteSql.put(sqlHash, psql);
376
- } else {
377
- psql = new ParsedSql(els.sqlType, hash, els.getParameter());
378
- checkedSql.put(sqlHash, psql);
379
- }
380
- return psql;
381
- }
382
-
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 TraceContextManager = require('../trace/trace-context-manager'),
8
+ ParsedSql = require('../trace/parsed-sql'),
9
+ SqlStepX = require('../step/sql-stepx'),
10
+ DBCStep = require('../step/dbc-step'),
11
+ ResultSetStep = require('../step/resultset-step'),
12
+ DataTextAgent = require('../data/datatext-agent'),
13
+ StatSql = require('../stat/stat-sql'),
14
+ MeterSql = require('../counter/meter/meter-sql'),
15
+ conf = require('../conf/configure'),
16
+ IntKeyMap = require('../util/intkey-map'),
17
+ EscapeLiteralSQL = require('../util/escape-literal-sql'),
18
+ HashUtil = require('../util/hashutil'),
19
+ StatError = require('../stat/stat-error'),
20
+ TextTypes = require('../lang/text-types'),
21
+ ParamSecurity = require('../util/paramsecurity'),
22
+ Logger = require('../logger'),
23
+ conf = require('../conf/configure'),
24
+ DateUtil = require('../util/dateutil'),
25
+ Buffer = require('buffer').Buffer;
26
+
27
+ var MariaObserver = function (agent) {
28
+ this.agent = agent;
29
+ this.packages = ['mariadb/callback'];
30
+ };
31
+
32
+ var queryHook = function (dbc_hash, agent) {
33
+
34
+ return function (obj, args) {
35
+ var ctx = TraceContextManager.getCurrentContext();
36
+
37
+ if (ctx == null || args[0] == null) { return; }
38
+ if(args[0].sql == null && typeof args[0] != 'string') { return; }
39
+
40
+ var sql_step = new SqlStepX();
41
+ sql_step.start_time = ctx.getElapsedTime();
42
+ ctx.profile.push(sql_step);
43
+
44
+ ctx.footprint('Maria Query Start');
45
+
46
+ ctx.sql_count++;
47
+
48
+ var sql = args.length > 0 ? args[0] : undefined,
49
+ psql = null;
50
+
51
+ if(typeof sql !== 'string') {
52
+ sql = args[0].sql || undefined;
53
+ }
54
+
55
+ if (typeof sql === 'string' && sql.length > 0) {
56
+ try {
57
+ psql = escapeLiteral(sql);
58
+ } catch (e) {
59
+ Logger.printError('WHATAP-191', 'MariaObserver escapeliteral error', e);
60
+ }
61
+ } else {
62
+ sql = '';
63
+ psql = escapeLiteral(sql);
64
+ }
65
+
66
+ if(psql != null) {
67
+ sql_step.hash = psql.sql;
68
+ // sql_step.crud = psql.type.charCodeAt(0);
69
+ }
70
+ sql_step.dbc = dbc_hash;
71
+
72
+ var els = new EscapeLiteralSQL(sql);
73
+ els.process();
74
+
75
+ ctx.active_sqlhash = sql_step.hash;
76
+ ctx.active_dbc = sql_step.dbc;
77
+ //ctx.active_crud = sql_step.crud;
78
+
79
+ if(conf.profile_sql_param_enabled) {
80
+ var params = args.length > 1 && Array.isArray(args[1]) ? args[1] : undefined;
81
+ sql_step.setTrue(1);
82
+ var crc = {value : 0};
83
+ sql_step.p1 = toParamBytes(psql.param, crc);
84
+ if(params != undefined) {
85
+ const result = params.map((param) => {
86
+ if(typeof param === 'string'){
87
+ return `'${param}'`
88
+ }
89
+ return param
90
+ }).toString()
91
+ sql_step.p2 = toParamBytes(result, crc);
92
+ }
93
+ sql_step.pcrc = crc.value;
94
+ }
95
+
96
+ var lastCallback = false;
97
+
98
+ function queryCallback(obj, args) {
99
+ if (ctx == null) { return; }
100
+ TraceContextManager.resume(ctx._id);
101
+
102
+ if(args[0]) {
103
+ try{
104
+ if(conf._is_trace_ignore_err_cls_contains === true && args[0].code.indexOf(conf.trace_ignore_err_cls_contains) < 0){
105
+ sql_step.error = StatError.addError( 'Maria-'+args[0].code, args[0].message || 'Maria error', ctx.service_hash, TextTypes.SQL, step.hash); /*long*/
106
+ if (ctx.error.isZero()) { ctx.error = sql_step.error; }
107
+ } else if(conf._is_trace_ignore_err_msg_contains === true && args[0].message.indexOf(conf.trace_ignore_err_msg_contains) < 0){
108
+ sql_step.error = StatError.addError( 'Maria-'+args[0].code, args[0].message || 'Maria error', ctx.service_hash, TextTypes.SQL, step.hash); /*long*/
109
+ if (ctx.error.isZero()) { ctx.error = sql_step.error; }
110
+ } else if(conf._is_trace_ignore_err_cls_contains === false && conf._is_trace_ignore_err_msg_contains === false) {
111
+ sql_step.error = StatError.addError( 'Maria-'+args[0].code, args[0].message || 'Maria error', ctx.service_hash, TextTypes.SQL, step.hash); /*long*/
112
+ if (ctx.error.isZero()) { ctx.error = sql_step.error; }
113
+ }
114
+ }catch(e) {
115
+
116
+ }
117
+ }
118
+
119
+ sql_step.elapsed = ctx.getElapsedTime() - sql_step.start_time;
120
+ ctx.sql_time += sql_step.elapsed;
121
+
122
+ ctx.footprint('Maria Query Done');
123
+
124
+ MeterSql.add(dbc_hash, sql_step.elapsed, false);
125
+ StatSql.addSqlTime( ctx.service_hash, sql_step.dbc,
126
+ sql_step.hash, sql_step.elapsed, args[0] != null, 0);
127
+
128
+ if (Array.isArray(args[1]) && psql != null && psql.type === 'S') {
129
+ var result_step = new ResultSetStep();
130
+ result_step.start_time = ctx.getElapsedTime();
131
+ result_step.elapsed = 0;
132
+ result_step.fetch = args[1].length;
133
+ result_step.sqlhash = psql.sql;
134
+ result_step.dbc = dbc_hash;
135
+ ctx.profile.push(result_step);
136
+ MeterSql.addFetch(result_step.dbc, result_step.fetch, 0);
137
+ StatSql.addFetch(result_step.dbc, result_step.sqlhash, result_step.fetch, 0);
138
+ }
139
+
140
+ if (args[1] != null && psql != null && psql.type === 'U') {
141
+ sql_step.updated = args[1].affectedRows || 0;
142
+ //StatSql.addUpdate(dbc_hash, psql.sql, sql_step.updated);
143
+ }
144
+ }
145
+
146
+ lastCallback = agent.aop.functionHook(args, -1, queryCallback);
147
+
148
+ if(lastCallback === false && args.length>0 && args[0]._callback){
149
+ agent.aop.both(args[0], '_callback', queryCallback);
150
+ }
151
+ }
152
+ };
153
+
154
+ var toParamBytes = function(p, crc) {
155
+ if(p == null || p.length === 0) {
156
+ return null;
157
+ }
158
+ try{
159
+ return ParamSecurity.encrypt(Buffer.from(p), crc);
160
+ } catch(e) {
161
+ return null;
162
+ }
163
+ };
164
+
165
+ var errorDelegate = function () {
166
+ return function (obj, args) {
167
+ var ctx = TraceContextManager.getCurrentContext();
168
+ if(ctx == null) { return; }
169
+
170
+ var laststep = ctx.profile.getLastSteps(1);
171
+ if(laststep == null || laststep.length === 0) { return; }
172
+
173
+ var step = laststep[0];
174
+ if(!args[0].fatal) {
175
+ MeterSql.add(step.dbc, step.elapsed, true);
176
+ StatSql.addSqlTime(ctx, ctx.service_hash, step.dbc, step.hash, step.elapsed, true, 0);
177
+ }
178
+
179
+ try{
180
+ if(args[0].fatal) {
181
+ // Connection Error
182
+ step.error = StatError.addError( 'Maria-'+args[0].code, args[0].message, ctx.service_hash); /*long*/
183
+ if (ctx.error.isZero()) { ctx.error = step.error; }
184
+ } else {
185
+ if(conf._is_trace_ignore_err_cls_contains === true && args[0].code.indexOf(conf.trace_ignore_err_cls_contains) < 0){
186
+ step.error = StatError.addError( 'Maria-'+args[0].code, args[0].message || 'Maria error', ctx.service_hash, TextTypes.SQL, step.hash); /*long*/
187
+ if (ctx.error.isZero()) { ctx.error = step.error; }
188
+ } else if(conf._is_trace_ignore_err_msg_contains === true && args[0].message.indexOf(conf.trace_ignore_err_msg_contains) < 0){
189
+ step.error = StatError.addError( 'Maria-'+args[0].code, args[0].message || 'Maria error', ctx.service_hash, TextTypes.SQL, step.hash); /*long*/
190
+ if (ctx.error.isZero()) { ctx.error = step.error; }
191
+ } else if(conf._is_trace_ignore_err_cls_contains === false && conf._is_trace_ignore_err_msg_contains === false) {
192
+ step.error = StatError.addError( 'Maria-'+args[0].code, args[0].message || 'Maria error', ctx.service_hash, TextTypes.SQL, step.hash); /*long*/
193
+ if (ctx.error.isZero()) { ctx.error = step.error; }
194
+ }
195
+ }
196
+ } catch(e) {
197
+ }
198
+ }
199
+ };
200
+
201
+ MariaObserver.prototype.inject = function (mod, moduleName) {
202
+ if(mod.__whatap_observe__) { return; }
203
+ mod.__whatap_observe__ = true;
204
+
205
+ Logger.initPrint("MariaObserver");
206
+
207
+ var self = this;
208
+ var aop = self.agent.aop;
209
+
210
+ if( conf.sql_enabled === false ) { return; }
211
+ var dbc_hash=0;
212
+ aop.both(mod, 'createConnection',
213
+ function (obj, args, lctx) {
214
+ var ctx = lctx.context;
215
+ if(ctx == null || ctx.db_opening) { return; }
216
+ ctx.db_opening = true;
217
+ ctx.footprint('Maria Connecting Start');
218
+
219
+ var dbc_step = new DBCStep();
220
+ dbc_step.start_time = ctx.getElapsedTime();
221
+ lctx.step = dbc_step;
222
+ },
223
+ function (obj, args, ret, lctx) {
224
+ if(dbc_hash === 0){
225
+ var dbc;
226
+ if(args.length > 0) {
227
+ var info = (args[0] || {});
228
+ dbc = 'maria://';
229
+ dbc += info.user || '';
230
+ dbc += "@";
231
+ dbc += info.host || '';
232
+ dbc += '/';
233
+ dbc += info.database || '';
234
+ dbc_hash = HashUtil.hashFromString(dbc);
235
+ DataTextAgent.DBC.add(dbc_hash, dbc);
236
+ DataTextAgent.METHOD.add(dbc_hash, dbc);
237
+ DataTextAgent.ERROR.add(dbc_hash, dbc);
238
+ }
239
+ }
240
+
241
+ aop.both(ret, 'query', queryHook(dbc_hash, self.agent), function (obj, args, ret, lctx) {
242
+ var ctx = lctx.context;
243
+ TraceContextManager.resume(ctx);
244
+ });
245
+
246
+ aop.both(ret, 'execute', queryHook(dbc_hash, self.agent), function (obj, args, ret, lctx) {
247
+ var ctx = lctx.context;
248
+ TraceContextManager.resume(ctx);
249
+ });
250
+
251
+ aop.after(ret._protocol, '_delegateError', errorDelegate());
252
+
253
+ var ctx = lctx.context,
254
+ step = lctx.step;
255
+
256
+ if (ctx == null || step == null) { return; }
257
+
258
+ TraceContextManager.resume(ctx);
259
+ ctx.footprint('Maria Connecting Done');
260
+ ctx.db_opening = false;
261
+ step.hash = dbc_hash;
262
+
263
+ aop.both(ret, 'connect', function (obj, args) {
264
+ var ctx = TraceContextManager.getCurrentContext();
265
+ if (ctx == null) { return; }
266
+
267
+ ctx.footprint('Maria Connecting Start');
268
+
269
+ ctx.db_opening=true;
270
+
271
+ aop.functionHook(args, -1, function (obj, args) {
272
+ if (args[0] && step.error.isZero()) {
273
+ step.error = StatError.addError('Maria-'+args[0].code,
274
+ args[0].message, ctx.service_hash);
275
+ step.elapsed = ctx.getElapsedTime() - step.start_time;
276
+ }
277
+ TraceContextManager.resume(ctx._id);
278
+ });
279
+ ctx.profile.push(step);
280
+ }
281
+ ,
282
+ function (obj, args, ret, lctx) {
283
+ if(lctx.context){
284
+ ctx.db_opening=false;
285
+ ctx.footprint('Maria Connecting Done');
286
+ }
287
+ }
288
+ );
289
+ });
290
+
291
+
292
+ var dbc_pool_hash=0;
293
+ aop.after(mod, ['createPool', 'createPoolCluster'], function (obj, args, ret) {
294
+
295
+ var dbc = 'maria://';
296
+ if(dbc_pool_hash==0){
297
+ if(args.length > 0) {
298
+ var info = args[0];
299
+ //Open [DatabaseName] connection 메세지 보여줄때 필요함.
300
+ dbc += info.user || '';
301
+ dbc += "@";
302
+ dbc += info.host || '';
303
+ dbc += '/';
304
+ dbc += info.database || '';
305
+ }
306
+
307
+ dbc_pool_hash = HashUtil.hashFromString(dbc);
308
+ DataTextAgent.DBC.add(dbc_pool_hash, dbc);
309
+ DataTextAgent.METHOD.add(dbc_pool_hash, dbc);
310
+ DataTextAgent.ERROR.add(dbc_pool_hash, dbc);
311
+ }
312
+ aop.both(ret, 'getConnection', function (obj, args, lctx) {
313
+ var ctx = TraceContextManager.getCurrentContext();
314
+ if(ctx == null) {return;}
315
+
316
+ var dbc_step = new DBCStep();
317
+ dbc_step.hash = dbc_pool_hash;
318
+ dbc_step.start_time = ctx.getElapsedTime();
319
+
320
+ aop.functionHook(args, -1, function (obj, args) {
321
+ dbc_step.elapsed = ctx.getElapsedTime() - dbc_step.start_time;
322
+ ctx.profile.push(dbc_step);
323
+
324
+ TraceContextManager.resume(ctx._id);
325
+ DataTextAgent.DBC.add(dbc_hash, dbc);
326
+
327
+ if(args[0] != null) { return; }
328
+ var conn = args[1];
329
+ if(conn.__query_hook__) { return; }
330
+ conn.__query_hook__ = true;
331
+ aop.before(conn, 'query', queryHook(dbc_pool_hash, self.agent));
332
+ aop.before(conn, 'execute', queryHook(dbc_pool_hash, self.agent));
333
+ aop.before(conn._protocol, '_delegateError', errorDelegate(ctx));
334
+ });
335
+ }, function (obj, args, ret, lctx) {
336
+ MeterSql.setConnection(1, 0, dbc);
337
+ });
338
+ });
339
+ };
340
+
341
+ var checkedSql = new IntKeyMap(2000).setMax(2000);
342
+ var nonLiteSql = new IntKeyMap(5000).setMax(5000);
343
+ var date = DateUtil.yyyymmdd();
344
+
345
+ function escapeLiteral(sql) {
346
+ if(sql == null) { sql = ''; }
347
+
348
+ if(date !== DateUtil.yyyymmdd()) {
349
+ checkedSql.clear();
350
+ nonLiteSql.clear();
351
+ date = DateUtil.yyyymmdd();
352
+ Logger.print('WHATAP-SQL-CLEAR', 'MariaObserver CLEAR OK!!!!!!!!!!!!!!!!', false);
353
+ }
354
+
355
+ var sqlHash = HashUtil.hashFromString(sql);
356
+ var psql = nonLiteSql.get(sqlHash);
357
+
358
+ if(psql != null) {
359
+ return psql;
360
+ }
361
+ psql = checkedSql.get(sqlHash);
362
+
363
+ if(psql != null) {
364
+ return psql;
365
+ }
366
+
367
+ var els = new EscapeLiteralSQL(sql);
368
+ els.process();
369
+
370
+ var hash = HashUtil.hashFromString(els.getParsedSql());
371
+ DataTextAgent.SQL.add(hash, els.getParsedSql());
372
+
373
+ if(hash === sqlHash) {
374
+ psql = new ParsedSql(els.sqlType, hash, null);
375
+ nonLiteSql.put(sqlHash, psql);
376
+ } else {
377
+ psql = new ParsedSql(els.sqlType, hash, els.getParameter());
378
+ checkedSql.put(sqlHash, psql);
379
+ }
380
+ return psql;
381
+ }
382
+
383
383
  exports.MariaObserver = MariaObserver;