oneapm_rpm 1.3.3 → 1.3.4.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/one_apm/collector/samplers/cpu_sampler.rb +13 -5
- data/lib/one_apm/collector/samplers/memory_sampler.rb +19 -125
- data/lib/one_apm/collector/support/jruby_poller.rb +22 -0
- data/lib/one_apm/collector/support/proc_poller.rb +63 -0
- data/lib/one_apm/collector/support/sampler_collection.rb +17 -0
- data/lib/one_apm/collector/support/shell_poller.rb +58 -0
- data/lib/one_apm/rack/developer_mode.rb +5 -2
- data/lib/one_apm/version.rb +3 -2
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MmE0NDFhMTgyYjQxZDg5NWU0NTAzZTQyMDA1ZjBjMDRiMjY0NWE1OQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MmE1ZjcwYTUyZTc4NWE0ZjYzNWU2YjEyYTIyZTI4M2UwYzY2MTlmOA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MjMzYWExYmFlODhkZDE1YjBiMDZlYjYxNmRmODQ5NGNkZTAyMzBhMjRlNGEz
|
10
|
+
NzAyODFiY2NjNjUzZmU4YmU4Nzg4MjdjNTFlM2NhZjAxNTI3ZTAzZWMzZjU4
|
11
|
+
YzVjYmJkMjk2YmQyNmRiZThjMGMyNjdiMWUyYzczMTJjMmI0NTk=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MjdjZGQwNjMzZmFiNGI3YmIzYzA1NWY2ZWRhYzZjMjFkMGJkNWQ2YTM1Nzhh
|
14
|
+
NDI2YWVjZjU1YjgzMWViOThjZjk4YTU5MTNhNGRkMzQ3NTRiYmFhZTMzYmJj
|
15
|
+
MTk0NjdjNzdhYWFlNmUzODFlOGU3YzE0Y2UxYWM5NjRjYzAyNTA=
|
@@ -15,14 +15,15 @@ module OneApm
|
|
15
15
|
poll
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
|
20
|
-
defined?(JRuby) ? (JRUBY_VERSION >= '1.7.0') : true
|
18
|
+
def set_poller poller
|
19
|
+
@poller = poller
|
21
20
|
end
|
22
|
-
|
21
|
+
|
23
22
|
def poll
|
24
23
|
now = Time.now
|
24
|
+
@poller.pid = Process.pid if @poller
|
25
25
|
t = Process.times
|
26
|
+
|
26
27
|
if @last_time
|
27
28
|
elapsed = now - @last_time
|
28
29
|
return if elapsed < 1 # Causing some kind of math underflow
|
@@ -35,14 +36,21 @@ module OneApm
|
|
35
36
|
OneApm::Manager.record_metric("CPU/System/Utilization", systemtime / (elapsed * @processor_count))
|
36
37
|
end
|
37
38
|
if usertime >= 0
|
39
|
+
cpu_utilization = @poller ? @poller.cpu_utilization : (usertime / (elapsed * @processor_count))
|
38
40
|
OneApm::Manager.record_metric("CPU/User Time", usertime)
|
39
|
-
OneApm::Manager.record_metric("CPU/User/Utilization",
|
41
|
+
OneApm::Manager.record_metric("CPU/User/Utilization", cpu_utilization)
|
40
42
|
end
|
41
43
|
end
|
42
44
|
@last_utime = t.utime
|
43
45
|
@last_stime = t.stime
|
44
46
|
@last_time = now
|
45
47
|
end
|
48
|
+
|
49
|
+
def self.supported_on_this_platform?
|
50
|
+
# Process.times on JRuby < 1.7.0 reports wall clock elapsed time, not actual cpu time used
|
51
|
+
defined?(JRuby) ? (JRUBY_VERSION >= '1.7.0') : true
|
52
|
+
end
|
53
|
+
|
46
54
|
end
|
47
55
|
end
|
48
56
|
end
|
@@ -9,43 +9,8 @@ module OneApm
|
|
9
9
|
class MemorySampler < OneApm::Collector::Sampler
|
10
10
|
named :memory
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
def initialize
|
15
|
-
if defined? JRuby
|
16
|
-
@sampler = JavaHeapSampler.new
|
17
|
-
elsif platform =~ /linux/
|
18
|
-
@sampler = ProcStatus.new
|
19
|
-
if !@sampler.can_run?
|
20
|
-
OneApm::Manager.logger.debug "Error attempting to use /proc/#{$$}/status file for reading memory. Using ps command instead."
|
21
|
-
@sampler = ShellPS.new("ps -o rsz")
|
22
|
-
else
|
23
|
-
OneApm::Manager.logger.debug "Using /proc/#{$$}/status for reading process memory."
|
24
|
-
end
|
25
|
-
elsif platform =~ /darwin9/ # 10.5
|
26
|
-
@sampler = ShellPS.new("ps -o rsz")
|
27
|
-
elsif platform =~ /darwin1\d+/ # >= 10.6
|
28
|
-
@sampler = ShellPS.new("ps -o rss")
|
29
|
-
elsif platform =~ /freebsd/
|
30
|
-
@sampler = ShellPS.new("ps -o rss")
|
31
|
-
elsif platform =~ /solaris/
|
32
|
-
@sampler = ShellPS.new("/usr/bin/ps -o rss -p")
|
33
|
-
end
|
34
|
-
|
35
|
-
raise Unsupported, "Unsupported platform for getting memory: #{platform}" if @sampler.nil?
|
36
|
-
raise Unsupported, "Unable to run #{@sampler}" unless @sampler.can_run?
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.supported_on_this_platform?
|
40
|
-
defined?(JRuby) or platform =~ /linux|darwin|freebsd|solaris/
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.platform
|
44
|
-
if RUBY_PLATFORM =~ /java/
|
45
|
-
%x[uname -s].downcase
|
46
|
-
else
|
47
|
-
RUBY_PLATFORM.downcase
|
48
|
-
end
|
12
|
+
def set_poller poller
|
13
|
+
@poller = poller
|
49
14
|
end
|
50
15
|
|
51
16
|
def platform
|
@@ -53,108 +18,37 @@ module OneApm
|
|
53
18
|
end
|
54
19
|
|
55
20
|
def poll
|
56
|
-
sample =
|
21
|
+
sample = get_sample
|
57
22
|
if sample
|
58
23
|
OneApm::Manager.record_metric("Memory/Used", sample)
|
59
24
|
end
|
60
25
|
end
|
61
26
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
def pids_cmd
|
69
|
-
`ps -o pid,pgid -e | grep #{pgrp_id}`
|
70
|
-
end
|
71
|
-
|
72
|
-
def pids
|
73
|
-
@pids = pids_cmd.split(/\s+/).uniq rescue [Process.pid]
|
74
|
-
@pids = [Process.pid] if @pids.empty?
|
75
|
-
@pids
|
76
|
-
end
|
77
|
-
|
78
|
-
def can_run?
|
79
|
-
return false if @broken
|
80
|
-
m = get_memory rescue nil
|
81
|
-
m && m > 0
|
82
|
-
end
|
83
|
-
|
84
|
-
def get_memory
|
85
|
-
pids.inject(0.0){|m, pid| m + get_memory_by_pid(pid)}
|
86
|
-
end
|
87
|
-
|
88
|
-
def get_sample
|
89
|
-
return nil if @broken
|
90
|
-
begin
|
91
|
-
m = get_memory
|
92
|
-
if m.nil?
|
93
|
-
OneApm::Manager.logger.warn "Unable to get the resident memory for process #{$$}. Disabling memory sampler."
|
94
|
-
@broken = true
|
95
|
-
end
|
96
|
-
return m
|
97
|
-
rescue => e
|
98
|
-
OneApm::Manager.logger.warn "Unable to get the resident memory for process #{$$}. Disabling memory sampler.", e
|
99
|
-
@broken = true
|
100
|
-
return nil
|
27
|
+
def get_sample
|
28
|
+
begin
|
29
|
+
m = @poller.memory
|
30
|
+
if m.nil?
|
31
|
+
OneApm::Manager.logger.warn "Unable to get the resident memory for process #{$$}. Disabling memory sampler."
|
101
32
|
end
|
33
|
+
return m
|
34
|
+
rescue => e
|
35
|
+
OneApm::Manager.logger.warn "Unable to get the resident memory for process #{$$}. Disabling memory sampler.", e
|
36
|
+
return nil
|
102
37
|
end
|
103
|
-
|
104
38
|
end
|
105
39
|
|
106
|
-
|
107
|
-
|
108
|
-
def get_memory
|
109
|
-
raise "Can't sample Java heap unless running in JRuby" unless defined? JRuby
|
110
|
-
java.lang.Runtime.getRuntime.totalMemory / (1024 * 1024).to_f rescue nil
|
111
|
-
end
|
112
|
-
|
113
|
-
def to_s
|
114
|
-
"JRuby Java heap sampler"
|
115
|
-
end
|
116
|
-
|
40
|
+
def self.supported_on_this_platform?
|
41
|
+
defined?(::JRuby) or platform =~ /linux|darwin|freebsd|solaris/
|
117
42
|
end
|
118
43
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
end
|
125
|
-
|
126
|
-
def get_memory_by_pid pid
|
127
|
-
process = pid
|
128
|
-
memory = `#{@command} #{process}`.split("\n")[1].to_f / 1024.0 rescue nil
|
129
|
-
raise "Faulty command: `#{@command} #{process}`" if memory.nil? || memory < 0
|
130
|
-
memory
|
131
|
-
end
|
132
|
-
|
133
|
-
def to_s
|
134
|
-
"shell command sampler: #{@command}"
|
44
|
+
def self.platform
|
45
|
+
if RUBY_PLATFORM =~ /java/
|
46
|
+
%x[uname -s].downcase
|
47
|
+
else
|
48
|
+
RUBY_PLATFORM.downcase
|
135
49
|
end
|
136
|
-
|
137
50
|
end
|
138
51
|
|
139
|
-
class ProcStatus < Base
|
140
|
-
|
141
|
-
def get_memory_by_pid pid
|
142
|
-
proc_status = File.open(proc_status_file(pid), "r") {|f| f.read_nonblock(4096).strip }
|
143
|
-
if proc_status =~ /RSS:\s*(\d+) kB/i
|
144
|
-
return $1.to_f / 1024.0
|
145
|
-
end
|
146
|
-
raise "Unable to find RSS in #{proc_status_file}"
|
147
|
-
end
|
148
|
-
|
149
|
-
def proc_status_file pid=Process.pid
|
150
|
-
"/proc/#{pid}/status"
|
151
|
-
end
|
152
|
-
|
153
|
-
def to_s
|
154
|
-
"proc status file sampler: #{proc_status_file}"
|
155
|
-
end
|
156
|
-
|
157
|
-
end
|
158
52
|
end
|
159
53
|
end
|
160
54
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'one_apm/collector/support/shell_poller'
|
3
|
+
|
4
|
+
module OneApm
|
5
|
+
module Collector
|
6
|
+
class JrubyPoller < OneApm::Collector::ShellPoller
|
7
|
+
|
8
|
+
def self.enable?
|
9
|
+
defined?(::JRuby)
|
10
|
+
end
|
11
|
+
|
12
|
+
def memory
|
13
|
+
java.lang.Runtime.getRuntime.totalMemory / (1024 * 1024).to_f rescue nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
"JrubyPoller from: java.lang.Runtime.getRuntime.totalMemory"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'one_apm/collector/support/shell_poller'
|
3
|
+
|
4
|
+
module OneApm
|
5
|
+
module Collector
|
6
|
+
class ProcPoller < OneApm::Collector::ShellPoller
|
7
|
+
|
8
|
+
UPTIME_PATH = '/proc/uptime'.freeze
|
9
|
+
|
10
|
+
def self.enable?
|
11
|
+
::RUBY_PLATFORM.downcase =~ /linux/
|
12
|
+
end
|
13
|
+
|
14
|
+
def poll_memory
|
15
|
+
return 0.0 unless File.exist?(proc_status_file)
|
16
|
+
stats[:rss].to_f * OneApm::Collector::ShellPoller.kb_page_size / 1024.0
|
17
|
+
end
|
18
|
+
|
19
|
+
def cpu_utilization
|
20
|
+
@pid = Process.pid
|
21
|
+
stat = stats
|
22
|
+
total_time = stat[:utime].to_f + stat[:stime].to_f # in jiffies
|
23
|
+
seconds = uptime - stat[:starttime].to_f / 100
|
24
|
+
return 0.0 if seconds <= 0.0
|
25
|
+
((total_time * 1000.0 / 100.0) / seconds) / 10.0 / 100.0
|
26
|
+
rescue => e
|
27
|
+
OneApm::Manager.logger.warn "Fetch cpu usage error: #{e.message}"
|
28
|
+
0.0
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_s
|
32
|
+
"ProcPoller from: #{proc_status_file}"
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
# in seconds
|
37
|
+
def uptime
|
38
|
+
File.read(UPTIME_PATH).split[0].to_f
|
39
|
+
end
|
40
|
+
|
41
|
+
def proc_status_file
|
42
|
+
"/proc/#{pid}/stat"
|
43
|
+
end
|
44
|
+
|
45
|
+
def stats
|
46
|
+
stat = {}
|
47
|
+
stat[:pid], stat[:comm], stat[:state], stat[:ppid], stat[:pgrp],
|
48
|
+
stat[:session], stat[:tty_nr], stat[:tpgid], stat[:flags],
|
49
|
+
stat[:minflt], stat[:cminflt], stat[:majflt], stat[:cmajflt],
|
50
|
+
stat[:utime], stat[:stime], stat[:cutime], stat[:cstime],
|
51
|
+
stat[:priority], stat[:nice], _, stat[:itrealvalue],
|
52
|
+
stat[:starttime], stat[:vsize], stat[:rss], stat[:rlim],
|
53
|
+
stat[:startcode], stat[:endcode], stat[:startstack], stat[:kstkesp],
|
54
|
+
stat[:kstkeip], stat[:signal], stat[:blocked], stat[:sigignore],
|
55
|
+
stat[:sigcatch], stat[:wchan], stat[:nswap], stat[:cnswap],
|
56
|
+
stat[:exit_signal], stat[:processor], stat[:rt_priority],
|
57
|
+
stat[:policy] = File.open(proc_status_file, "r") {|f| f.read_nonblock(4096).strip }.scan(/\(.*?\)|\w+/)
|
58
|
+
stat
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -1,4 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require 'one_apm/collector/support/shell_poller'
|
3
|
+
require 'one_apm/collector/support/proc_poller'
|
4
|
+
require 'one_apm/collector/support/jruby_poller'
|
2
5
|
|
3
6
|
module OneApm
|
4
7
|
module Collector
|
@@ -47,6 +50,7 @@ module OneApm
|
|
47
50
|
if supported && enabled && !sampler_class_registered?(sampler_class)
|
48
51
|
sampler = sampler_class.new
|
49
52
|
sampler.setup_events(@event_listener) if sampler.respond_to?(:setup_events)
|
53
|
+
sampler.set_poller(poller) if sampler.respond_to?(:set_poller)
|
50
54
|
@samplers << sampler
|
51
55
|
OneApm::Manager.logger.debug("Registered #{sampler_class.name} for harvest time sampling.")
|
52
56
|
else
|
@@ -57,6 +61,19 @@ module OneApm
|
|
57
61
|
rescue => e
|
58
62
|
OneApm::Manager.logger.error("Error registering sampler:", e)
|
59
63
|
end
|
64
|
+
|
65
|
+
def poller
|
66
|
+
@pller ||= begin
|
67
|
+
if OneApm::Collector::JrubyPoller.enable?
|
68
|
+
OneApm::Collector::JrubyPoller.new
|
69
|
+
elsif OneApm::Collector::ProcPoller.enable?
|
70
|
+
OneApm::Collector::ProcPoller.new
|
71
|
+
else
|
72
|
+
OneApm::Collector::ShellPoller.new
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
60
77
|
end
|
61
78
|
end
|
62
79
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module OneApm
|
4
|
+
module Collector
|
5
|
+
class ShellPoller
|
6
|
+
|
7
|
+
attr_accessor :pid
|
8
|
+
|
9
|
+
def memory
|
10
|
+
pids.inject(0.0){|m, pid| m + get_memory_by_pid(pid) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def cpu_utilization
|
14
|
+
@pid = Process.pid
|
15
|
+
ps_float('%cpu') / 100.0
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
"ShellPoller from: ps -p #{pid}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.kb_page_size
|
23
|
+
@size ||= `getconf PAGE_SIZE`.to_f / 1024.0 rescue 4.0
|
24
|
+
end
|
25
|
+
|
26
|
+
protected
|
27
|
+
|
28
|
+
def pgrp_id
|
29
|
+
Process.getpgrp
|
30
|
+
end
|
31
|
+
|
32
|
+
def pids_cmd
|
33
|
+
`ps -o pid,pgid -e | grep -w "#{pgrp_id}"`
|
34
|
+
end
|
35
|
+
|
36
|
+
def pids
|
37
|
+
@pids = pids_cmd.split(/\s+/).uniq rescue [Process.pid.to_s]
|
38
|
+
@pids = [Process.pid.to_s] if @pids.empty?
|
39
|
+
@pids
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_memory_by_pid pid
|
43
|
+
return 0.0 if pid.empty?
|
44
|
+
@pid = pid
|
45
|
+
poll_memory rescue 0.0
|
46
|
+
end
|
47
|
+
|
48
|
+
def poll_memory
|
49
|
+
ps_float('rss') / 1024.0
|
50
|
+
end
|
51
|
+
|
52
|
+
def ps_float keyword
|
53
|
+
`ps -o #{keyword}= -p #{pid}`.to_f
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -13,6 +13,7 @@ require 'one_apm/transaction/transaction_sample'
|
|
13
13
|
require 'one_apm/transaction/transaction_analysis'
|
14
14
|
|
15
15
|
require 'one_apm/rack/developer_mode/helper'
|
16
|
+
require 'one_apm/collector/support/shell_poller'
|
16
17
|
|
17
18
|
module OneApm
|
18
19
|
module Rack
|
@@ -291,7 +292,7 @@ module OneApm
|
|
291
292
|
ERB.new(File.read(File.join(VIEW_PATH, 'oneapm', view.to_s + '.html.erb')), nil, nil, 'frobnitz').result(binding)
|
292
293
|
end
|
293
294
|
|
294
|
-
def content_tag(tag, contents, opts={})
|
295
|
+
def content_tag(tag, contents, opts={})
|
295
296
|
opt_values = opts.map {|k, v| "#{k}=\"#{v}\"" }.join(' ')
|
296
297
|
"<#{tag} #{opt_values}>#{contents}</#{tag}>"
|
297
298
|
end
|
@@ -358,7 +359,9 @@ module OneApm
|
|
358
359
|
|
359
360
|
def current_memory_used
|
360
361
|
@memory_sampler ||= OneApm::Collector::Samplers::MemorySampler.new
|
361
|
-
@
|
362
|
+
@shell_poller ||= OneApm::Collector::ShellPoller.new
|
363
|
+
@memory_sampler.set_poller(@shell_poller)
|
364
|
+
@memory_sampler.get_sample
|
362
365
|
end
|
363
366
|
|
364
367
|
end
|
data/lib/one_apm/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oneapm_rpm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.4.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- oneapm
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-12-
|
11
|
+
date: 2015-12-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -295,7 +295,10 @@ files:
|
|
295
295
|
- lib/one_apm/collector/stats_engine/metric_stats.rb
|
296
296
|
- lib/one_apm/collector/stats_engine/stats_hash.rb
|
297
297
|
- lib/one_apm/collector/support/forked_process_service.rb
|
298
|
+
- lib/one_apm/collector/support/jruby_poller.rb
|
299
|
+
- lib/one_apm/collector/support/proc_poller.rb
|
298
300
|
- lib/one_apm/collector/support/sampler_collection.rb
|
301
|
+
- lib/one_apm/collector/support/shell_poller.rb
|
299
302
|
- lib/one_apm/configuration.rb
|
300
303
|
- lib/one_apm/configuration/default_source.rb
|
301
304
|
- lib/one_apm/configuration/environment_source.rb
|