apminsight 1.0.1 → 1.8.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.
- data/VERSION +1 -1
- data/apm-agent.gemspec +64 -0
- data/conf/apminsight.conf +15 -24
- data/lib/agent/am_objectholder.rb +25 -19
- data/lib/agent/api/custom_tracker.rb +79 -0
- data/lib/agent/configuration/am_configuration.rb +249 -37
- data/lib/agent/handler/custom_api_handler.rb +40 -0
- data/lib/agent/handler/sequence_book.rb +118 -0
- data/lib/agent/handler/tracker_handler.rb +58 -0
- data/lib/agent/logging/am_logger.rb +13 -9
- data/lib/agent/metrics/am_metricsformatter.rb +117 -59
- data/lib/agent/metrics/am_metricsparser.rb +195 -468
- data/lib/agent/metrics/am_metricstore.rb +7 -6
- data/lib/agent/metrics/exception_record.rb +24 -0
- data/lib/agent/server/am_agent.rb +42 -17
- data/lib/agent/server/am_connector.rb +65 -21
- data/lib/agent/server/instrument/action_view.rb +64 -0
- data/lib/agent/server/instrument/active_record.rb +52 -0
- data/lib/agent/server/instrument/am_apm.rb +107 -97
- data/lib/agent/server/instrument/am_instrumenter.rb +54 -42
- data/lib/agent/server/instrument/environment.rb +42 -0
- data/lib/agent/server/instrument/rails.rb +56 -0
- data/lib/agent/server/instrument/sinatra.rb +97 -0
- data/lib/agent/server/worker/am_worker.rb +93 -49
- data/lib/agent/trackers/database_tracker.rb +107 -0
- data/lib/agent/trackers/default_tracker.rb +57 -0
- data/lib/agent/trackers/root_tracker.rb +43 -0
- data/lib/agent/util/am_constants.rb +46 -3
- data/lib/agent/util/am_util.rb +64 -1
- data/lib/agent/util/transaction_util.rb +35 -0
- data/lib/agent/version.rb +13 -0
- data/lib/apminsight.rb +4 -1
- metadata +114 -76
@@ -2,114 +2,72 @@ require 'agent/am_objectholder'
|
|
2
2
|
|
3
3
|
module ManageEngine
|
4
4
|
class APMMetricsParser
|
5
|
-
|
5
|
+
|
6
|
+
def initialize
|
6
7
|
@obj = ManageEngine::APMObjectHolder.instance
|
7
8
|
end
|
9
|
+
|
10
|
+
# Invoked by APMWorker in dc
|
8
11
|
def parse(data)
|
9
12
|
@obj = ManageEngine::APMObjectHolder.instance
|
10
13
|
parseddata = Hash.new
|
11
14
|
begin
|
12
|
-
data.each do |
|
13
|
-
@obj.log.debug "[Processing started for - #{
|
14
|
-
#lastHash = val.last
|
15
|
-
#name = lastHash["name"]
|
16
|
-
keyForTrans = key
|
17
|
-
# if(name=="process_action.action_controller")
|
18
|
-
#Transaction completed
|
19
|
-
tdata = Hash.new
|
20
|
-
trdbdata = Array.new
|
21
|
-
trdata = Array.new
|
22
|
-
started = false
|
23
|
-
redirect=false
|
24
|
-
ended =false;
|
25
|
-
start_index = 0;
|
26
|
-
val.each do |arr|
|
27
|
-
#@obj.log.debug "Processing : #{arr["name"]}"
|
28
|
-
if(started || arr["name"]==("start_processing.action_controller") )
|
29
|
-
|
30
|
-
if(arr["name"]=="sql.active_record" && @obj.config.sql_capture)
|
31
|
-
dbd = getDBData(arr)
|
32
|
-
if tdata.has_key?("db")
|
33
|
-
tdata["db"].push(dbd)
|
34
|
-
else
|
35
|
-
temp = Array.new
|
36
|
-
temp.push(dbd)
|
37
|
-
tdata["db"]=temp
|
38
|
-
end
|
39
|
-
#trdbdata.push(updateDBTrace(arr,dbd))
|
40
|
-
#@obj.log.debug "TRANS DBBB TRACE : #{dbd}"
|
41
|
-
elsif (arr["name"]=="process_action.action_controller")
|
42
|
-
|
43
|
-
tdata["td"]=getTransData(arr,tdata)
|
44
|
-
#if redirect
|
45
|
-
# started = false
|
46
|
-
# redirect=false
|
47
|
-
# ended =false;
|
48
|
-
#else
|
49
|
-
ended = true
|
50
|
-
started = false
|
51
|
-
redirect=false
|
52
|
-
parseddata = updateParsedData key,tdata.dup,parseddata
|
53
|
-
#@obj.log.info "TRACE #{@obj.config.trans_trace}"
|
54
|
-
if @obj.config.trans_trace
|
55
|
-
ret = tdata["td"]
|
56
|
-
#@obj.log.info "TRACE COMPARE : #{ret["rt"]} > #{(@obj.config.trans_trace_t.to_f*1000).to_i}"
|
57
|
-
if (ret["rt"]).to_i > (@obj.config.trans_trace_t.to_f* 1000).to_i
|
58
|
-
tval = val[(start_index)..val.index(arr)]
|
59
|
-
#@obj.log.debug "Gng To Trace : #{start_index} to #{val.index(arr)}"
|
60
|
-
parseddata =updateTraceData tval,parseddata
|
61
|
-
end
|
62
|
-
end
|
63
|
-
key = key + start_index.to_s
|
64
|
-
tdata=Hash.new
|
65
|
-
start_index = val.index(arr)
|
66
|
-
#end
|
67
|
-
#trdata = updateTransTrace(arr,trdbdata,trdata);
|
68
|
-
#@obj.log.info "TRANS TRACE : #{trdata}"
|
69
|
-
#elsif(arr["name"]==("!render_template.action_view")
|
70
|
-
#Render Action
|
71
|
-
#elsif(arr["name"]==("render_template.action_view")
|
72
|
-
#Render Action data not in use
|
73
|
-
elsif(arr["name"]==("start_processing.action_controller"))
|
74
|
-
ended =false;
|
75
|
-
started=true
|
76
|
-
#trdata = updateStartTrace(arr,trdata);
|
77
|
-
#Render Action data not in use
|
78
|
-
elsif(arr["name"]==("redirect_to.action_controller"))
|
79
|
-
redirect = true;
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
end
|
15
|
+
data.each do |txn_name, seqBag|
|
16
|
+
@obj.log.debug "[Processing started for - #{txn_name} ]"
|
84
17
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
18
|
+
seqBag.each do |seqData|
|
19
|
+
begin
|
20
|
+
tdata = Hash.new #transaction data -> rt, path,..
|
21
|
+
exceptionInfo = Array.new # data to be sent in trace as 'loginfo'
|
22
|
+
|
23
|
+
rootTracker = seqData["roottracker"]
|
24
|
+
|
25
|
+
tdata["td"] = getTransData(rootTracker,tdata)
|
26
|
+
tdata["db"] = getDBData(rootTracker, tdata, exceptionInfo)
|
27
|
+
|
28
|
+
exceptionBag = seqData["exceptions"]
|
29
|
+
if exceptionBag != nil
|
30
|
+
exceptionBag.each do |exceptionRecord|
|
31
|
+
updateExceptionMetric(exceptionRecord.exception,tdata)
|
32
|
+
updateExceptionInfo(exceptionInfo, exceptionRecord.time, exceptionRecord.exception, exceptionRecord.message)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
parseddata = updateParsedData(txn_name, tdata.dup, parseddata)
|
37
|
+
|
38
|
+
if @obj.config.trans_trace && (rootTracker.duration >= (@obj.config.trans_trace_t.to_f*1000).to_i || rootTracker.error?)
|
39
|
+
parseddata = updateTraceData(rootTracker, parseddata, exceptionInfo)
|
40
|
+
end
|
41
|
+
rescue Exception=>e
|
42
|
+
@obj.log.logException "Exception in Parsing txn #{txn_name}",e
|
43
|
+
end
|
44
|
+
end # do - seqBag
|
45
|
+
|
46
|
+
@obj.store.removeData txn_name
|
47
|
+
@obj.log.debug "[Processing END for - #{txn_name} ]"
|
48
|
+
end # do-loop
|
101
49
|
rescue Exception=>e
|
102
50
|
@obj.log.info "Exception : #{e}"
|
103
51
|
@obj.log.logException "#{e.message}",e
|
104
52
|
end
|
105
53
|
# @obj.log.debug "[PARSER] End"
|
54
|
+
|
106
55
|
parseddata
|
107
56
|
end
|
108
57
|
|
109
|
-
def
|
58
|
+
def updateExceptionInfo (exceptionInfo, time, error, message = nil)
|
59
|
+
logInfo = { @obj.constants.mf_loginfo_time => time,
|
60
|
+
@obj.constants.mf_loginfo_level => @obj.constants.mf_loginfo_level_warn,
|
61
|
+
@obj.constants.mf_loginfo_str => message != nil ? message : error.message,
|
62
|
+
@obj.constants.mf_loginfo_err_clz => error.class.to_s,
|
63
|
+
@obj.constants.mf_loginfo_st => @obj.util.formatStacktrace(error.backtrace) }
|
64
|
+
exceptionInfo.push(logInfo)
|
65
|
+
end
|
66
|
+
|
67
|
+
def updateParsedData (key, tdata, parseddata)
|
110
68
|
begin
|
111
69
|
if parseddata.has_key?(key)
|
112
|
-
key =
|
70
|
+
key = rand # Use a random number
|
113
71
|
end
|
114
72
|
#@obj.log.debug "Update parsed data : #{key} = > #{tdata}"
|
115
73
|
parseddata[key]=tdata
|
@@ -119,410 +77,180 @@ module ManageEngine
|
|
119
77
|
end
|
120
78
|
parseddata
|
121
79
|
end
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
@obj.log.logException "#{e.message}",e
|
80
|
+
|
81
|
+
# Generates Trace for the transaction and updates it in 'parseddata' hash
|
82
|
+
def updateTraceData(rootTracker, parseddata, exceptionInfo)
|
83
|
+
if(parseddata.has_key?("trace-data"))
|
84
|
+
tData = parseddata["trace-data"];
|
85
|
+
if(tData.length == @obj.config.trace_overflow_t)
|
86
|
+
trac = getDummyTrace
|
87
|
+
tData.push(trac)
|
88
|
+
parseddata["trace-data"]=tData
|
89
|
+
@obj.log.debug "dummy trace added"
|
90
|
+
return parseddata
|
91
|
+
elsif tData.length > @obj.config.trace_overflow_t
|
92
|
+
@obj.log.debug "trace threshold exceeded. Current Size: #{@obj.config.trace_overflow_t}"
|
93
|
+
return parseddata
|
94
|
+
end
|
138
95
|
end
|
139
|
-
parseddata
|
140
|
-
end
|
141
|
-
|
142
|
-
def getTransData(d,tdata)
|
143
|
-
pl = d["payload"]
|
144
|
-
ret = nil;
|
145
96
|
begin
|
146
|
-
|
147
|
-
|
148
|
-
|
97
|
+
trdata = getTrace(rootTracker)
|
98
|
+
trac = updateTrace(rootTracker.url, trdata, exceptionInfo)
|
99
|
+
if(parseddata.has_key?("trace-data"))
|
100
|
+
traceData = parseddata["trace-data"];
|
101
|
+
traceData.push(trac);
|
102
|
+
parseddata["trace-data"] = traceData;
|
149
103
|
else
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
controller=pl[:controller]
|
154
|
-
#controller=pl["controller"]
|
155
|
-
action = pl[:action]
|
156
|
-
#action = pl["action"]
|
157
|
-
ret ={"rt"=>rt,"path"=>path,"name"=>controller+"#"+action}
|
104
|
+
traceData = Array.new
|
105
|
+
traceData.push(trac)
|
106
|
+
parseddata["trace-data"] = traceData;
|
158
107
|
end
|
159
108
|
rescue Exception=>e
|
160
|
-
@obj.log.info "Exception in
|
161
|
-
@obj.log.logException "#{e.message}",e
|
162
|
-
end
|
163
|
-
ret
|
164
|
-
end
|
165
|
-
|
166
|
-
|
167
|
-
def getDBData(d)
|
168
|
-
pl = d["payload"]
|
169
|
-
rt = (d["end"] - d["start"])
|
170
|
-
sql = pl[:sql]
|
171
|
-
#sql = pl["sql"]
|
172
|
-
sql.strip!
|
173
|
-
sql.downcase!
|
174
|
-
sqlArr = sql.split(" ")
|
175
|
-
sqlStrip="";
|
176
|
-
tr_name="";
|
177
|
-
begin
|
178
|
-
sqlStrip = getSqlStrip sqlArr,false
|
179
|
-
rescue Exception=>e
|
180
|
-
@obj.log.logException "#{e.message}",e
|
181
|
-
sqlStrip = sqlArr[0]+"/-/dummydb"
|
182
|
-
end
|
183
|
-
|
184
|
-
name=pl[:name]
|
185
|
-
#name=pl["name"]
|
186
|
-
ret ={"rt"=>rt,"sql"=>format(sql),"sql-strip"=>sqlStrip,"name"=>name,"operation"=>sqlArr[0]}
|
187
|
-
ret
|
188
|
-
end
|
189
|
-
|
190
|
-
def getSqlStrip sqlArr ,trace
|
191
|
-
sqlStrip =""
|
192
|
-
begin
|
193
|
-
sqlStrip = case sqlArr[0]
|
194
|
-
when "select" then sqlArr[sqlArr.index("from")+1]
|
195
|
-
when "insert" then sqlArr[sqlArr.index("into")+1]
|
196
|
-
when "update" then sqlArr[1]
|
197
|
-
when "delete" then sqlArr[sqlArr.index("from")+1]
|
198
|
-
when "create" then sqlArr[1] + sqlArr[2]
|
199
|
-
when "alter" then sqlArr[1] + sqlArr[2]
|
200
|
-
when "drop" then sqlArr[1] + sqlArr[2]
|
201
|
-
when "show" then sqlArr[1]
|
202
|
-
when "describe" then sqlArr[1]
|
203
|
-
else "-"
|
204
|
-
end
|
205
|
-
|
206
|
-
if trace
|
207
|
-
sqlStrip = format(sqlArr[0]) +" - " + format(sqlStrip)
|
208
|
-
else
|
209
|
-
sqlStrip = format(sqlArr[0]) +"/" + format(sqlStrip) +"/dummydb"
|
210
|
-
end
|
211
|
-
|
212
|
-
rescue Exception=>e
|
109
|
+
@obj.log.info "Exception in updateTraceData: #{e}"
|
213
110
|
@obj.log.logException "#{e.message}",e
|
214
|
-
if trace
|
215
|
-
sqlStrip = format(sqlArr[0])
|
216
|
-
else
|
217
|
-
sqlStrip = sqlArr[0]+"/-/dummydb"
|
218
|
-
end
|
219
111
|
end
|
112
|
+
parseddata
|
220
113
|
end
|
221
114
|
|
222
|
-
def
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
#sql = pl["sql"]
|
227
|
-
sql.strip!
|
228
|
-
sql.downcase!
|
229
|
-
sql = format(sql)
|
230
|
-
sqlArr = sql.split(" ")
|
231
|
-
|
115
|
+
def getDummyTrace
|
116
|
+
top = Array.new
|
117
|
+
path = @obj.constants.mf_overflow
|
118
|
+
det = {"thread_name"=>"rorthread","s_time"=>0,"t_name"=>path,"r_time"=>0,"thread_id"=>141}
|
232
119
|
trData = Array.new
|
233
|
-
|
234
|
-
trData[
|
235
|
-
trData[
|
236
|
-
trData[
|
237
|
-
trData[
|
238
|
-
trData[
|
239
|
-
trData[5] = {"query"=>sql}
|
120
|
+
trData[0] = 0
|
121
|
+
trData[1] = path
|
122
|
+
trData[2] = ""
|
123
|
+
trData[3] = 0
|
124
|
+
trData[4] = 0
|
125
|
+
trData[5] = nil
|
240
126
|
trData[6] = Array.new
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
else
|
245
|
-
sql = @obj.util.parametrizeQuery sql
|
246
|
-
trData[5] = {"query"=>sql}
|
247
|
-
end
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
trData
|
127
|
+
top[0] = det
|
128
|
+
top[1] = trData
|
129
|
+
return top
|
252
130
|
end
|
253
131
|
|
254
|
-
def
|
255
|
-
ret =
|
256
|
-
begin
|
257
|
-
args = "";
|
258
|
-
if binds!=nil && binds.size()>0
|
259
|
-
binds.each do |ar|
|
260
|
-
#args = args + ar.last + ","
|
261
|
-
if sql!=nil && sql.index("?")!=nil
|
262
|
-
sql["?"]=ar.last
|
263
|
-
end
|
264
|
-
end
|
265
|
-
end
|
266
|
-
if args.length>0
|
267
|
-
sql = sql + "\\nPARAMS - ["+args+ "]"
|
268
|
-
end
|
269
|
-
ret = {"query"=>sql}
|
270
|
-
rescue Exception=>exe
|
271
|
-
@obj.log.logException "Not severe -#{exe.message}",exe
|
272
|
-
ret = {"query"=>sql}
|
273
|
-
end
|
274
|
-
|
275
|
-
begin
|
276
|
-
if(rt.to_i > (@obj.config.sql_trace_t.to_f * "1000".to_f ).to_i && d.has_key?("trace") )
|
277
|
-
t = updateSQLStackTrace(d["trace"])
|
278
|
-
ret["stacktrace"] =t
|
279
|
-
end
|
280
|
-
rescue Exception=>e
|
281
|
-
@obj.log.logException "#{e.message}",e
|
282
|
-
end
|
283
|
-
|
284
|
-
ret
|
285
|
-
end
|
286
|
-
|
287
|
-
def updateSQLStackTrace(d)
|
288
|
-
trace = Array.new;
|
289
|
-
started = false;
|
290
|
-
ended = false;
|
132
|
+
def getTransData(rootTracker, tdata)
|
133
|
+
ret = nil;
|
291
134
|
begin
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
end
|
302
|
-
#trArr = arr.split(/:[0-1,in]/);
|
303
|
-
#if trArr[0].length>30
|
304
|
-
# len = trArr.length
|
305
|
-
# trArr[0] = "..."+trArr[(len-30),len]
|
306
|
-
# end
|
307
|
-
inx=arr.index("`instrument'")
|
308
|
-
if inx!=nil && inx>0
|
309
|
-
#skip instrumet data
|
310
|
-
else
|
311
|
-
temp = Array.new
|
312
|
-
temp[0]=arr
|
313
|
-
temp[1]=""
|
314
|
-
temp[2]=""
|
315
|
-
temp[3]=""
|
316
|
-
trace.push(temp)
|
317
|
-
end
|
318
|
-
end
|
319
|
-
|
320
|
-
if started==false
|
321
|
-
ind = arr.index("`instrument'")
|
322
|
-
if ind != nil && ind >0
|
323
|
-
started = true
|
324
|
-
end
|
325
|
-
end
|
326
|
-
|
327
|
-
|
328
|
-
end
|
329
|
-
#@obj.log.debug "STACKTRACE ENDS"
|
330
|
-
|
331
|
-
trace.shift
|
135
|
+
if(tdata.has_key?("td"))
|
136
|
+
ret = tdata["td"]
|
137
|
+
ret["rt"] = ret["rt"] + rootTracker.duration
|
138
|
+
else
|
139
|
+
ret = {"rt"=> rootTracker.duration, "path"=>rootTracker.url}
|
140
|
+
if (rootTracker.error?)
|
141
|
+
ret["error"] = true
|
142
|
+
end
|
143
|
+
end
|
332
144
|
rescue Exception=>e
|
333
|
-
|
145
|
+
#@obj.log.logException "Exception in getTranseData: #{e.message}",e
|
146
|
+
raise e
|
334
147
|
end
|
335
|
-
|
336
|
-
end
|
337
|
-
|
338
|
-
def updateOtherTrace d
|
339
|
-
pl = d["payload"]
|
340
|
-
rt = (d["end"] - d["start"])
|
341
|
-
name = d["name"]
|
342
|
-
if pl.has_key?(:identifier)
|
343
|
-
#if pl.has_key?("identifier")
|
344
|
-
name = pl[:identifier]
|
345
|
-
#name = pl["identifier"]
|
346
|
-
end
|
347
|
-
trData = Array.new
|
348
|
-
#trData[0] = (d["start"].to_f * 1000 ).to_i
|
349
|
-
trData[0] = d["ctime"]
|
350
|
-
trData[1] = name
|
351
|
-
trData[2] = ""
|
352
|
-
trData[3] = rt.to_i
|
353
|
-
trData[4] = rt.to_i
|
354
|
-
trData[5] = nil
|
355
|
-
trData[6] = Array.new
|
356
|
-
trData
|
357
|
-
end
|
358
|
-
|
359
|
-
def updateTransTrace(d,trData)
|
360
|
-
|
361
|
-
#trData = Array.new
|
362
|
-
#trData[0] = ((d["start"]).to_f * 1000).to_i
|
363
|
-
pl = d["payload"]
|
364
|
-
trData[1] = pl[:path] + " " +pl[:controller] + "#" + pl[:action]
|
365
|
-
#trData[1] = pl["path"] + " " +pl["controller"] + "#" + pl["action"]
|
366
|
-
trData[2] = ""
|
367
|
-
trData[3] = (d["end"] - trData[0]).to_i
|
368
|
-
trData[4] = (d["end"] - trData[0]).to_i
|
369
|
-
trData[5] = nil
|
370
|
-
#trData[6] = Array.new
|
371
|
-
#dbTime = 0
|
372
|
-
#trdbdata.each do |dbData|
|
373
|
-
# dbTime = dbTime + dbData[3]
|
374
|
-
#end
|
375
|
-
#trData[4] = ((trData[3]).to_f - (dbTime.to_f )).to_i
|
376
|
-
# if(pl[:db_runtime]!=nil)
|
377
|
-
# trData[4] = ((trData[3]).to_f - (pl[:db_runtime].to_f )).to_i
|
378
|
-
# end
|
379
|
-
trData
|
148
|
+
ret
|
380
149
|
end
|
381
150
|
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
151
|
+
# Generates DB metric
|
152
|
+
def getDBData(tracker, tdata, exceptionInfo)
|
153
|
+
while (tracker != nil)
|
154
|
+
tdata["db"] = getDBData(tracker.child, tdata, exceptionInfo)
|
155
|
+
|
156
|
+
if tracker.kind_of?(ManageEngine::Tracker::DatabaseTracker)
|
157
|
+
if tdata["db"] == nil
|
158
|
+
tdata["db"] = Array.new
|
159
|
+
end
|
160
|
+
|
161
|
+
queryInfo = tracker.getQueryInfo
|
162
|
+
sqlStrip = queryInfo[0] + "/" + queryInfo[1] + "/dummydb"
|
163
|
+
|
164
|
+
ret ={"rt"=>tracker.duration, "sql"=>tracker.getRawQuery,
|
165
|
+
"sql-strip"=>sqlStrip, "name"=>tracker.name, "operation"=>queryInfo[0]}
|
166
|
+
|
167
|
+
if (tracker.error?)
|
168
|
+
ret["error"] = true
|
169
|
+
end
|
170
|
+
|
171
|
+
tdata["db"].push(ret)
|
172
|
+
end ## DBTracker check
|
173
|
+
|
174
|
+
if (tracker.error?)
|
175
|
+
updateExceptionMetric(tracker.error, tdata) # <= previously it was 'ret'
|
176
|
+
updateExceptionInfo(exceptionInfo, tracker.endtime.to_i, tracker.error)
|
177
|
+
end
|
178
|
+
|
179
|
+
tracker = tracker.sibling
|
180
|
+
end ## while loop
|
181
|
+
|
182
|
+
tdata["db"]
|
403
183
|
end
|
404
184
|
|
405
|
-
def
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
trData[6] =Array.new
|
415
|
-
|
416
|
-
trData
|
185
|
+
def updateExceptionMetric (exception, tdata)
|
186
|
+
excData = tdata["exception"]
|
187
|
+
if (excData == nil)
|
188
|
+
excData = Hash.new
|
189
|
+
tdata["exception"] = excData
|
190
|
+
end
|
191
|
+
|
192
|
+
excData[exception.class.to_s] = excData[exception.class.to_s].to_i + 1
|
193
|
+
excData[@obj.constants.mf_logmetric_warning] = excData[@obj.constants.mf_logmetric_warning].to_i + 1
|
417
194
|
end
|
418
|
-
|
419
|
-
def updateTrace(trans)
|
195
|
+
|
196
|
+
def updateTrace(url, trans, exceptionInfo)
|
420
197
|
# {"thread_name":"http-8080-6","s_time":1326276180289,"t_name":"transaction\/http\/Test-App\/login","r_time":18,"thread_id":141}
|
421
198
|
top = Array.new
|
422
|
-
path = @obj.constants.mf_transaction + @obj.constants.mf_separator +
|
199
|
+
path = @obj.constants.mf_transaction + @obj.constants.mf_separator + url
|
423
200
|
det = {"thread_name"=>"rorthread","s_time"=>trans[0],"t_name"=>path,"r_time"=>trans[3],"thread_id"=>141}
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
201
|
+
|
202
|
+
exception = trans[5] != nil ? trans[5][@obj.constants.mf_exception_st] : nil
|
203
|
+
if (exception != nil)
|
204
|
+
det[@obj.constants.mf_err_st] = exception
|
205
|
+
end
|
206
|
+
|
207
|
+
if (exceptionInfo.length > 0)
|
208
|
+
det[@obj.constants.mf_loginfo] = exceptionInfo
|
209
|
+
end
|
210
|
+
|
211
|
+
top[0] = det
|
212
|
+
top[1] = trans
|
213
|
+
top
|
434
214
|
end
|
435
|
-
|
436
215
|
|
437
|
-
def getTrace
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
index = data.index(arr)
|
443
|
-
break;
|
444
|
-
end
|
445
|
-
end
|
446
|
-
data = data.drop(index)
|
447
|
-
tdata =traceDetails data,Array.new,0
|
448
|
-
tdata = updateExclusiveTrace(tdata[0])
|
449
|
-
tdata
|
216
|
+
def getTrace(rootTracker)
|
217
|
+
trace = Array.new
|
218
|
+
traceDetails(rootTracker, trace)
|
219
|
+
|
220
|
+
return trace[0]
|
450
221
|
end
|
451
222
|
|
452
|
-
def traceDetails
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
c.push(temp)
|
484
|
-
cur[6] = c
|
485
|
-
stack.push(temp)
|
486
|
-
traceDetails valo,stack,indx
|
487
|
-
elsif(arr["name"]=="apm.methodend")
|
488
|
-
updateMethodTrace(arr,stack[stack.size()-1])
|
489
|
-
stack.delete(stack[stack.size()-1])
|
490
|
-
traceDetails valo,stack,indx
|
491
|
-
elsif(arr["name"]=="process_action.action_controller")
|
492
|
-
updateTransTrace(arr,stack[stack.size()-1])
|
493
|
-
if(valo.size()>(indx+1))
|
494
|
-
#Redirection Data
|
495
|
-
arr = valo[indx]
|
496
|
-
while (arr["name"]!="start_processing.action_controller") do
|
497
|
-
indx = indx + 1
|
498
|
-
arr = valo[indx]
|
499
|
-
end
|
500
|
-
end
|
501
|
-
(stack[0])[3] = (arr["end"] - ((stack[0])[0])).to_i
|
502
|
-
(stack[0])[4] = (arr["end"] - ((stack[0])[0])).to_i
|
503
|
-
|
504
|
-
|
505
|
-
traceDetails valo,stack,indx
|
506
|
-
#parent[4] = parent[4] - traceArr[4]
|
507
|
-
elsif (arr["name"]=="render_template.action_view")
|
508
|
-
temp = updateOtherTrace arr
|
509
|
-
|
510
|
-
cur = stack[stack.size()-1]
|
511
|
-
c = cur[6]
|
512
|
-
c.push(temp)
|
513
|
-
cur[6] = c
|
514
|
-
#traceArr[6] = c
|
515
|
-
#parent[4] = parent[4] - temp[4]
|
516
|
-
traceDetails valo,stack,indx
|
517
|
-
else
|
518
|
-
traceDetails valo,stack,indx
|
519
|
-
|
520
|
-
end
|
521
|
-
|
522
|
-
stack
|
523
|
-
else
|
524
|
-
#Nothing todo
|
525
|
-
end
|
223
|
+
def traceDetails tracker, traceArr
|
224
|
+
|
225
|
+
siblingDuration = 0
|
226
|
+
|
227
|
+
while tracker != nil
|
228
|
+
|
229
|
+
childTrace = Array.new
|
230
|
+
childDuration = traceDetails tracker.child, childTrace
|
231
|
+
|
232
|
+
traceItem = Array.new
|
233
|
+
traceItem[0] = tracker.starttime
|
234
|
+
if tracker.kind_of?(ManageEngine::Tracker::DatabaseTracker)
|
235
|
+
queryInfo = tracker.getQueryInfo
|
236
|
+
traceItem[1] = queryInfo[0] + " - " + queryInfo[1]
|
237
|
+
else
|
238
|
+
traceItem[1] = tracker.name
|
239
|
+
end
|
240
|
+
traceItem[2] = ""
|
241
|
+
traceItem[3] = tracker.duration
|
242
|
+
traceItem[4] = tracker.duration - childDuration
|
243
|
+
traceItem[5] = tracker.getAdditionalInfo
|
244
|
+
traceItem[6] = childTrace.empty? ? nil : childTrace
|
245
|
+
|
246
|
+
traceArr.push(traceItem)
|
247
|
+
|
248
|
+
siblingDuration += tracker.duration
|
249
|
+
|
250
|
+
tracker = tracker.sibling
|
251
|
+
end
|
252
|
+
|
253
|
+
return siblingDuration
|
526
254
|
end
|
527
255
|
|
528
256
|
|
@@ -537,4 +265,3 @@ module ManageEngine
|
|
537
265
|
|
538
266
|
end
|
539
267
|
end
|
540
|
-
|