site24x7_apminsight 1.4 → 1.5
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/conf/apminsight.conf +0 -15
- data/lib/agent/am_objectholder.rb +4 -4
- data/lib/agent/configuration/am_configuration.rb +5 -5
- data/lib/agent/metrics/am_metricsformatter.rb +1 -4
- data/lib/agent/metrics/am_metricsparser.rb +139 -509
- data/lib/agent/metrics/am_metricstore.rb +7 -6
- data/lib/agent/server/am_agent.rb +3 -1
- data/lib/agent/server/am_connector.rb +5 -8
- data/lib/agent/server/instrument/active_record.rb +50 -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 +29 -0
- data/lib/agent/server/instrument/rails.rb +56 -0
- data/lib/agent/server/instrument/sinatra.rb +96 -0
- data/lib/agent/trackers/database_tracker.rb +107 -0
- data/lib/agent/trackers/default_tracker.rb +49 -0
- data/lib/agent/trackers/root_tracker.rb +46 -0
- data/lib/agent/util/am_constants.rb +2 -1
- data/lib/agent/util/am_util.rb +21 -0
- data/lib/agent/util/transaction_util.rb +35 -0
- data/lib/version.rb +2 -2
- data/site24x7-agent.gemspec +12 -23
- metadata +26 -18
data/conf/apminsight.conf
CHANGED
@@ -71,24 +71,9 @@ transaction.trace.sql.parametrize=true
|
|
71
71
|
#default value: 3 (second)
|
72
72
|
transaction.trace.sql.stacktrace.threshold=3
|
73
73
|
|
74
|
-
#Capture HTTP request input parameters, if enabled.
|
75
|
-
#To skip recording specific request parameters use webtrasnaction.trace.input.params.ignore key.
|
76
|
-
#default value: false
|
77
|
-
webtransaction.trace.input.params.record=false
|
78
|
-
|
79
|
-
#Skip recording confidential request parameters like password, authKey, etc.
|
80
|
-
#Use comma (,) as parameter names separator.
|
81
|
-
#If no value is specified all parameters will be recorded.
|
82
|
-
#Value(s) specified for this key are case sensitive.
|
83
|
-
webtransaction.trace.input.params.ignore=password, pswd, pass, authKey, parentId, parentID, resourceId, resourceID, id, ID
|
84
|
-
|
85
74
|
#Stop listening transactions with specified URL pattern.
|
86
75
|
transaction.skip.listening=*.css, *.js, *.gif, *.jpg, *.jpeg, *.bmp, *.png, *.ico
|
87
76
|
|
88
|
-
#Sampling counter. Say for example when you specify the value as 20, agent will track one in 20 transactions.
|
89
|
-
#default value: 1 (transaction)
|
90
|
-
transaction.tracking.request.interval=1
|
91
|
-
|
92
77
|
#Directory where agent logs information separately.
|
93
78
|
#Defaults to the directory where apminsight-javaagent.jar is installed.
|
94
79
|
#Use forward slash(/) as path separator.
|
@@ -9,13 +9,13 @@ require "agent/metrics/am_metricscollector"
|
|
9
9
|
require "agent/metrics/am_metricstore"
|
10
10
|
require "agent/metrics/am_metricsformatter"
|
11
11
|
require "agent/metrics/am_metricsparser"
|
12
|
-
require "agent/
|
12
|
+
require "agent/util/transaction_util"
|
13
13
|
|
14
14
|
module ManageEngine
|
15
15
|
|
16
16
|
class APMObjectHolder
|
17
|
-
attr_reader :config,:log,:util,:constants,:shutdown,:connector,:agent,:collector
|
18
|
-
attr_accessor :shutdown,:agent_initialized,:last_dispatch_time,:
|
17
|
+
attr_reader :config,:log,:util,:constants,:shutdown,:connector,:agent,:collector, :txn_util
|
18
|
+
attr_accessor :shutdown,:agent_initialized,:last_dispatch_time,:store,:formatter,:parser
|
19
19
|
@@objects = nil
|
20
20
|
#Don't Change the Order of Initialize
|
21
21
|
def initializeObjects
|
@@ -29,7 +29,7 @@ module ManageEngine
|
|
29
29
|
@connector = ManageEngine::APMConnector.new
|
30
30
|
@store = ManageEngine::APMMetricsStore.new
|
31
31
|
@collector = ManageEngine::APMMetricsCollector.new
|
32
|
-
|
32
|
+
@txn_util = ManageEngine::TransactionUtil.new
|
33
33
|
@formatter = ManageEngine::APMMetricsFormatter.new
|
34
34
|
@parser = ManageEngine::APMMetricsParser.new
|
35
35
|
@agent = ManageEngine::APMAgent.new
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'json'
|
3
3
|
require 'socket'
|
4
|
-
require 'rails'
|
4
|
+
#require 'rails'
|
5
5
|
require 'agent/am_objectholder'
|
6
6
|
require 'version'
|
7
7
|
|
@@ -9,7 +9,7 @@ module ManageEngine
|
|
9
9
|
class APMConfig
|
10
10
|
attr_reader :agenthost,:agentport,:instance_id,:alreadyconnected,:apmhost,:apmport,:license_key,:site24x7, :site24x7url
|
11
11
|
attr_reader :appname,:proxyneeded, :apdex_t, :trans_trace, :trans_trace_t, :sql_capture, :sql_capture_params, :sql_trace_t,:proxy_user,:proxy_pass, :metric_overflow_t, :trace_overflow_t
|
12
|
-
attr_reader :proxy_host,:proxy_port ,:is_secured, :logs_dir ,:connection_retry,:agent_enabled,:connect_interval,:db_operations,:
|
12
|
+
attr_reader :proxy_host,:proxy_port ,:is_secured, :logs_dir ,:connection_retry,:agent_enabled,:connect_interval,:db_operations,:txn_skip_listen, :url_merge_pattern
|
13
13
|
attr_accessor :app_db,:app_dispatcher,:lastupdatedtime
|
14
14
|
def initialize
|
15
15
|
@obj = ManageEngine::APMObjectHolder.instance
|
@@ -151,7 +151,7 @@ module ManageEngine
|
|
151
151
|
@connection_retry = 0
|
152
152
|
@connect_interval = 60
|
153
153
|
@apdex_t=0.5
|
154
|
-
@
|
154
|
+
@txn_skip_listen=Array.new
|
155
155
|
@trans_trace_t=2
|
156
156
|
@sql_trace_t=3
|
157
157
|
@metric_overflow_t=250
|
@@ -190,7 +190,7 @@ module ManageEngine
|
|
190
190
|
when "apminsight.log.dir" then @logs_dir=value
|
191
191
|
when "agent.connection.retry" then @connection_retry=value #Not in Conf - yet to come
|
192
192
|
when "agent.connection.interval" then @connect_interval=value#Not in Conf - yet to come
|
193
|
-
when "
|
193
|
+
when "transaction.skip.listening" then @txn_skip_listen=@obj.util.getArray value.gsub("\s", ""),","
|
194
194
|
end
|
195
195
|
end
|
196
196
|
end
|
@@ -221,7 +221,7 @@ module ManageEngine
|
|
221
221
|
ENV.to_hash.each do |key, value|
|
222
222
|
env[key] = value
|
223
223
|
end
|
224
|
-
env["Application Path"]="#{Rails.root}"
|
224
|
+
#env["Application Path"]="#{Rails.root}"
|
225
225
|
rescue Exception=>e
|
226
226
|
end
|
227
227
|
env
|
@@ -165,10 +165,7 @@ module ManageEngine
|
|
165
165
|
dbl = d["db"]
|
166
166
|
|
167
167
|
rt = pl["rt"].round(2)
|
168
|
-
path = pl["path"]
|
169
|
-
name = pl["name"]
|
170
|
-
|
171
|
-
path = @obj.constants.mf_transaction + @obj.constants.mf_separator + path + " " +name
|
168
|
+
path = @obj.constants.mf_transaction + @obj.constants.mf_separator + pl["path"]
|
172
169
|
|
173
170
|
|
174
171
|
apx_stat = nil
|
@@ -12,114 +12,40 @@ module ManageEngine
|
|
12
12
|
@obj = ManageEngine::APMObjectHolder.instance
|
13
13
|
parseddata = Hash.new
|
14
14
|
begin
|
15
|
-
data.each do |
|
16
|
-
@obj.log.debug "[Processing started for - #{
|
17
|
-
#lastHash = val.last
|
18
|
-
#name = lastHash["name"]
|
19
|
-
keyForTrans = key
|
20
|
-
# if(name=="process_action.action_controller")
|
21
|
-
#Transaction completed
|
22
|
-
tdata = Hash.new #transaction data -> rt, path,..
|
23
|
-
trdbdata = Array.new #db data -> sql, operation, rt,..
|
24
|
-
exceptionData = Hash.new #exception data -> clz name, count
|
25
|
-
exceptionInfo = Array.new # data to be sent in trace as 'loginfo'
|
26
|
-
trdata = Array.new #trace data
|
27
|
-
started = false
|
28
|
-
redirect=false
|
29
|
-
ended =false;
|
30
|
-
start_index = 0;
|
31
|
-
val.each do |arr|
|
32
|
-
#@obj.log.debug "Processing : #{arr["name"]}"
|
33
|
-
if(started || arr["name"]==("start_processing.action_controller") )
|
34
|
-
|
35
|
-
exception = arr["payload"][:exception] #[0-exception clz, 1-exception msg]
|
36
|
-
if (exception != nil)
|
37
|
-
exceptionData[exception[0]] = exceptionData[exception[0]].to_i + 1
|
38
|
-
exceptionData[@obj.constants.mf_logmetric_warning] = exceptionData[@obj.constants.mf_logmetric_warning].to_i + 1
|
39
|
-
logInfo = {@obj.constants.mf_loginfo_time=>arr["end"].to_i,
|
40
|
-
@obj.constants.mf_loginfo_level=>@obj.constants.mf_loginfo_level_warn,
|
41
|
-
@obj.constants.mf_loginfo_str=>exception[1],
|
42
|
-
@obj.constants.mf_loginfo_err_clz=>exception[0],
|
43
|
-
@obj.constants.mf_loginfo_st=>arr["payload"][:exception_object] != nil ?
|
44
|
-
formatStacktrace(arr["payload"][:exception_object].backtrace) : nil}
|
45
|
-
exceptionInfo.push(logInfo)
|
46
|
-
end
|
47
|
-
|
48
|
-
if(arr["name"]=="sql.active_record" && @obj.config.sql_capture)
|
49
|
-
dbd = getDBData(arr)
|
50
|
-
if tdata.has_key?("db")
|
51
|
-
tdata["db"].push(dbd)
|
52
|
-
else
|
53
|
-
temp = Array.new
|
54
|
-
temp.push(dbd)
|
55
|
-
tdata["db"]=temp
|
56
|
-
end
|
57
|
-
#trdbdata.push(updateDBTrace(arr,dbd))
|
58
|
-
#@obj.log.debug "TRANS DBBB TRACE : #{dbd}"
|
59
|
-
elsif (arr["name"]=="process_action.action_controller")
|
60
|
-
|
61
|
-
tdata["td"]=getTransData(arr,tdata)
|
62
|
-
|
63
|
-
if (exception != nil)
|
64
|
-
tdata["td"]["error"] = true
|
65
|
-
end
|
66
|
-
tdata["td"]["exception"]=exceptionData
|
67
|
-
#if redirect
|
68
|
-
# started = false
|
69
|
-
# redirect=false
|
70
|
-
# ended =false;
|
71
|
-
#else
|
72
|
-
ended = true
|
73
|
-
started = false
|
74
|
-
redirect=false
|
75
|
-
parseddata = updateParsedData key,tdata.dup,parseddata
|
76
|
-
#@obj.log.info "TRACE #{@obj.config.trans_trace}"
|
77
|
-
if @obj.config.trans_trace
|
78
|
-
ret = tdata["td"]
|
79
|
-
#@obj.log.info "TRACE COMPARE : #{ret["rt"]} > #{(@obj.config.trans_trace_t.to_f*1000).to_i}"
|
80
|
-
if (ret["rt"]).to_i > (@obj.config.trans_trace_t.to_f* 1000).to_i
|
81
|
-
tval = val[(start_index)..val.index(arr)]
|
82
|
-
#@obj.log.debug "Gng To Trace : #{start_index} to #{val.index(arr)}"
|
83
|
-
parseddata =updateTraceData tval,parseddata,exceptionInfo
|
84
|
-
end
|
85
|
-
end
|
86
|
-
key = key + start_index.to_s
|
87
|
-
tdata=Hash.new
|
88
|
-
start_index = val.index(arr)
|
89
|
-
#end
|
90
|
-
#trdata = updateTransTrace(arr,trdbdata,trdata);
|
91
|
-
#@obj.log.info "TRANS TRACE : #{trdata}"
|
92
|
-
#elsif(arr["name"]==("!render_template.action_view")
|
93
|
-
#Render Action
|
94
|
-
#elsif(arr["name"]==("render_template.action_view")
|
95
|
-
#Render Action data not in use
|
96
|
-
elsif(arr["name"]==("start_processing.action_controller"))
|
97
|
-
ended =false;
|
98
|
-
started=true
|
99
|
-
#trdata = updateStartTrace(arr,trdata);
|
100
|
-
#Render Action data not in use
|
101
|
-
elsif(arr["name"]==("redirect_to.action_controller"))
|
102
|
-
redirect = true;
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
end # events - do-loop
|
15
|
+
data.each do |txn_name, trackers|
|
16
|
+
@obj.log.debug "[Processing started for - #{txn_name} ]"
|
107
17
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
18
|
+
trackers.each do |tracker|
|
19
|
+
|
20
|
+
tdata = Hash.new #transaction data -> rt, path,..
|
21
|
+
exceptionInfo = Array.new # data to be sent in trace as 'loginfo'
|
22
|
+
|
23
|
+
tdata["td"] = getTransData(tracker,tdata)
|
24
|
+
|
25
|
+
children = tracker.children
|
26
|
+
if (children != nil)
|
27
|
+
children.each do |child|
|
28
|
+
|
29
|
+
if child.kind_of?(ManageEngine::Tracker::DatabaseTracker)
|
30
|
+
tdata["db"] = getDBData(child, tdata)
|
31
|
+
end
|
32
|
+
|
33
|
+
updateExceptionInfo(child,exceptionInfo)
|
34
|
+
end # do - children
|
35
|
+
end
|
36
|
+
|
37
|
+
updateExceptionInfo(tracker, exceptionInfo) # Updating roottracker exception, if any
|
38
|
+
|
39
|
+
parseddata = updateParsedData(txn_name, tdata.dup, parseddata)
|
40
|
+
|
41
|
+
if @obj.config.trans_trace && (tracker.duration >= (@obj.config.trans_trace_t.to_f*1000).to_i || tracker.error?)
|
42
|
+
parseddata = updateTraceData(tracker, parseddata, exceptionInfo)
|
43
|
+
end
|
44
|
+
|
45
|
+
end # do - trackers
|
46
|
+
|
47
|
+
@obj.store.removeData txn_name
|
48
|
+
@obj.log.debug "[Processing END for - #{txn_name} ]"
|
123
49
|
end # do-loop
|
124
50
|
rescue Exception=>e
|
125
51
|
@obj.log.info "Exception : #{e}"
|
@@ -130,10 +56,21 @@ module ManageEngine
|
|
130
56
|
parseddata
|
131
57
|
end
|
132
58
|
|
133
|
-
def
|
59
|
+
def updateExceptionInfo (tracker, exceptionInfo)
|
60
|
+
if tracker.error?
|
61
|
+
logInfo = { @obj.constants.mf_loginfo_time => tracker.endtime.to_i,
|
62
|
+
@obj.constants.mf_loginfo_level => @obj.constants.mf_loginfo_level_warn,
|
63
|
+
@obj.constants.mf_loginfo_str => tracker.error.message,
|
64
|
+
@obj.constants.mf_loginfo_err_clz => tracker.error.class.to_s,
|
65
|
+
@obj.constants.mf_loginfo_st => @obj.util.formatStacktrace(tracker.error.backtrace) }
|
66
|
+
exceptionInfo.push(logInfo)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def updateParsedData (key, tdata, parseddata)
|
134
71
|
begin
|
135
72
|
if parseddata.has_key?(key)
|
136
|
-
key =
|
73
|
+
key = rand # Use a random number
|
137
74
|
end
|
138
75
|
#@obj.log.debug "Update parsed data : #{key} = > #{tdata}"
|
139
76
|
parseddata[key]=tdata
|
@@ -145,7 +82,7 @@ module ManageEngine
|
|
145
82
|
end
|
146
83
|
|
147
84
|
# Generates Trace for the transaction and updates it in 'parseddata' hash
|
148
|
-
def updateTraceData
|
85
|
+
def updateTraceData(rootTracker, parseddata, exceptionInfo)
|
149
86
|
if(parseddata.has_key?("trace-data"))
|
150
87
|
tData = parseddata["trace-data"];
|
151
88
|
if(tData.length == @obj.config.trace_overflow_t)
|
@@ -160,17 +97,17 @@ module ManageEngine
|
|
160
97
|
end
|
161
98
|
end
|
162
99
|
begin
|
163
|
-
trdata = getTrace
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
100
|
+
trdata = getTrace(rootTracker)
|
101
|
+
trac = updateTrace(trdata, exceptionInfo)
|
102
|
+
if(parseddata.has_key?("trace-data"))
|
103
|
+
traceData = parseddata["trace-data"];
|
104
|
+
traceData.push(trac);
|
105
|
+
parseddata["trace-data"] = traceData;
|
106
|
+
else
|
107
|
+
traceData = Array.new
|
108
|
+
traceData.push(trac)
|
109
|
+
parseddata["trace-data"] = traceData;
|
110
|
+
end
|
174
111
|
rescue Exception=>e
|
175
112
|
@obj.log.info "Exception in updateTraceData: #{e}"
|
176
113
|
@obj.log.logException "#{e.message}",e
|
@@ -195,31 +132,19 @@ module ManageEngine
|
|
195
132
|
return top
|
196
133
|
end
|
197
134
|
|
198
|
-
def getTransData(
|
199
|
-
pl = d["payload"]
|
135
|
+
def getTransData(rootTracker, tdata)
|
200
136
|
ret = nil;
|
201
137
|
begin
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
path=val
|
213
|
-
break
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
controller=pl[:controller]
|
218
|
-
#controller=pl["controller"]
|
219
|
-
action = pl[:action]
|
220
|
-
#action = pl["action"]
|
221
|
-
ret ={"rt"=>rt,"path"=>path,"name"=>controller+"#"+action}
|
222
|
-
end
|
138
|
+
if(tdata.has_key?("td"))
|
139
|
+
ret = tdata["td"]
|
140
|
+
ret["rt"] = ret["rt"] + rootTracker.duration
|
141
|
+
else
|
142
|
+
ret = {"rt"=> rootTracker.duration, "path"=>rootTracker.name}
|
143
|
+
if (rootTracker.error?)
|
144
|
+
ret["error"] = true
|
145
|
+
updateExceptionMetric(rootTracker.error, ret)
|
146
|
+
end
|
147
|
+
end
|
223
148
|
rescue Exception=>e
|
224
149
|
@obj.log.info "Exception in getTranseData: #{e}"
|
225
150
|
@obj.log.logException "#{e.message}",e
|
@@ -228,290 +153,72 @@ module ManageEngine
|
|
228
153
|
end
|
229
154
|
|
230
155
|
# Generates DB metric
|
231
|
-
def getDBData(
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
sqlStrip="";
|
240
|
-
tr_name="";
|
241
|
-
begin
|
242
|
-
sqlStrip = getSqlStrip sqlArr,false
|
243
|
-
rescue Exception=>e
|
244
|
-
@obj.log.logException "#{e.message}",e
|
245
|
-
sqlStrip = sqlArr[0]+"/-/dummydb"
|
246
|
-
end
|
156
|
+
def getDBData(databaseTracker, tdata)
|
157
|
+
dbData = tdata["db"]
|
158
|
+
if dbData == nil
|
159
|
+
dbData = Array.new
|
160
|
+
end
|
161
|
+
|
162
|
+
queryInfo = databaseTracker.getQueryInfo
|
163
|
+
sqlStrip = queryInfo[0] + "/" + queryInfo[1] + "/dummydb"
|
247
164
|
|
248
|
-
|
249
|
-
|
250
|
-
ret ={"rt"=>rt,"sql"=>format(sql),"sql-strip"=>sqlStrip,"name"=>name,"operation"=>sqlArr[0]}
|
165
|
+
ret ={"rt"=>databaseTracker.duration, "sql"=>databaseTracker.getRawQuery,
|
166
|
+
"sql-strip"=>sqlStrip, "name"=>databaseTracker.name, "operation"=>queryInfo[0]}
|
251
167
|
|
252
|
-
if (
|
168
|
+
if (databaseTracker.error?)
|
253
169
|
ret["error"] = true
|
170
|
+
updateExceptionMetric(databaseTracker.error, ret)
|
254
171
|
end
|
255
|
-
ret
|
256
|
-
end
|
257
|
-
|
258
|
-
def getSqlStrip sqlArr ,trace
|
259
|
-
sqlStrip =""
|
260
|
-
begin
|
261
|
-
sqlStrip = case sqlArr[0]
|
262
|
-
when "select" then sqlArr[sqlArr.index("from")+1]
|
263
|
-
when "insert" then sqlArr[sqlArr.index("into")+1]
|
264
|
-
when "update" then sqlArr[1]
|
265
|
-
when "delete" then sqlArr[sqlArr.index("from")+1]
|
266
|
-
when "create" then sqlArr[1] + sqlArr[2]
|
267
|
-
when "alter" then sqlArr[1] + sqlArr[2]
|
268
|
-
when "drop" then sqlArr[1] + sqlArr[2]
|
269
|
-
when "show" then sqlArr[1]
|
270
|
-
when "describe" then sqlArr[1]
|
271
|
-
else "-"
|
272
|
-
end
|
273
|
-
|
274
|
-
if trace
|
275
|
-
sqlStrip = format(sqlArr[0]) +" - " + format(sqlStrip)
|
276
|
-
else
|
277
|
-
sqlStrip = format(sqlArr[0]) +"/" + format(sqlStrip) +"/dummydb"
|
278
|
-
end
|
279
|
-
|
280
|
-
rescue Exception=>e
|
281
|
-
@obj.log.logException "#{e.message}",e
|
282
|
-
if trace
|
283
|
-
sqlStrip = format(sqlArr[0])
|
284
|
-
else
|
285
|
-
sqlStrip = sqlArr[0]+"/-/dummydb"
|
286
|
-
end
|
287
|
-
end
|
288
|
-
end
|
289
|
-
|
290
|
-
def updateDBTrace(d)
|
291
|
-
pl = d["payload"]
|
292
|
-
rt = (d["end"] - d["start"])
|
293
|
-
sql = pl[:sql]
|
294
|
-
#sql = pl["sql"]
|
295
|
-
sql.strip!
|
296
|
-
sql.downcase!
|
297
|
-
sql = format(sql)
|
298
|
-
sqlArr = sql.split(" ")
|
299
172
|
|
300
|
-
|
301
|
-
|
302
|
-
trData[0] = d["ctime"]
|
303
|
-
trData[1] = getSqlStrip sqlArr,true
|
304
|
-
trData[2] = ""
|
305
|
-
trData[3] = rt.to_i
|
306
|
-
trData[4] = rt.to_i
|
307
|
-
trData[5] = {"query"=>sql}
|
308
|
-
trData[6] = Array.new
|
309
|
-
if(!@obj.config.sql_capture_params)
|
310
|
-
trData[5] = updateQueryParams(d,sql,pl[:binds],rt)
|
311
|
-
#trData[5] = updateQueryParams(d,sql,pl["binds"],rt)
|
312
|
-
else
|
313
|
-
sql = @obj.util.parametrizeQuery sql
|
314
|
-
trData[5] = {"query"=>sql}
|
315
|
-
end
|
316
|
-
trData
|
173
|
+
dbData.push(ret)
|
174
|
+
dbData
|
317
175
|
end
|
318
176
|
|
319
|
-
def
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
#args = args + ar.last + ","
|
326
|
-
if sql!=nil && sql.index("?")!=nil
|
327
|
-
sql["?"]=ar.value.to_s
|
328
|
-
end
|
329
|
-
end
|
330
|
-
end
|
331
|
-
#if args.length>0
|
332
|
-
# sql = sql + "\\nPARAMS - ["+args+ "]"
|
333
|
-
#end
|
334
|
-
ret = {"query"=>sql}
|
335
|
-
rescue Exception=>exe
|
336
|
-
@obj.log.logException "Not severe -#{exe.message}",exe
|
337
|
-
ret = {"query"=>sql}
|
338
|
-
end
|
339
|
-
|
340
|
-
begin
|
341
|
-
if(rt.to_i > (@obj.config.sql_trace_t.to_f * "1000".to_f ).to_i && d.has_key?("trace") )
|
342
|
-
t = updateSQLStackTrace(d["trace"])
|
343
|
-
ret["stacktrace"] =t
|
344
|
-
end
|
345
|
-
rescue Exception=>e
|
346
|
-
@obj.log.logException "#{e.message}",e
|
347
|
-
end
|
348
|
-
|
349
|
-
ret
|
350
|
-
end
|
351
|
-
|
352
|
-
def formatStacktrace(stacktrace)
|
353
|
-
strace = Array.new;
|
354
|
-
begin
|
355
|
-
stacktrace = Rails.backtrace_cleaner.clean(stacktrace)
|
356
|
-
stacktrace.each do |stackelement|
|
357
|
-
temp = Array.new
|
358
|
-
temp[0] = stackelement
|
359
|
-
temp[1] = ""
|
360
|
-
temp[2] = ""
|
361
|
-
temp[3] = ""
|
362
|
-
strace.push(temp)
|
363
|
-
if (strace.size == 20)
|
364
|
-
break;
|
365
|
-
end
|
366
|
-
end
|
367
|
-
rescue Exception=>e
|
368
|
-
@obj.log.logException "Error while formatting stack trace. #{e.message}", e
|
369
|
-
end
|
177
|
+
def updateExceptionMetric (exception, tdata)
|
178
|
+
excData = tdata["exception"]
|
179
|
+
if (excData == nil)
|
180
|
+
excData = Hash.new
|
181
|
+
tdata["exception"] = excData
|
182
|
+
end
|
370
183
|
|
371
|
-
|
184
|
+
excData[exception.class.to_s] = excData[exception.class.to_s].to_i + 1
|
185
|
+
excData[@obj.constants.mf_logmetric_warning] = excData[@obj.constants.mf_logmetric_warning].to_i + 1
|
372
186
|
end
|
373
187
|
|
374
|
-
def
|
375
|
-
trace = Array.new;
|
376
|
-
started = false;
|
377
|
-
ended = false;
|
378
|
-
begin
|
379
|
-
#@obj.log.debug "STACKTRACE STARTS"
|
380
|
-
d.each do |arr|
|
381
|
-
|
382
|
-
if started
|
383
|
-
|
384
|
-
end_ind = arr.index("`send_action'")
|
385
|
-
if end_ind != nil && end_ind >0
|
386
|
-
ended = true
|
387
|
-
break;
|
388
|
-
end
|
389
|
-
#trArr = arr.split(/:[0-1,in]/);
|
390
|
-
#if trArr[0].length>30
|
391
|
-
# len = trArr.length
|
392
|
-
# trArr[0] = "..."+trArr[(len-30),len]
|
393
|
-
# end
|
394
|
-
inx=arr.index("`instrument'")
|
395
|
-
if inx!=nil && inx>0
|
396
|
-
#skip instrumet data
|
397
|
-
else
|
398
|
-
temp = Array.new
|
399
|
-
temp[0]=arr
|
400
|
-
temp[1]=""
|
401
|
-
temp[2]=""
|
402
|
-
temp[3]=""
|
403
|
-
trace.push(temp)
|
404
|
-
end
|
405
|
-
end
|
406
|
-
|
407
|
-
if started==false
|
408
|
-
ind = arr.index("`instrument'")
|
409
|
-
if ind != nil && ind >0
|
410
|
-
started = true
|
411
|
-
end
|
412
|
-
end
|
413
|
-
|
414
|
-
|
415
|
-
end
|
416
|
-
#@obj.log.debug "STACKTRACE ENDS"
|
417
|
-
|
418
|
-
trace.shift
|
419
|
-
rescue Exception=>e
|
420
|
-
@obj.log.logException "#{e.message}",e
|
421
|
-
end
|
422
|
-
trace
|
423
|
-
end
|
424
|
-
|
425
|
-
def updateOtherTrace d
|
426
|
-
pl = d["payload"]
|
427
|
-
rt = (d["end"] - d["start"])
|
428
|
-
name = d["name"]
|
429
|
-
if pl.has_key?(:identifier)
|
430
|
-
#if pl.has_key?("identifier")
|
431
|
-
name = pl[:identifier]
|
432
|
-
#name = pl["identifier"]
|
433
|
-
end
|
188
|
+
def updateDBTrace(dbTracker)
|
434
189
|
trData = Array.new
|
435
|
-
|
436
|
-
|
437
|
-
trData[1] =
|
438
|
-
trData[2] = ""
|
439
|
-
trData[3] = rt.to_i
|
440
|
-
trData[4] = rt.to_i
|
441
|
-
trData[5] = nil
|
442
|
-
trData[6] = Array.new
|
443
|
-
trData
|
444
|
-
end
|
445
|
-
|
446
|
-
def updateTransTrace(d,trData)
|
447
|
-
|
448
|
-
#trData = Array.new
|
449
|
-
#trData[0] = ((d["start"]).to_f * 1000).to_i
|
450
|
-
pl = d["payload"]
|
451
|
-
path = pl[:path]
|
452
|
-
@obj.config.url_merge_pattern.each do |key, val|
|
453
|
-
if (path.match(key) != nil)
|
454
|
-
path=val
|
455
|
-
break
|
456
|
-
end
|
457
|
-
end
|
458
|
-
trData[1] = path + " " +pl[:controller] + "#" + pl[:action]
|
459
|
-
#trData[1] = pl["path"] + " " +pl["controller"] + "#" + pl["action"]
|
190
|
+
trData[0] = dbTracker.starttime
|
191
|
+
queryInfo = dbTracker.getQueryInfo
|
192
|
+
trData[1] = queryInfo[0] + " - " + queryInfo[1]
|
460
193
|
trData[2] = ""
|
461
|
-
trData[3] =
|
462
|
-
trData[4] =
|
463
|
-
|
464
|
-
|
465
|
-
if (exception != nil)
|
466
|
-
trData[5] = {@obj.constants.mf_exception_st=>formatStacktrace(exception.backtrace)}
|
467
|
-
else
|
468
|
-
trData[5] = nil
|
469
|
-
end
|
470
|
-
#trData[6] = Array.new
|
471
|
-
#dbTime = 0
|
472
|
-
#trdbdata.each do |dbData|
|
473
|
-
# dbTime = dbTime + dbData[3]
|
474
|
-
#end
|
475
|
-
#trData[4] = ((trData[3]).to_f - (dbTime.to_f )).to_i
|
476
|
-
# if(pl[:db_runtime]!=nil)
|
477
|
-
# trData[4] = ((trData[3]).to_f - (pl[:db_runtime].to_f )).to_i
|
478
|
-
# end
|
194
|
+
trData[3] = dbTracker.duration.to_i
|
195
|
+
trData[4] = trData[3]
|
196
|
+
trData[5] = dbTracker.getAdditionalInfo
|
197
|
+
trData[6] = Array.new
|
479
198
|
trData
|
480
199
|
end
|
481
200
|
|
482
|
-
def
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
trData[
|
488
|
-
|
489
|
-
trData[
|
490
|
-
trData[
|
491
|
-
trData[4] = (d["end"] - trData[0]).to_i
|
492
|
-
trData[5] = nil
|
493
|
-
#trData[6] = Array.new
|
494
|
-
#dbTime = 0
|
495
|
-
#trdbdata.each do |dbData|
|
496
|
-
# dbTime = dbTime + dbData[3]
|
497
|
-
#end
|
498
|
-
#trData[4] = ((trData[3]).to_f - (dbTime.to_f )).to_i
|
499
|
-
# if(pl[:db_runtime]!=nil)
|
500
|
-
# trData[4] = ((trData[3]).to_f - (pl[:db_runtime].to_f )).to_i
|
501
|
-
# end
|
201
|
+
def updateOtherTrace(tracker)
|
202
|
+
trData = Array.new
|
203
|
+
trData[0] = tracker.starttime
|
204
|
+
trData[1] = tracker.name
|
205
|
+
trData[2] = ""
|
206
|
+
trData[3] = tracker.duration
|
207
|
+
trData[4] = tracker.duration
|
208
|
+
trData[5] = tracker.getAdditionalInfo
|
209
|
+
trData[6] = Array.new
|
502
210
|
trData
|
503
211
|
end
|
504
212
|
|
505
|
-
def updateStartTrace(
|
213
|
+
def updateStartTrace(rootTracker)
|
506
214
|
trData = Array.new
|
507
|
-
|
508
|
-
trData[
|
509
|
-
trData[
|
510
|
-
trData[
|
511
|
-
trData[3]
|
512
|
-
trData[
|
513
|
-
trData[
|
514
|
-
trData[6] =Array.new
|
215
|
+
trData[0] = rootTracker.starttime
|
216
|
+
trData[1] = rootTracker.name # tracker name
|
217
|
+
trData[2] = "" # component
|
218
|
+
trData[3] = rootTracker.duration # total time
|
219
|
+
trData[4] = trData[3] # exclusive time
|
220
|
+
trData[5] = rootTracker.getAdditionalInfo # additional info
|
221
|
+
trData[6] = Array.new # children
|
515
222
|
|
516
223
|
trData
|
517
224
|
end
|
@@ -535,110 +242,33 @@ module ManageEngine
|
|
535
242
|
top[1] = trans
|
536
243
|
top
|
537
244
|
end
|
538
|
-
|
539
|
-
def format s
|
540
|
-
s.gsub!("\"", '')
|
541
|
-
s.gsub!("\n", '')
|
542
|
-
s
|
543
|
-
end
|
544
|
-
|
545
245
|
|
546
|
-
def getTrace
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
if(arr["name"]=="start_processing.action_controller")
|
551
|
-
index = data.index(arr)
|
552
|
-
break;
|
553
|
-
end
|
554
|
-
end
|
555
|
-
data = data.drop(index)
|
556
|
-
tdata =traceDetails data,Array.new,0
|
557
|
-
tdata = updateExclusiveTrace(tdata[0])
|
246
|
+
def getTrace(rootTracker)
|
247
|
+
tdata = traceDetails(rootTracker)
|
248
|
+
tdata = updateExclusiveTrace(tdata)
|
558
249
|
tdata
|
559
250
|
end
|
560
251
|
|
561
|
-
def traceDetails
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
end
|
582
|
-
|
583
|
-
traceDetails valo,stack,indx
|
584
|
-
|
585
|
-
elsif(arr["name"]=="sql.active_record" && @obj.config.sql_capture )
|
586
|
-
|
587
|
-
temp = updateDBTrace arr
|
588
|
-
|
589
|
-
cur = stack[stack.size()-1]
|
590
|
-
c = cur[6]
|
591
|
-
c.push(temp)
|
592
|
-
cur[6] = c
|
593
|
-
traceDetails valo,stack,indx
|
594
|
-
elsif(arr["name"]=="apm.methodstart")
|
595
|
-
temp = updateStartTrace arr
|
596
|
-
cur = stack[stack.size()-1]
|
597
|
-
c = cur[6]
|
598
|
-
c.push(temp)
|
599
|
-
cur[6] = c
|
600
|
-
stack.push(temp)
|
601
|
-
traceDetails valo,stack,indx
|
602
|
-
elsif(arr["name"]=="apm.methodend")
|
603
|
-
updateMethodTrace(arr,stack[stack.size()-1])
|
604
|
-
stack.delete(stack[stack.size()-1])
|
605
|
-
traceDetails valo,stack,indx
|
606
|
-
elsif(arr["name"]=="process_action.action_controller")
|
607
|
-
updateTransTrace(arr,stack[stack.size()-1])
|
608
|
-
if(valo.size()>(indx+1))
|
609
|
-
#Redirection Data
|
610
|
-
#Skipping all the "start_processing" event after "process_action" event
|
611
|
-
arr = valo[indx]
|
612
|
-
while (arr["name"]!="start_processing.action_controller") do
|
613
|
-
indx = indx + 1
|
614
|
-
arr = valo[indx]
|
615
|
-
end
|
616
|
-
end
|
617
|
-
(stack[0])[3] = (arr["end"] - ((stack[0])[0])).to_i
|
618
|
-
(stack[0])[4] = (arr["end"] - ((stack[0])[0])).to_i
|
619
|
-
|
620
|
-
|
621
|
-
traceDetails valo,stack,indx
|
622
|
-
#parent[4] = parent[4] - traceArr[4]
|
623
|
-
elsif (arr["name"]=="render_template.action_view")
|
624
|
-
temp = updateOtherTrace arr
|
625
|
-
|
626
|
-
cur = stack[stack.size()-1]
|
627
|
-
c = cur[6]
|
628
|
-
c.push(temp)
|
629
|
-
cur[6] = c
|
630
|
-
#traceArr[6] = c
|
631
|
-
#parent[4] = parent[4] - temp[4]
|
632
|
-
traceDetails valo,stack,indx
|
633
|
-
else
|
634
|
-
traceDetails valo,stack,indx
|
635
|
-
|
636
|
-
end
|
637
|
-
|
638
|
-
stack
|
639
|
-
else
|
640
|
-
#Nothing todo
|
641
|
-
end
|
252
|
+
def traceDetails rootTracker
|
253
|
+
|
254
|
+
traceArr = updateStartTrace(rootTracker)
|
255
|
+
|
256
|
+
children = rootTracker.children
|
257
|
+
if (children != nil)
|
258
|
+
children.each do |child|
|
259
|
+
|
260
|
+
if child.kind_of?(ManageEngine::Tracker::DatabaseTracker)
|
261
|
+
dbTrace = updateDBTrace(child)
|
262
|
+
traceArr[6].push(dbTrace)
|
263
|
+
else
|
264
|
+
trace = updateOtherTrace(child)
|
265
|
+
traceArr[6].push(trace)
|
266
|
+
end
|
267
|
+
|
268
|
+
end # do - children
|
269
|
+
end # if children
|
270
|
+
|
271
|
+
traceArr
|
642
272
|
end
|
643
273
|
|
644
274
|
|