oneapm_rpm 1.3.3 → 1.3.4.rc1
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.
- 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
|