apminsight 1.0.1 → 1.8.6

Sign up to get free protection for your applications and to get access to all the features.
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 +284 -41
  7. data/lib/agent/handler/custom_api_handler.rb +40 -0
  8. data/lib/agent/handler/sequence_book.rb +125 -0
  9. data/lib/agent/handler/tracker_handler.rb +58 -0
  10. data/lib/agent/logging/am_logger.rb +20 -11
  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 +46 -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 +62 -0
  27. data/lib/agent/trackers/root_tracker.rb +43 -0
  28. data/lib/agent/util/am_constants.rb +53 -8
  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
-