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.
Files changed (33) hide show
  1. data/VERSION +1 -1
  2. data/apm-agent.gemspec +64 -0
  3. data/conf/apminsight.conf +15 -24
  4. data/lib/agent/am_objectholder.rb +25 -19
  5. data/lib/agent/api/custom_tracker.rb +79 -0
  6. data/lib/agent/configuration/am_configuration.rb +249 -37
  7. data/lib/agent/handler/custom_api_handler.rb +40 -0
  8. data/lib/agent/handler/sequence_book.rb +118 -0
  9. data/lib/agent/handler/tracker_handler.rb +58 -0
  10. data/lib/agent/logging/am_logger.rb +13 -9
  11. data/lib/agent/metrics/am_metricsformatter.rb +117 -59
  12. data/lib/agent/metrics/am_metricsparser.rb +195 -468
  13. data/lib/agent/metrics/am_metricstore.rb +7 -6
  14. data/lib/agent/metrics/exception_record.rb +24 -0
  15. data/lib/agent/server/am_agent.rb +42 -17
  16. data/lib/agent/server/am_connector.rb +65 -21
  17. data/lib/agent/server/instrument/action_view.rb +64 -0
  18. data/lib/agent/server/instrument/active_record.rb +52 -0
  19. data/lib/agent/server/instrument/am_apm.rb +107 -97
  20. data/lib/agent/server/instrument/am_instrumenter.rb +54 -42
  21. data/lib/agent/server/instrument/environment.rb +42 -0
  22. data/lib/agent/server/instrument/rails.rb +56 -0
  23. data/lib/agent/server/instrument/sinatra.rb +97 -0
  24. data/lib/agent/server/worker/am_worker.rb +93 -49
  25. data/lib/agent/trackers/database_tracker.rb +107 -0
  26. data/lib/agent/trackers/default_tracker.rb +57 -0
  27. data/lib/agent/trackers/root_tracker.rb +43 -0
  28. data/lib/agent/util/am_constants.rb +46 -3
  29. data/lib/agent/util/am_util.rb +64 -1
  30. data/lib/agent/util/transaction_util.rb +35 -0
  31. data/lib/agent/version.rb +13 -0
  32. data/lib/apminsight.rb +4 -1
  33. metadata +114 -76
@@ -2,114 +2,72 @@ require 'agent/am_objectholder'
2
2
 
3
3
  module ManageEngine
4
4
  class APMMetricsParser
5
- def initialize
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 |key,val|
13
- @obj.log.debug "[Processing started for - #{key} ]"
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
- if !ended
86
- @obj.log.debug "Transactions in Thread Continues - so drop data in mem-store #{keyForTrans} -- #{start_index}"
87
- if parseddata.has_key?(keyForTrans)
88
- #@obj.log.info "BEFORE : #{parseddata.keys}"
89
- value = parseddata.delete(keyForTrans)
90
- parseddata[key+"_dup"] = value
91
-
92
- #@obj.log.info "AFTER : #{parseddata.keys}"
93
- end
94
- end
95
- #@obj.log.info "BEFORE METRICS - #{@obj.store.metrics}"
96
- @obj.store.removeData key,0,start_index
97
- #@obj.log.info "AFTER METRICS - #{@obj.store.metrics}"
98
- @obj.log.debug "[Processing END for - #{key} ]"
99
- #end
100
- end
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 updateParsedData key , tdata, parseddata
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 = @obj.util.currenttimemillis
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
- def updateTraceData val,parseddata
123
- begin
124
- trdata = getTrace val
125
- trac = updateTrace(trdata)
126
- if(parseddata.has_key?("trace-data"))
127
- traceData = parseddata["trace-data"];
128
- traceData.push(trac);
129
- parseddata["trace-data"] = traceData;
130
- else
131
- traceData = Array.new
132
- traceData.push(trac)
133
- parseddata["trace-data"] = traceData;
134
- end
135
- rescue Exception=>e
136
- @obj.log.info "Exception in updateTraceData: #{e}"
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
- if(tdata.has_key?("td"))
147
- ret = tdata["td"]
148
- ret["rt"] = ret["rt"] + (d["end"] - d["start"]).to_i
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
- rt = (d["end"] - d["start"]).to_i
151
- path=pl[:path]
152
- #path=pl["path"]
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 getTranseData: #{e}"
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 updateDBTrace(d)
223
- pl = d["payload"]
224
- rt = (d["end"] - d["start"])
225
- sql = pl[:sql]
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
- #trData[0] = (d["start"].to_f * 1000 ).to_i
234
- trData[0] = d["ctime"]
235
- trData[1] = getSqlStrip sqlArr,true
236
- trData[2] = ""
237
- trData[3] = rt.to_i
238
- trData[4] = rt.to_i
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
- if(!@obj.config.sql_capture_params)
242
- trData[5] = updateQueryParams(d,sql,pl[:binds],rt)
243
- #trData[5] = updateQueryParams(d,sql,pl["binds"],rt)
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 updateQueryParams d,sql,binds,rt
255
- ret = {"query"=>sql}
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
- #@obj.log.debug "STACKTRACE STARTS"
293
- d.each do |arr|
294
-
295
- if started
296
-
297
- end_ind = arr.index("`send_action'")
298
- if end_ind != nil && end_ind >0
299
- ended = true
300
- break;
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
- @obj.log.logException "#{e.message}",e
145
+ #@obj.log.logException "Exception in getTranseData: #{e.message}",e
146
+ raise e
334
147
  end
335
- trace
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
- def updateMethodTrace(d,trData)
383
-
384
- #trData = Array.new
385
- #trData[0] = ((d["start"]).to_f * 1000).to_i
386
- pl = d["payload"]
387
- trData[1] = pl[:method]
388
- #trData[1] = pl["method"]
389
- trData[2] = ""
390
- trData[3] = (d["end"] - trData[0]).to_i
391
- trData[4] = (d["end"] - trData[0]).to_i
392
- trData[5] = nil
393
- #trData[6] = Array.new
394
- #dbTime = 0
395
- #trdbdata.each do |dbData|
396
- # dbTime = dbTime + dbData[3]
397
- #end
398
- #trData[4] = ((trData[3]).to_f - (dbTime.to_f )).to_i
399
- # if(pl[:db_runtime]!=nil)
400
- # trData[4] = ((trData[3]).to_f - (pl[:db_runtime].to_f )).to_i
401
- # end
402
- trData
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 updateStartTrace(d)
406
- trData = Array.new
407
- #trData[0] = ((d["start"]).to_f * 1000).to_i
408
- trData[0] = d["ctime"]
409
- trData[1] =""
410
- trData[2] =""
411
- trData[3] =0
412
- trData[4] =0
413
- trData[5] =nil
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 + trans[1]
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
- #trans[6] = db;
425
- top[0] = det
426
- top[1] = trans
427
- top
428
- end
429
-
430
- def format s
431
- s.gsub!("\"", '')
432
- s.gsub!("\n", '')
433
- s
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 data
438
- index = 0
439
- data.each do |arr|
440
-
441
- if(arr["name"]=="start_processing.action_controller")
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 valo,stack,indx
453
- if(valo.size>indx)
454
- arr = valo[indx]
455
- indx = indx+1
456
- if(arr["name"]=="start_processing.action_controller")
457
- traceArr = updateStartTrace arr
458
- traceArr[6] = Array.new #childs
459
- if stack.size()>0
460
- cur = stack[stack.size()-1]
461
- c = cur[6]
462
- c.push(traceArr)
463
- cur[6] = c
464
- end
465
- stack.push(traceArr)
466
-
467
-
468
- traceDetails valo,stack,indx
469
-
470
- elsif(arr["name"]=="sql.active_record" && @obj.config.sql_capture )
471
-
472
- temp = updateDBTrace arr
473
-
474
- cur = stack[stack.size()-1]
475
- c = cur[6]
476
- c.push(temp)
477
- cur[6] = c
478
- traceDetails valo,stack,indx
479
- elsif(arr["name"]=="apm.methodstart")
480
- temp = updateStartTrace arr
481
- cur = stack[stack.size()-1]
482
- c = cur[6]
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
-