apminsight 1.0.1 → 1.8.6

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 +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
@@ -4,6 +4,8 @@ require "logger"
4
4
  module ManageEngine
5
5
  class APMLogger
6
6
  @apmlog=nil;
7
+ @apmLogPath=nil;
8
+
7
9
  def initialize
8
10
  @obj=ManageEngine::APMObjectHolder.instance
9
11
  path = getLogsPath
@@ -11,20 +13,29 @@ module ManageEngine
11
13
  if Dir[path] == []
12
14
  Dir.mkdir(path)
13
15
  end
14
- path= path + '/apm.log'
16
+ @apmLogPath= path + '/apm.log'
15
17
  #puts "#{path}"
16
18
  # file = open(path, File::WRONLY | File::APPEND | File::CREAT)
17
- @apmlog = Logger.new(path, 10, 100 * 1024 * 1024)
18
- # @apmlog = Logger.new(file)
19
- @apmlog.level = Logger::INFO
20
- @apmlog.datetime_format = "%Y-%m-%d %H:%M:%S"
19
+ begin
20
+ @apmlog = Logger.new(@apmLogPath, 10, 5 * 1024 * 1024)
21
+ @apmlog.level = Logger::INFO
22
+ rescue Exception => e
23
+ puts "Unable to create/edit the log file #{@apmLogPath}. Writing agent logs to STDOUT.\nError: #{e.message}"
24
+ @apmlog = Logger.new(STDOUT)
25
+ @apmlog.level = Logger::WARN
26
+ end
27
+ # @apmlog = Logger.new(file)
28
+ @apmlog.datetime_format = "%Y-%m-%d %H:%M:%S"
21
29
  @apmlog.formatter = proc do |severity, datetime, progname, msg|
22
- "[#{datetime}|#{Process.pid}]:#{msg}\n"
30
+ "[#{datetime}|#{Process.pid}][#{severity}]:#{msg}\n"
23
31
  end
24
32
  @apmlog.debug("[LOGGER] APM Agent Logging Initialized")
25
33
 
26
34
  end
27
35
 
36
+ def getLogFilePath
37
+ return @apmLogPath
38
+ end
28
39
 
29
40
  def getLogsPath
30
41
  props = {}
@@ -53,7 +64,7 @@ module ManageEngine
53
64
  if props["apminsight.log.dir"]!=nil
54
65
  return props["apminsight.log.dir"]
55
66
  else
56
- return "./log"
67
+ return @obj.constants.conf_location+"log"
57
68
  end
58
69
 
59
70
  end
@@ -96,10 +107,8 @@ module ManageEngine
96
107
 
97
108
 
98
109
  def logException(msg,e)
99
- @apmlog.info( "#{msg} => #{e.message}")
100
- @apmlog.debug( "!!!!!!!!!!!!!!!!!!!!!!EXCEPTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!")
101
- @apmlog.debug( "Message : #{msg}\nTrace :\n#{e.backtrace}")
102
- @apmlog.debug( "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
110
+ @apmlog.warn( "#{msg} => #{e.message}")
111
+ @apmlog.warn( "Message : #{msg}\nTrace :\n#{e.backtrace}")
103
112
  end
104
113
 
105
114
  def close
@@ -6,8 +6,8 @@ module ManageEngine
6
6
  @obj = ManageEngine::APMObjectHolder.instance
7
7
  @apdex_threshold = 0
8
8
  end
9
- #trans Vs #[0-rspTime,1-min rt,2-max rt,3-cnt,4-apdx,5-stat,6-toler,7-frustating]
10
- #DBtrans Vs #[rspTime,min rt,max rt,cnt]
9
+ #trans Vs #[0-rspTime,1-min rt,2-max rt,3-cnt,4-apdx,5-stat,6-toler,7-frustating,8-error_count]
10
+ #DBtrans Vs #[rspTime,min rt,max rt,cnt,error_count]
11
11
  #trace
12
12
 
13
13
  def format d
@@ -95,34 +95,41 @@ module ManageEngine
95
95
  end
96
96
 
97
97
  def updateinstance
98
- ins_apdx = Array.new
99
- cnt = 0;
100
- rt = 0;
101
- s=0;
102
- t=0;
103
- f=0;
104
- min = -1;
105
- max = 0;
98
+ ins_apdx = [0,-1,-1,0,0,0,0,0,0]
99
+ logmetric = Hash.new
106
100
  @transaction.each do |key,value|
107
- rt = rt + value[0]
108
- if min == -1
109
- min = value[1]
110
- max = value[2]
111
- end
112
- if(value[1]<min)
113
- min = value[1]
114
- end
115
- if (value[2]>max)
116
- max = value[2]
101
+ apdexValue = value[0]
102
+ ins_apdx[0] += apdexValue[0]
103
+ if ins_apdx[1] == -1
104
+ ins_apdx[1] = apdexValue[1]
105
+ ins_apdx[2] = apdexValue[2]
106
+ else
107
+ if(apdexValue[1]<ins_apdx[1])
108
+ ins_apdx[1] = apdexValue[1]
109
+ end
110
+ if (apdexValue[2]>ins_apdx[2])
111
+ ins_apdx[2] = apdexValue[2]
112
+ end
117
113
  end
118
- cnt = cnt + value[3]
114
+ ins_apdx[3] += apdexValue[3]
119
115
 
120
- s = s + value[5]
121
- t = t + value[6]
122
- f = f + value[7]
116
+ ins_apdx[5] += apdexValue[5]
117
+ ins_apdx[6] += apdexValue[6]
118
+ ins_apdx[7] += apdexValue[7]
119
+ ins_apdx[8] += apdexValue[8]
120
+
121
+ exceptions = value[1][@obj.constants.mf_logmetric]
122
+ if (exceptions != nil)
123
+ exceptions.each do |name, count|
124
+ logmetric[name] = logmetric[name].to_i + count
125
+ end
126
+ end
127
+ end
128
+ if (ins_apdx[3] > 0)
129
+ ins_apdx[4] = (ins_apdx[5].to_f + (ins_apdx[6]/2).to_f).to_f/ins_apdx[3].to_f
130
+ ins_apdx[0] = ins_apdx[0].round(2)
123
131
  end
124
- apx = (s.to_f + (t/2).to_f).to_f/cnt.to_f
125
- @instance[":apdex"]=[rt.round(2),min,max,cnt,apx,s,t,f]
132
+ @instance[":apdex"]=[ins_apdx, {@obj.constants.mf_logmetric=>logmetric}]
126
133
  end
127
134
 
128
135
  def updatedbinstance
@@ -130,6 +137,7 @@ module ManageEngine
130
137
  rt = 0;
131
138
  min = -1;
132
139
  max = 0;
140
+ error_count = 0;
133
141
  if(@db.length>0)
134
142
  @db.each do |key,val|
135
143
  value = val["metrics"]
@@ -145,8 +153,9 @@ module ManageEngine
145
153
  max = value[2]
146
154
  end
147
155
  cnt = cnt + value[3]
156
+ error_count += value[4]
148
157
  end
149
- @dbinstance[":apdex"]=[rt.round(2),min,max,cnt]
158
+ @dbinstance[":apdex"]=[rt.round(2),min,max,cnt,error_count]
150
159
  end
151
160
  end
152
161
 
@@ -154,25 +163,61 @@ module ManageEngine
154
163
  begin
155
164
  pl = d["td"]
156
165
  dbl = d["db"]
166
+ exc = d["exception"]
157
167
 
158
168
  rt = pl["rt"].round(2)
159
- path = pl["path"]
160
- name = pl["name"]
161
-
162
- path = @obj.constants.mf_transaction + @obj.constants.mf_separator + path + " " +name
169
+ path = @obj.constants.mf_transaction + @obj.constants.mf_separator + pl["path"]
163
170
 
164
171
 
165
172
  apx_stat = nil
173
+ additionalInfo = nil
166
174
  if(@transaction.has_key?(path))
167
- apx_stat = @transaction[path]
175
+ apx_stat = @transaction[path][0]
176
+ additionalInfo = @transaction[path][1]
168
177
  else
178
+ if @transaction.length == @obj.config.metric_overflow_t
179
+ @obj.log.debug "Metricstore overflow. Current Size: #{@obj.config.metric_overflow_t} #{path}"
180
+ return
181
+ end
169
182
  apx_stat = Array.new
170
- apx_stat = [0,rt,rt,0,0,0,0,0]
183
+ apx_stat = [0,0,0,0,0,0,0,0,0]
184
+ additionalInfo = Hash.new
171
185
  end
172
- apx_stat = apxarray apx_stat,rt
173
- @transaction[path] = apx_stat
186
+
187
+ if (pl.has_key?("error"))
188
+ apx_stat[8] += 1
189
+ else
190
+ apx_stat = apxarray apx_stat,rt
191
+ end
192
+
193
+ if (exc != nil)
194
+ logmetric = additionalInfo[@obj.constants.mf_logmetric]
195
+ if (logmetric == nil)
196
+ additionalInfo[@obj.constants.mf_logmetric] = exc
197
+ else
198
+ exc.each do |name, count|
199
+ logmetric[name] = logmetric[name].to_i + count
200
+ end
201
+ end
202
+ end
203
+
204
+ @transaction[path] = [apx_stat, additionalInfo]
174
205
  if(dbl!=nil)
175
- updatedb dbl,path
206
+ if @db.length < @obj.config.dbmetric_overflow_t
207
+ updatedb dbl,path
208
+ elsif @db.length == @obj.config.dbmetric_overflow_t
209
+ @obj.log.debug "DB metric overflow. Current Size: #{@obj.config.dbmetric_overflow_t} #{path}"
210
+ #@obj.log.info "data = #{@db}"
211
+ of = Hash.new
212
+ stats = Array.new
213
+ stats = [0,0,0,0,0]
214
+ of["tpath"] = @obj.constants.mf_overflow
215
+ #of["tpath"] = @obj.constants.mf_transaction + @obj.constants.mf_separator + @obj.constants.mf_overflow #using this for testing purpose
216
+ of["path"] = @obj.constants.mf_db + @obj.constants.mf_separator + @obj.constants.mf_overflow + @obj.constants.mf_separator + "-" + @obj.constants.mf_separator
217
+ of["metrics"] = stats
218
+ @db[@obj.constants.mf_overflow]=of
219
+ #@obj.log.info "data updated = #{@db}"
220
+ end
176
221
  end
177
222
  rescue Exception=>e
178
223
  @obj.log.info "#{e.message}"
@@ -181,6 +226,7 @@ module ManageEngine
181
226
  # Apmagent::ApmLogger.instance.info "update transaction end"
182
227
  end
183
228
 
229
+ # Updates apdex score and increases statisfied, tolerating, frustrated count accordingly
184
230
  def apxarray apx_stat,rt
185
231
 
186
232
  # Apmagent::ApmLogger.instance.info "apxarray : start #{apx_stat}"
@@ -193,16 +239,19 @@ module ManageEngine
193
239
  apx_stat[6] = apx_stat[6] + 1
194
240
  end
195
241
 
196
- apx_stat[4] = (apx_stat[5].to_f + (apx_stat[6].to_f/2).to_f)/apx_stat[3].to_f
242
+ if (apx_stat[3] > 0)
243
+ apx_stat[4] = (apx_stat[5].to_f + (apx_stat[6].to_f/2).to_f)/apx_stat[3].to_f
244
+ end
197
245
  # Apmagent::ApmLogger.instance.info "apxarray : end #{apx_stat}"
198
246
  apx_stat
199
247
  end
200
248
 
249
+ # Updates resp time, min rt and max rt in apdex metric
201
250
  def updatert apx_stat,rt
202
251
  # Apmagent::ApmLogger.instance.info "updatert : start"
203
- apx_stat[3] = apx_stat[3] +1
252
+ apx_stat[3] = apx_stat[3] + 1
204
253
  apx_stat[0] = apx_stat[0] + rt
205
- if(rt < apx_stat[1])
254
+ if(apx_stat[1] == 0 || rt < apx_stat[1])
206
255
  apx_stat[1] = rt
207
256
  end
208
257
  if(rt > apx_stat[2])
@@ -211,7 +260,8 @@ module ManageEngine
211
260
  #Apmagent::ApmLogger.instance.info "updatert : end"
212
261
  apx_stat
213
262
  end
214
- #DBtrans Vs #[rspTime,min rt,max rt,cnt]
263
+
264
+ #DBtrans Vs #[rspTime,min rt,max rt,cnt,error_count]
215
265
  def updatedb dpl,tpath
216
266
  # Apmagent::ApmLogger.instance.info "updatedb : start"
217
267
  dpl.each do |pl|
@@ -227,37 +277,45 @@ module ManageEngine
227
277
  stat = val["metrics"]
228
278
  else
229
279
  val=Hash.new
280
+ val["tpath"] = tpath
281
+ val["path"] = dpath
230
282
  stat = Array.new
231
- stat = [rt,rt,rt,0]
283
+ stat = [0,rt,rt,0,0]
284
+ end
285
+ if (pl.has_key?("error"))
286
+ stat[4] += 1
287
+ else
288
+ stat = updatert stat,rt
232
289
  end
233
- stat = updatert stat,rt
234
- val["tpath"] = tpath
235
- val["path"] = dpath
236
290
  val["metrics"] = stat
237
291
  @db[path] = val
238
- updatedboperations rt, pl["operation"]
292
+ updatedboperations rt, pl["operation"], pl["error"]
239
293
  end
240
294
  #Apmagent::ApmLogger.instance.info "updatedb : end"
241
295
  end
242
296
 
243
- def updatedboperations rt,operation
244
- opstats = Array.new;
245
- #puts "#{operation} "
297
+ def updatedboperations rt, operation, isError
246
298
  if(@dboperations.has_key?(operation))
247
299
  opstats = @dboperations[operation]
248
300
  else
249
- opstats = [0.0,rt,rt,0]
250
- end
251
- opstats[0] = opstats[0] + rt
252
- if(rt<opstats[1])
253
- opstats[1] = rt
301
+ opstats = Array.new;
302
+ opstats = [0.0,rt,rt,0,0]
254
303
  end
255
- if (rt>opstats[2])
256
- opstats[2] = rt
257
- end
258
- opstats[3] = opstats[3] +1
304
+
305
+ if (isError)
306
+ opstats[4] += 1
307
+ else
308
+ opstats[0] = opstats[0] + rt
309
+ if(rt<opstats[1])
310
+ opstats[1] = rt
311
+ end
312
+ if (rt>opstats[2])
313
+ opstats[2] = rt
314
+ end
315
+ opstats[3] = opstats[3] +1
316
+ end
259
317
  @dboperations[operation]=opstats
260
318
  end
261
319
 
262
- end
263
- end
320
+ end#class
321
+ end#module