server_metrics 1.2.8 → 1.2.9.1
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/CHANGELOG.md +13 -1
- data/lib/server_metrics/collectors/cpu.rb +1 -1
- data/lib/server_metrics/collectors/disk.rb +38 -18
- data/lib/server_metrics/collectors/memory.rb +3 -1
- data/lib/server_metrics/collectors/network.rb +1 -1
- data/lib/server_metrics/lib/proctable_lite.rb +4 -2
- data/lib/server_metrics/system_info.rb +5 -0
- data/lib/server_metrics/version.rb +1 -1
- metadata +38 -22
- checksums.yaml +0 -7
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
# 1.2.9.1
|
2
|
+
|
3
|
+
* Ruby 1.8.7 fix
|
4
|
+
|
5
|
+
## 1.2.9
|
6
|
+
|
7
|
+
* Add support for dockerized metric gathering
|
8
|
+
|
9
|
+
## 1.2.8
|
10
|
+
|
11
|
+
* compatibility with Ruby 1.8.5 and 1.8.6
|
12
|
+
|
1
13
|
## 1.2.7
|
2
14
|
|
3
15
|
* Revert vz changes from 1.2.6
|
@@ -89,4 +101,4 @@ Performance related:
|
|
89
101
|
|
90
102
|
## 0.0.8.3
|
91
103
|
|
92
|
-
* Fall back to assumption of 100 jiffies/sec if /proc/timer_list isn't available
|
104
|
+
* Fall back to assumption of 100 jiffies/sec if /proc/timer_list isn't available
|
@@ -46,7 +46,7 @@ class ServerMetrics::Cpu < ServerMetrics::Collector
|
|
46
46
|
def self.fetch
|
47
47
|
output = nil
|
48
48
|
begin
|
49
|
-
output = File.read("/
|
49
|
+
output = File.read("#{ServerMetrics::SystemInfo.proc_dir}/stat")
|
50
50
|
rescue Errno::ENOENT
|
51
51
|
# No such file or directory - /proc/stat
|
52
52
|
# /proc/stat doesn't exist on this system.
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "server_metrics/system_info"
|
2
|
+
|
1
3
|
# Collects Disk metrics on eligible filesystems. Reports a hash of hashes, with the first hash keyed by device name.
|
2
4
|
#
|
3
5
|
# TODO: Currently, this reports on devices that begins with /dev as listed by `mount`. Revisit this.
|
@@ -12,7 +14,7 @@ class ServerMetrics::Disk < ServerMetrics::MultiCollector
|
|
12
14
|
|
13
15
|
devices.each do |device|
|
14
16
|
get_sizes(device) # does its own reporting
|
15
|
-
get_io_stats(device) if linux? # does its own reporting
|
17
|
+
get_io_stats(device[:name]) if linux? # does its own reporting
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
@@ -30,10 +32,20 @@ class ServerMetrics::Disk < ServerMetrics::MultiCollector
|
|
30
32
|
def devices
|
31
33
|
if @devices.nil? or @last_devices_output < (Time.now-@options[:ttl].to_i*60)
|
32
34
|
@last_devices_output = Time.now
|
33
|
-
|
34
|
-
|
35
|
-
@devices
|
35
|
+
# if running inside a docker container, we want the devices mounted on the host
|
36
|
+
mount_output = dockerized_agent? ? `cat /host/etc/mtab` : `mount`
|
37
|
+
@devices = mount_output.split("\n").grep(/^\/dev/).map{|l| {:name => l.split.first, :aliases => []}} # any device that starts with /dev
|
38
|
+
if dockerized_agent?
|
39
|
+
`blkid`.split("\n").grep(/ UUID=/).each do |device|
|
40
|
+
name = device.match(/\A[^\:]*/)[0]
|
41
|
+
uuid = device.match(/\ UUID="(.+?)"/)[1]
|
42
|
+
if host_device = @devices.find { |dn| dn[:name] == name }
|
43
|
+
host_device[:aliases] << "/dev/disk/by-uuid/#{uuid}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
36
47
|
end
|
48
|
+
@devices
|
37
49
|
end
|
38
50
|
|
39
51
|
# called from build_report for each device
|
@@ -48,7 +60,11 @@ class ServerMetrics::Disk < ServerMetrics::MultiCollector
|
|
48
60
|
end
|
49
61
|
|
50
62
|
# select the right line
|
51
|
-
hash = parsed_lines.
|
63
|
+
hash = parsed_lines.find {|l| l["Filesystem"] == device[:name]}
|
64
|
+
# device wasn't found. check device aliases
|
65
|
+
if hash.nil?
|
66
|
+
hash = parsed_lines.find {|l| device[:aliases].include?(l["Filesystem"])}
|
67
|
+
end
|
52
68
|
# device wasn't found. could be a mapped device. skip over.
|
53
69
|
return if hash.nil?
|
54
70
|
result = {}
|
@@ -58,35 +74,35 @@ class ServerMetrics::Disk < ServerMetrics::MultiCollector
|
|
58
74
|
result[key]=value
|
59
75
|
end
|
60
76
|
|
61
|
-
report(device, result)
|
77
|
+
report(device[:name], result)
|
62
78
|
end
|
63
79
|
|
64
80
|
# called from build_report for each device
|
65
|
-
def get_io_stats(
|
66
|
-
stats = iostat(
|
81
|
+
def get_io_stats(device_name)
|
82
|
+
stats = iostat(device_name)
|
67
83
|
|
68
84
|
if stats
|
69
|
-
counter(
|
70
|
-
counter(
|
71
|
-
counter(
|
72
|
-
counter(
|
73
|
-
counter(
|
85
|
+
counter(device_name, :rps, stats['rio'], :per => :second)
|
86
|
+
counter(device_name, :wps, stats['wio'], :per => :second)
|
87
|
+
counter(device_name, :rps_kb, stats['rsect'] / 2, :per => :second)
|
88
|
+
counter(device_name, :wps_kb, stats['wsect'] / 2, :per => :second)
|
89
|
+
counter(device_name, :utilization, stats['use'] / 10.0, :per => :second)
|
74
90
|
# Not 100% sure that average queue length is present on all distros.
|
75
91
|
if stats['aveq']
|
76
|
-
counter(
|
92
|
+
counter(device_name, :average_queue_length, stats['aveq'], :per => :second)
|
77
93
|
end
|
78
94
|
|
79
|
-
if old = memory(
|
95
|
+
if old = memory(device_name, "stats")
|
80
96
|
ios = (stats['rio'] - old['rio']) + (stats['wio'] - old['wio'])
|
81
97
|
|
82
98
|
if ios > 0
|
83
99
|
await = ((stats['ruse'] - old['ruse']) + (stats['wuse'] - old['wuse'])) / ios.to_f
|
84
100
|
|
85
|
-
report(
|
101
|
+
report(device_name, :await => await)
|
86
102
|
end
|
87
103
|
end
|
88
104
|
|
89
|
-
remember(
|
105
|
+
remember(device_name, "stats" => stats)
|
90
106
|
end
|
91
107
|
end
|
92
108
|
|
@@ -119,7 +135,7 @@ class ServerMetrics::Disk < ServerMetrics::MultiCollector
|
|
119
135
|
|
120
136
|
# Returns /proc/diskstats as array.
|
121
137
|
def disk_stats
|
122
|
-
File.readlines("/
|
138
|
+
File.readlines("#{ServerMetrics::SystemInfo.proc_dir}/diskstats")
|
123
139
|
rescue Errno::ENOENT # Handle missing /proc/diskstats, i.e. on Mac OS X.
|
124
140
|
[]
|
125
141
|
end
|
@@ -128,4 +144,8 @@ class ServerMetrics::Disk < ServerMetrics::MultiCollector
|
|
128
144
|
key = "Used Percent" if /capacity|use.*%|%.*use/i === key
|
129
145
|
key.downcase.gsub(" ", "_").to_sym
|
130
146
|
end
|
147
|
+
|
148
|
+
def dockerized_agent?
|
149
|
+
File.exists?("/host/etc/mtab")
|
150
|
+
end
|
131
151
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "server_metrics/system_info"
|
2
|
+
|
1
3
|
class ServerMetrics::Memory < ServerMetrics::Collector
|
2
4
|
# reports darwin units as MB
|
3
5
|
DARWIN_UNITS = { "b" => 1/(1024*1024),
|
@@ -17,7 +19,7 @@ class ServerMetrics::Memory < ServerMetrics::Collector
|
|
17
19
|
|
18
20
|
def linux_memory
|
19
21
|
mem_info = {}
|
20
|
-
File.read("/
|
22
|
+
File.read("#{ServerMetrics::SystemInfo.proc_dir}/meminfo").each_line do |line|
|
21
23
|
_, key, value = *line.match(/^(\w+):\s+(\d+)\s/)
|
22
24
|
mem_info[key] = value.to_i
|
23
25
|
end
|
@@ -4,7 +4,7 @@ class ServerMetrics::Network < ServerMetrics::MultiCollector
|
|
4
4
|
|
5
5
|
def build_report
|
6
6
|
if linux?
|
7
|
-
lines = File.read("/
|
7
|
+
lines = File.read("#{ServerMetrics::SystemInfo.proc_dir}/net/dev").lines.to_a[2..-1]
|
8
8
|
interfaces = []
|
9
9
|
lines.each do |line|
|
10
10
|
iface, rest = line.split(':', 2).collect { |e| e.strip }
|
@@ -80,15 +80,17 @@ module SysLite
|
|
80
80
|
array = block_given? ? nil : []
|
81
81
|
struct = nil
|
82
82
|
raise TypeError unless pid.is_a?(Fixnum) if pid
|
83
|
+
|
84
|
+
proc_dir = ServerMetrics::SystemInfo.proc_dir
|
83
85
|
|
84
|
-
Dir.chdir(
|
86
|
+
Dir.chdir(proc_dir)
|
85
87
|
Dir.glob("[0-9]*").each do |file|
|
86
88
|
next unless file.to_i == pid if pid
|
87
89
|
|
88
90
|
struct = ProcTableStruct.new
|
89
91
|
|
90
92
|
# Get /proc/<pid>/stat information
|
91
|
-
stat = IO.read("
|
93
|
+
stat = IO.read("#{proc_dir}/#{file}/stat") rescue next
|
92
94
|
|
93
95
|
# Deal with spaces in comm name. Courtesy of Ara Howard.
|
94
96
|
re = %r/\([^\)]+\)/
|
@@ -42,6 +42,11 @@ module ServerMetrics
|
|
42
42
|
def self.to_h
|
43
43
|
{:architecture => architecture, :os=>os, :os_version=>os_version, :num_processors=>num_processors, :hostname=>hostname, :timezone=>timezone, :timezone_offset=>timezone_offset }
|
44
44
|
end
|
45
|
+
|
46
|
+
# When run inside a docker container, we want to read from the host proc dir.
|
47
|
+
def self.proc_dir
|
48
|
+
@@proc_dir ||= (File.directory?("/host/proc") ? "/host/proc" : "/proc")
|
49
|
+
end
|
45
50
|
end
|
46
51
|
end
|
47
52
|
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: server_metrics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.9.1
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Andre Lewis
|
@@ -10,104 +11,118 @@ authors:
|
|
10
11
|
autorequire:
|
11
12
|
bindir: bin
|
12
13
|
cert_chain: []
|
13
|
-
date:
|
14
|
+
date: 2015-02-01 00:00:00.000000000 Z
|
14
15
|
dependencies:
|
15
16
|
- !ruby/object:Gem::Dependency
|
16
17
|
name: bundler
|
17
18
|
requirement: !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
18
20
|
requirements:
|
19
|
-
- -
|
21
|
+
- - ~>
|
20
22
|
- !ruby/object:Gem::Version
|
21
23
|
version: '1.3'
|
22
24
|
type: :development
|
23
25
|
prerelease: false
|
24
26
|
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
25
28
|
requirements:
|
26
|
-
- -
|
29
|
+
- - ~>
|
27
30
|
- !ruby/object:Gem::Version
|
28
31
|
version: '1.3'
|
29
32
|
- !ruby/object:Gem::Dependency
|
30
33
|
name: rake
|
31
34
|
requirement: !ruby/object:Gem::Requirement
|
35
|
+
none: false
|
32
36
|
requirements:
|
33
|
-
- -
|
37
|
+
- - ! '>='
|
34
38
|
- !ruby/object:Gem::Version
|
35
39
|
version: '0'
|
36
40
|
type: :development
|
37
41
|
prerelease: false
|
38
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
39
44
|
requirements:
|
40
|
-
- -
|
45
|
+
- - ! '>='
|
41
46
|
- !ruby/object:Gem::Version
|
42
47
|
version: '0'
|
43
48
|
- !ruby/object:Gem::Dependency
|
44
49
|
name: awesome_print
|
45
50
|
requirement: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
46
52
|
requirements:
|
47
|
-
- -
|
53
|
+
- - ! '>='
|
48
54
|
- !ruby/object:Gem::Version
|
49
55
|
version: '0'
|
50
56
|
type: :development
|
51
57
|
prerelease: false
|
52
58
|
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
53
60
|
requirements:
|
54
|
-
- -
|
61
|
+
- - ! '>='
|
55
62
|
- !ruby/object:Gem::Version
|
56
63
|
version: '0'
|
57
64
|
- !ruby/object:Gem::Dependency
|
58
65
|
name: pry
|
59
66
|
requirement: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
60
68
|
requirements:
|
61
|
-
- -
|
69
|
+
- - ! '>='
|
62
70
|
- !ruby/object:Gem::Version
|
63
71
|
version: '0'
|
64
72
|
type: :development
|
65
73
|
prerelease: false
|
66
74
|
version_requirements: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
67
76
|
requirements:
|
68
|
-
- -
|
77
|
+
- - ! '>='
|
69
78
|
- !ruby/object:Gem::Version
|
70
79
|
version: '0'
|
71
80
|
- !ruby/object:Gem::Dependency
|
72
81
|
name: timecop
|
73
82
|
requirement: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
74
84
|
requirements:
|
75
|
-
- -
|
85
|
+
- - ! '>='
|
76
86
|
- !ruby/object:Gem::Version
|
77
87
|
version: '0'
|
78
88
|
type: :development
|
79
89
|
prerelease: false
|
80
90
|
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
none: false
|
81
92
|
requirements:
|
82
|
-
- -
|
93
|
+
- - ! '>='
|
83
94
|
- !ruby/object:Gem::Version
|
84
95
|
version: '0'
|
85
96
|
- !ruby/object:Gem::Dependency
|
86
97
|
name: mocha
|
87
98
|
requirement: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
88
100
|
requirements:
|
89
|
-
- -
|
101
|
+
- - ! '>='
|
90
102
|
- !ruby/object:Gem::Version
|
91
103
|
version: '0'
|
92
104
|
type: :development
|
93
105
|
prerelease: false
|
94
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
95
108
|
requirements:
|
96
|
-
- -
|
109
|
+
- - ! '>='
|
97
110
|
- !ruby/object:Gem::Version
|
98
111
|
version: '0'
|
99
112
|
- !ruby/object:Gem::Dependency
|
100
113
|
name: rspec
|
101
114
|
requirement: !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
102
116
|
requirements:
|
103
|
-
- -
|
117
|
+
- - ~>
|
104
118
|
- !ruby/object:Gem::Version
|
105
119
|
version: '2.14'
|
106
120
|
type: :development
|
107
121
|
prerelease: false
|
108
122
|
version_requirements: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
109
124
|
requirements:
|
110
|
-
- -
|
125
|
+
- - ~>
|
111
126
|
- !ruby/object:Gem::Version
|
112
127
|
version: '2.14'
|
113
128
|
description: Collect information about disks, memory, CPU, networks, and processes
|
@@ -117,7 +132,7 @@ executables: []
|
|
117
132
|
extensions: []
|
118
133
|
extra_rdoc_files: []
|
119
134
|
files:
|
120
|
-
-
|
135
|
+
- .gitignore
|
121
136
|
- CHANGELOG.md
|
122
137
|
- Gemfile
|
123
138
|
- LICENSE.txt
|
@@ -153,26 +168,27 @@ files:
|
|
153
168
|
homepage: http://scoutapp.com
|
154
169
|
licenses:
|
155
170
|
- MIT
|
156
|
-
metadata: {}
|
157
171
|
post_install_message:
|
158
172
|
rdoc_options: []
|
159
173
|
require_paths:
|
160
174
|
- lib
|
161
175
|
required_ruby_version: !ruby/object:Gem::Requirement
|
176
|
+
none: false
|
162
177
|
requirements:
|
163
|
-
- -
|
178
|
+
- - ! '>='
|
164
179
|
- !ruby/object:Gem::Version
|
165
180
|
version: '0'
|
166
181
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
182
|
+
none: false
|
167
183
|
requirements:
|
168
|
-
- -
|
184
|
+
- - ! '>='
|
169
185
|
- !ruby/object:Gem::Version
|
170
186
|
version: '0'
|
171
187
|
requirements: []
|
172
188
|
rubyforge_project:
|
173
|
-
rubygems_version:
|
189
|
+
rubygems_version: 1.8.23
|
174
190
|
signing_key:
|
175
|
-
specification_version:
|
191
|
+
specification_version: 3
|
176
192
|
summary: Used by the Scout agent, but also available as a stand-lone gem
|
177
193
|
test_files:
|
178
194
|
- spec/server_metrics/collector_spec.rb
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: a4040b1194f4904d529f0b9325e5770d33ca7364
|
4
|
-
data.tar.gz: 2cd897acaa0dbde2e0a44e4a3d83fa3263b8720c
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: 18a1aaf212424d1d3801b7d1519980aacad35b9b84cbda28774638c70cb93fbf6db786e0222ef0c7366a4556cabd413067a166a92ac4feeada4f181a20b60ab0
|
7
|
-
data.tar.gz: b55d1b3a853393b13c86a817a38e33d2587f659733613f5b31abd4fd518f08c5977b3a1406a7e00aa5d672bf99d857cd04c9a0f9878f44936505499055387d03
|