site24x7_apminsight 1.0

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.
@@ -0,0 +1,109 @@
1
+
2
+ require "logger"
3
+
4
+ module ManageEngine
5
+ class APMLogger
6
+ @apmlog=nil;
7
+ def initialize
8
+ @obj=ManageEngine::APMObjectHolder.instance
9
+ path = getLogsPath
10
+ #puts "#{path}"
11
+ if Dir[path] == []
12
+ Dir.mkdir(path)
13
+ end
14
+ path= path + '/apm.log'
15
+ #puts "#{path}"
16
+ # 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"
21
+ @apmlog.formatter = proc do |severity, datetime, progname, msg|
22
+ "[#{datetime}|#{Process.pid}]:#{msg}\n"
23
+ end
24
+ @apmlog.debug("[LOGGER] APM Agent Logging Initialized")
25
+
26
+ end
27
+
28
+
29
+ def getLogsPath
30
+ props = {}
31
+ begin
32
+ if FileTest.exists?(@obj.constants.apm_conf)
33
+ propsFile=File.open(@obj.constants.apm_conf, 'r')
34
+ propsFile.read.each_line do |line|
35
+ line.strip!
36
+ if (line[0] != ?# and line[0] != ?=)
37
+ i = line.index('=')
38
+ if (i)
39
+ props[line[0..i - 1].strip] = line[i + 1..-1].strip
40
+ else
41
+ props[line] = ''
42
+ end
43
+ end
44
+ end
45
+ else
46
+ puts "ManageEngine Ruby Agent Configuration File Not exist in #{@obj.constants.apm_conf}.\n Duplicate file will be available in <Gems Folder>/apm-agent/lib/config "
47
+ end
48
+ rescue Exception=>e
49
+ puts "Problem in Reading Property File : \n #{e.message} \n #{e.backtrace}"
50
+ ensure
51
+ #
52
+ end
53
+ if props["apminsight.log.dir"]!=nil
54
+ return props["apminsight.log.dir"]
55
+ else
56
+ return "./log"
57
+ end
58
+
59
+ end
60
+
61
+ def setLevel level
62
+ level = level.upcase
63
+ case level.upcase
64
+ when "INFO" then @apmlog.level = Logger::INFO
65
+ when "DEBUG" then @apmlog.level = Logger::DEBUG
66
+ when "WARN" then @apmlog.level = Logger::WARN
67
+ when "ERROR" then @apmlog.level = Logger::ERROR
68
+ when "FATAL" then @apmlog.level = Logger::FATAL
69
+ when "FINE" then @apmlog.level = Logger::DEBUG
70
+ when "SEVERE" then @apmlog.level = Logger::ERROR
71
+ when "WARNING" then @apmlog.level = Logger::WARN
72
+ else
73
+ @apmlog.level = Logger::DEBUG
74
+ end
75
+ end
76
+
77
+ def info(msg)
78
+ @apmlog.info(msg)
79
+ end
80
+
81
+ def debug(msg)
82
+ @apmlog.debug(msg)
83
+ end
84
+
85
+ def warn(msg)
86
+ @apmlog.warn(msg)
87
+ end
88
+
89
+ def error(msg)
90
+ @apmlog.error(msg)
91
+ end
92
+
93
+ def fatal(msg)
94
+ @apmlog.fatal(msg)
95
+ end
96
+
97
+
98
+ 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( "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
103
+ end
104
+
105
+ def close
106
+ @apmlog.close
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,30 @@
1
+ require 'agent/am_objectholder'
2
+
3
+
4
+ module ManageEngine
5
+ class APMMetricsCollector
6
+ def initialize
7
+ @obj = ManageEngine::APMObjectHolder.instance
8
+ end
9
+
10
+ def getTransactions
11
+ @obj.store.metrics_dup
12
+ end
13
+
14
+ def updateTransaction( id ,values)
15
+ if(@obj.store.metrics.has_key?(id))
16
+ temp = @obj.store.metrics[id]
17
+ temp.push(values);
18
+ else
19
+ temp = Array.new
20
+ temp.push(values);
21
+ @obj.store.metrics[id]=temp
22
+ end
23
+ end
24
+
25
+ def transactionmetricskeys
26
+ @obj.store.keys
27
+ end
28
+
29
+ end#class
30
+ end#module
@@ -0,0 +1,277 @@
1
+ require 'agent/am_objectholder'
2
+ module ManageEngine
3
+ class APMMetricsFormatter
4
+
5
+ def intialize
6
+ @obj = ManageEngine::APMObjectHolder.instance
7
+ @apdex_threshold = 0
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]
11
+ #trace
12
+
13
+ def format d
14
+ result = Array.new
15
+ @obj = ManageEngine::APMObjectHolder.instance
16
+ begin
17
+ @apdex_threshold = @obj.config.apdex_t * 1000
18
+ #@obj.log.info "[FORMAT]"
19
+ @transaction = Hash.new
20
+ @db = Hash.new
21
+ @instance = Hash.new
22
+ @dbinstance = Hash.new
23
+ @dboperations = Hash.new
24
+ @keystoremove = Array.new
25
+ d.each do |key,value|
26
+ @keystoremove.push(key)
27
+ updatetransaction value
28
+ end
29
+ updateinstance
30
+ updatedbinstance
31
+
32
+ @transaction.each do |key,value|
33
+ res = Hash.new
34
+ res[@obj.constants.mf_namespace] = key
35
+ res[@obj.constants.mf_name] = @obj.constants.mf_apdex
36
+ valArr= Array.new
37
+ valArr[0] =res
38
+ valArr[1] =value
39
+ result.push(valArr)
40
+ end
41
+
42
+ @db.each do |key,value|
43
+ #puts "#{key} == #{value}"
44
+ res = Hash.new
45
+ res[@obj.constants.mf_namespace] = value["tpath"]
46
+ res[@obj.constants.mf_name] = value["path"]
47
+ valArr= Array.new
48
+ valArr[0] =res
49
+ valArr[1] =value["metrics"]
50
+ result.push(valArr)
51
+ end
52
+ @instance.each do |key,value|
53
+ res = Hash.new
54
+ res[@obj.constants.mf_namespace] = ""
55
+ res[@obj.constants.mf_name] = @obj.constants.mf_apdex
56
+ valArr= Array.new
57
+ valArr[0] =res
58
+ valArr[1] =value
59
+ result.push(valArr)
60
+ end
61
+ @dbinstance.each do |key,value|
62
+ res = Hash.new
63
+ res[@obj.constants.mf_namespace] = ""
64
+ res[@obj.constants.mf_name] = @obj.constants.mf_db + @obj.constants.mf_separator + @obj.constants.mf_all + @obj.constants.mf_separator + @obj.constants.mf_all + @obj.constants.mf_separator + @obj.config.app_db # "db/all/all/dummydb"
65
+ valArr= Array.new
66
+ valArr[0] =res
67
+ valArr[1] =value
68
+ result.push(valArr)
69
+ end
70
+ @dboperations.each do |key,value|
71
+ ind = @obj.config.db_operations.index(key)
72
+ if (ind!=nil)
73
+ res = Hash.new
74
+ res[@obj.constants.mf_namespace] = ""
75
+ res[@obj.constants.mf_name] = @obj.constants.mf_db + @obj.constants.mf_separator + "#{key}" + @obj.constants.mf_separator + @obj.constants.mf_all + @obj.constants.mf_separator + @obj.config.app_db # "db/"+key+"/all/dummydb"
76
+ valArr= Array.new
77
+ valArr[0] =res
78
+ valArr[1] =value
79
+ result.push(valArr)
80
+ end
81
+ end
82
+
83
+ #@obj.log.info "[FORMAT] COMPLETED"
84
+ rescue Exception=>e
85
+ @obj.log.logException "[FORMAT]#{e.message}",e
86
+ end
87
+ @transaction.clear
88
+ @db.clear
89
+ @instance.clear
90
+ result
91
+ end
92
+
93
+ def keysToRemove
94
+ @keystoremove
95
+ end
96
+
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;
106
+ @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]
117
+ end
118
+ cnt = cnt + value[3]
119
+
120
+ s = s + value[5]
121
+ t = t + value[6]
122
+ f = f + value[7]
123
+ 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]
126
+ end
127
+
128
+ def updatedbinstance
129
+ cnt = 0;
130
+ rt = 0;
131
+ min = -1;
132
+ max = 0;
133
+ if(@db.length>0)
134
+ @db.each do |key,val|
135
+ value = val["metrics"]
136
+ rt = rt + value[0]
137
+ if min == -1
138
+ min = value[1]
139
+ max = value[2]
140
+ end
141
+ if(value[1]<min)
142
+ min = value[1]
143
+ end
144
+ if (value[2]>max)
145
+ max = value[2]
146
+ end
147
+ cnt = cnt + value[3]
148
+ end
149
+ @dbinstance[":apdex"]=[rt.round(2),min,max,cnt]
150
+ end
151
+ end
152
+
153
+ def updatetransaction d
154
+ begin
155
+ pl = d["td"]
156
+ dbl = d["db"]
157
+
158
+ 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
163
+
164
+
165
+ apx_stat = nil
166
+ if(@transaction.has_key?(path))
167
+ apx_stat = @transaction[path]
168
+ else
169
+ apx_stat = Array.new
170
+ apx_stat = [0,rt,rt,0,0,0,0,0]
171
+ end
172
+ apx_stat = apxarray apx_stat,rt
173
+ @transaction[path] = apx_stat
174
+ if(dbl!=nil)
175
+ if @db.length < @obj.config.metric_overflow_t
176
+ updatedb dbl,path
177
+ elsif @db.length == @obj.config.metric_overflow_t
178
+ #@obj.log.info "metric overflow #{@db.length} for threshold #{@obj.config.metric_overflow_t}"
179
+ #@obj.log.info "data = #{@db}"
180
+ of = Hash.new
181
+ stats = Array.new
182
+ stats = [0,0,0,0]
183
+ of["tpath"] = @obj.constants.mf_overflow
184
+ #of["tpath"] = @obj.constants.mf_transaction + @obj.constants.mf_separator + @obj.constants.mf_overflow #using this for testing purpose
185
+ of["path"] = @obj.constants.mf_db + @obj.constants.mf_separator + @obj.constants.mf_overflow + @obj.constants.mf_separator + "-" + @obj.constants.mf_separator
186
+ of["metrics"] = stats
187
+ @db[@obj.constants.mf_overflow]=of
188
+ #@obj.log.info "data updated = #{@db}"
189
+ end
190
+ end
191
+ rescue Exception=>e
192
+ @obj.log.info "#{e.message}"
193
+ @obj.log.logException "[Format] [ updatetransaction ] #{e.message}",e
194
+ end
195
+ # Apmagent::ApmLogger.instance.info "update transaction end"
196
+ end
197
+
198
+ def apxarray apx_stat,rt
199
+
200
+ # Apmagent::ApmLogger.instance.info "apxarray : start #{apx_stat}"
201
+ apx_stat = updatert apx_stat,rt
202
+ if rt <= @apdex_threshold
203
+ apx_stat[5] = apx_stat[5] + 1
204
+ elsif rt > (4 * @apdex_threshold)
205
+ apx_stat[7] = apx_stat[7] + 1
206
+ else
207
+ apx_stat[6] = apx_stat[6] + 1
208
+ end
209
+
210
+ apx_stat[4] = (apx_stat[5].to_f + (apx_stat[6].to_f/2).to_f)/apx_stat[3].to_f
211
+ # Apmagent::ApmLogger.instance.info "apxarray : end #{apx_stat}"
212
+ apx_stat
213
+ end
214
+
215
+ def updatert apx_stat,rt
216
+ # Apmagent::ApmLogger.instance.info "updatert : start"
217
+ apx_stat[3] = apx_stat[3] +1
218
+ apx_stat[0] = apx_stat[0] + rt
219
+ if(rt < apx_stat[1])
220
+ apx_stat[1] = rt
221
+ end
222
+ if(rt > apx_stat[2])
223
+ apx_stat[2] = rt
224
+ end
225
+ #Apmagent::ApmLogger.instance.info "updatert : end"
226
+ apx_stat
227
+ end
228
+ #DBtrans Vs #[rspTime,min rt,max rt,cnt]
229
+ def updatedb dpl,tpath
230
+ # Apmagent::ApmLogger.instance.info "updatedb : start"
231
+ dpl.each do |pl|
232
+ rt = pl["rt"].round(2)
233
+ path = pl["sql-strip"]
234
+ dpath = @obj.constants.mf_db + @obj.constants.mf_separator + path
235
+ path = tpath + @obj.constants.mf_separator + dpath
236
+ sql = pl["sql"]
237
+ stat = nil
238
+ val = nil
239
+ if(@db.has_key?(path))
240
+ val = @db[path]
241
+ stat = val["metrics"]
242
+ else
243
+ val=Hash.new
244
+ stat = Array.new
245
+ stat = [rt,rt,rt,0]
246
+ end
247
+ stat = updatert stat,rt
248
+ val["tpath"] = tpath
249
+ val["path"] = dpath
250
+ val["metrics"] = stat
251
+ @db[path] = val
252
+ updatedboperations rt, pl["operation"]
253
+ end
254
+ #Apmagent::ApmLogger.instance.info "updatedb : end"
255
+ end
256
+
257
+ def updatedboperations rt,operation
258
+ opstats = Array.new;
259
+ #puts "#{operation} "
260
+ if(@dboperations.has_key?(operation))
261
+ opstats = @dboperations[operation]
262
+ else
263
+ opstats = [0.0,rt,rt,0]
264
+ end
265
+ opstats[0] = opstats[0] + rt
266
+ if(rt<opstats[1])
267
+ opstats[1] = rt
268
+ end
269
+ if (rt>opstats[2])
270
+ opstats[2] = rt
271
+ end
272
+ opstats[3] = opstats[3] +1
273
+ @dboperations[operation]=opstats
274
+ end
275
+
276
+ end
277
+ end