astro-collectd 0.0.5 → 0.0.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.
- metadata +3 -8
- data/lib/collectd/em_server.rb +0 -21
- data/lib/collectd/interface.rb +0 -187
- data/lib/collectd/pkt.rb +0 -107
- data/lib/collectd/proc_stats.rb +0 -49
- data/lib/collectd/server.rb +0 -26
- data/lib/collectd.rb +0 -10
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: astro-collectd
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Stephan Maka
|
|
@@ -21,13 +21,8 @@ extensions: []
|
|
|
21
21
|
|
|
22
22
|
extra_rdoc_files: []
|
|
23
23
|
|
|
24
|
-
files:
|
|
25
|
-
|
|
26
|
-
- lib/collectd/proc_stats.rb
|
|
27
|
-
- lib/collectd/pkt.rb
|
|
28
|
-
- lib/collectd/server.rb
|
|
29
|
-
- lib/collectd/em_server.rb
|
|
30
|
-
- lib/collectd.rb
|
|
24
|
+
files: []
|
|
25
|
+
|
|
31
26
|
has_rdoc: false
|
|
32
27
|
homepage: http://github.com/astro/ruby-collectd
|
|
33
28
|
post_install_message:
|
data/lib/collectd/em_server.rb
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
require 'eventmachine'
|
|
2
|
-
|
|
3
|
-
module Collectd
|
|
4
|
-
class EmServer < Values
|
|
5
|
-
|
|
6
|
-
def initialize(interval, host, port)
|
|
7
|
-
super(interval)
|
|
8
|
-
@sock = UDPSocket.new(host.index(':') ? Socket::AF_INET6 : Socket::AF_INET)
|
|
9
|
-
@sock.connect(host, port)
|
|
10
|
-
|
|
11
|
-
EM.add_periodic_timer(interval) do
|
|
12
|
-
Collectd.run_pollables_for self
|
|
13
|
-
Thread.critical = true
|
|
14
|
-
pkt = make_pkt
|
|
15
|
-
Thread.critical = false
|
|
16
|
-
@sock.send(pkt, 0)
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
end
|
|
21
|
-
end
|
data/lib/collectd/interface.rb
DELETED
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
require 'collectd/pkt'
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
module Collectd
|
|
5
|
-
class << self
|
|
6
|
-
|
|
7
|
-
def hostname
|
|
8
|
-
@@hostname ||= `hostname -f`.strip
|
|
9
|
-
@@hostname
|
|
10
|
-
end
|
|
11
|
-
def hostname=(h)
|
|
12
|
-
@@hostname = h
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
@@servers = []
|
|
16
|
-
|
|
17
|
-
def add_server(interval, addr='ff18::efc0:4a42', port=25826)
|
|
18
|
-
@@servers << Server.new(interval, addr, port)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def each_server(&block)
|
|
22
|
-
@@servers.each(&block)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def add_pollable(&block)
|
|
26
|
-
@@pollables ||= []
|
|
27
|
-
@@pollables << block
|
|
28
|
-
end
|
|
29
|
-
def run_pollables_for(server)
|
|
30
|
-
@@pollables ||= []
|
|
31
|
-
@@pollables.each do |block|
|
|
32
|
-
block.call(server)
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def method_missing(plugin, plugin_instance)
|
|
37
|
-
Plugin.new(plugin, plugin_instance)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
##
|
|
43
|
-
# Interface helper
|
|
44
|
-
class Plugin
|
|
45
|
-
include ProcStats
|
|
46
|
-
def initialize(plugin, plugin_instance)
|
|
47
|
-
@plugin, @plugin_instance = plugin, plugin_instance
|
|
48
|
-
end
|
|
49
|
-
def method_missing(type, type_instance)
|
|
50
|
-
Type.new(@plugin, @plugin_instance, type, type_instance)
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
##
|
|
55
|
-
# Interface helper
|
|
56
|
-
class Type
|
|
57
|
-
def initialize(plugin, plugin_instance, type, type_instance)
|
|
58
|
-
@plugin, @plugin_instance = plugin, plugin_instance
|
|
59
|
-
@type, @type_instance = type, type_instance
|
|
60
|
-
end
|
|
61
|
-
##
|
|
62
|
-
# GAUGE
|
|
63
|
-
def gauge=(values)
|
|
64
|
-
values = [values] unless values.kind_of? Array
|
|
65
|
-
Collectd.each_server do |server|
|
|
66
|
-
server.set_gauge(plugin_type, values)
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
##
|
|
70
|
-
# COUNTER
|
|
71
|
-
def counter=(values)
|
|
72
|
-
values = [values] unless values.kind_of? Array
|
|
73
|
-
Collectd.each_server do |server|
|
|
74
|
-
server.set_counter(plugin_type, values)
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
def count!(*values)
|
|
78
|
-
Collectd.each_server do |server|
|
|
79
|
-
server.inc_counter(plugin_type, values)
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
def polled_gauge(&block)
|
|
83
|
-
Collectd.add_pollable do |server|
|
|
84
|
-
values = block.call
|
|
85
|
-
values = [values] unless values.kind_of? Array
|
|
86
|
-
server.set_gauge(plugin_type, values) if values
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
def polled_count(&block)
|
|
90
|
-
Collectd.add_pollable do |server|
|
|
91
|
-
values = block.call
|
|
92
|
-
values = [values] unless values.kind_of? Array
|
|
93
|
-
server.inc_counter(plugin_type, values) if values
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
def polled_counter(&block)
|
|
97
|
-
Collectd.add_pollable do |server|
|
|
98
|
-
values = block.call
|
|
99
|
-
values = [values] unless values.kind_of? Array
|
|
100
|
-
server.set_counter(plugin_type, values) if values
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
private
|
|
104
|
-
##
|
|
105
|
-
# [plugin, plugin_instance, type, type_instance]
|
|
106
|
-
def plugin_type
|
|
107
|
-
[@plugin, @plugin_instance, @type, @type_instance]
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
##
|
|
112
|
-
# Value-holder, baseclass for servers
|
|
113
|
-
class Values
|
|
114
|
-
attr_reader :interval
|
|
115
|
-
def initialize(interval)
|
|
116
|
-
@interval = interval
|
|
117
|
-
@counters = {}
|
|
118
|
-
@gauges = {}
|
|
119
|
-
end
|
|
120
|
-
def set_counter(plugin_type, values)
|
|
121
|
-
@counters[plugin_type] = values
|
|
122
|
-
end
|
|
123
|
-
def inc_counter(plugin_type, values)
|
|
124
|
-
old_values = @counters[plugin_type] || []
|
|
125
|
-
values.map! { |value|
|
|
126
|
-
value + (old_values.shift || 0)
|
|
127
|
-
}
|
|
128
|
-
@counters[plugin_type] = values
|
|
129
|
-
end
|
|
130
|
-
def set_gauge(plugin_type, values)
|
|
131
|
-
# Use count & sums for average
|
|
132
|
-
if @gauges.has_key?(plugin_type)
|
|
133
|
-
old_values = @gauges[plugin_type]
|
|
134
|
-
count = old_values.shift
|
|
135
|
-
values.map! { |value| value + (old_values.shift || value) }
|
|
136
|
-
@gauges[plugin_type] = [count + 1] + values
|
|
137
|
-
else
|
|
138
|
-
@gauges[plugin_type] = [1] + values
|
|
139
|
-
end
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
def make_pkt
|
|
143
|
-
plugin_type_values = {}
|
|
144
|
-
@counters.each do |plugin_types,values|
|
|
145
|
-
plugin, plugin_instance, type, type_instance = plugin_types
|
|
146
|
-
plugin_type_values[plugin] ||= {}
|
|
147
|
-
plugin_type_values[plugin][plugin_instance] ||= {}
|
|
148
|
-
plugin_type_values[plugin][plugin_instance][type] ||= {}
|
|
149
|
-
plugin_type_values[plugin][plugin_instance][type][type_instance] =
|
|
150
|
-
Packet::Values.new(values.map { |value| Packet::Values::Counter.new(value) })
|
|
151
|
-
end
|
|
152
|
-
@gauges.each do |plugin_types,values|
|
|
153
|
-
plugin, plugin_instance, type, type_instance = plugin_types
|
|
154
|
-
plugin_type_values[plugin] ||= {}
|
|
155
|
-
plugin_type_values[plugin][plugin_instance] ||= {}
|
|
156
|
-
plugin_type_values[plugin][plugin_instance][type] ||= {}
|
|
157
|
-
count = values.shift
|
|
158
|
-
values.map! { |value| value.to_f / count }
|
|
159
|
-
plugin_type_values[plugin][plugin_instance][type][type_instance] =
|
|
160
|
-
Packet::Values.new(values.map { |value| Packet::Values::Gauge.new(value) })
|
|
161
|
-
end
|
|
162
|
-
pkt = [Packet::Host.new(Collectd.hostname),
|
|
163
|
-
Packet::Time.new(Time.now.to_i),
|
|
164
|
-
Packet::Interval.new(10)]
|
|
165
|
-
plugin_type_values.each do |plugin,plugin_instances|
|
|
166
|
-
pkt << Packet::Plugin.new(plugin)
|
|
167
|
-
plugin_instances.each do |plugin_instance,types|
|
|
168
|
-
pkt << Packet::PluginInstance.new(plugin_instance)
|
|
169
|
-
types.each do |type,type_instances|
|
|
170
|
-
pkt << Packet::Type.new(type)
|
|
171
|
-
type_instances.each do |type_instance,values|
|
|
172
|
-
pkt << Packet::TypeInstance.new(type_instance)
|
|
173
|
-
pkt << values
|
|
174
|
-
end
|
|
175
|
-
end
|
|
176
|
-
end
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
# Reset only gauges. Counters are persistent for incrementing.
|
|
180
|
-
@gauges = {}
|
|
181
|
-
|
|
182
|
-
# And return serialized packet of parts
|
|
183
|
-
pkt.to_s
|
|
184
|
-
end
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
end
|
data/lib/collectd/pkt.rb
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
module Collectd
|
|
2
|
-
module Packet
|
|
3
|
-
|
|
4
|
-
class Part
|
|
5
|
-
def to_s(content)
|
|
6
|
-
[type, content.length + 4].pack("nn") + content
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
##
|
|
10
|
-
# Makes subclasses more declarative
|
|
11
|
-
def self.type(number)
|
|
12
|
-
define_method(:type) { number }
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
class String < Part
|
|
17
|
-
def initialize(s)
|
|
18
|
-
@s = s
|
|
19
|
-
end
|
|
20
|
-
def to_s
|
|
21
|
-
super "#{@s}\000"
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
class Number < Part
|
|
26
|
-
def initialize(n)
|
|
27
|
-
@n = n
|
|
28
|
-
end
|
|
29
|
-
def to_s
|
|
30
|
-
super [@n >> 32, @n & 0xffffffff].pack("NN")
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
class Host < String
|
|
35
|
-
type 0
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
class Time < Number
|
|
39
|
-
type 1
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
class Plugin < String
|
|
43
|
-
type 2
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
class PluginInstance < String
|
|
47
|
-
type 3
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
class Type < String
|
|
51
|
-
type 4
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
class TypeInstance < String
|
|
55
|
-
type 5
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
class Values < Part
|
|
59
|
-
type 6
|
|
60
|
-
def initialize(v)
|
|
61
|
-
@v = v
|
|
62
|
-
end
|
|
63
|
-
def to_s
|
|
64
|
-
types, values = [], []
|
|
65
|
-
@v.each { |v1|
|
|
66
|
-
types << [v1.type].pack("C")
|
|
67
|
-
values << v1.to_s
|
|
68
|
-
}
|
|
69
|
-
super [@v.length].pack("n") + types.join + values.join
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
class Counter < Part
|
|
73
|
-
type 0
|
|
74
|
-
def initialize(c)
|
|
75
|
-
@c = c
|
|
76
|
-
end
|
|
77
|
-
def to_s
|
|
78
|
-
[@c >> 32, @c & 0xffffffff].pack("NN")
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
class Gauge < Part
|
|
83
|
-
type 1
|
|
84
|
-
def initialize(f)
|
|
85
|
-
@f = f
|
|
86
|
-
end
|
|
87
|
-
def to_s
|
|
88
|
-
[@f].pack("d")
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
class Interval < Number
|
|
94
|
-
type 7
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
class Message < String
|
|
99
|
-
type 0x100
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
class Severity < Number
|
|
103
|
-
type 0x101
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
end
|
|
107
|
-
end
|
data/lib/collectd/proc_stats.rb
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
module Collectd
|
|
2
|
-
##
|
|
3
|
-
# Included by Interface
|
|
4
|
-
module ProcStats
|
|
5
|
-
def with_polled_memory
|
|
6
|
-
def process_status(field)
|
|
7
|
-
fields = {}
|
|
8
|
-
IO.readlines("/proc/#{$$}/status").each { |line|
|
|
9
|
-
line.strip!
|
|
10
|
-
if line =~ /^(.+?):\s+(.+)$/
|
|
11
|
-
fields[$1] = $2
|
|
12
|
-
end
|
|
13
|
-
}
|
|
14
|
-
fields[field]
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
memory('VmRSS').polled_gauge do
|
|
18
|
-
process_status('VmRSS').to_i * 1024
|
|
19
|
-
end
|
|
20
|
-
memory('VmSize').polled_gauge do
|
|
21
|
-
process_status('VmSize').to_i * 1024
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
self
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def with_polled_cpu
|
|
28
|
-
def schedstats
|
|
29
|
-
if IO.readlines("/proc/#{$$}/schedstat").to_s =~ /^(\d+) (\d+) (\d+)/
|
|
30
|
-
[$1.to_i, $2.to_i, $3.to_i]
|
|
31
|
-
else
|
|
32
|
-
[]
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
cpu('user').polled_counter do
|
|
37
|
-
schedstats[0]
|
|
38
|
-
end
|
|
39
|
-
cpu('wait').polled_counter do
|
|
40
|
-
schedstats[1]
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def with_full_proc_stats
|
|
45
|
-
with_polled_memory
|
|
46
|
-
with_polled_cpu
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
end
|
data/lib/collectd/server.rb
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
require 'socket'
|
|
2
|
-
require 'thread'
|
|
3
|
-
|
|
4
|
-
module Collectd
|
|
5
|
-
class Server < Values
|
|
6
|
-
|
|
7
|
-
def initialize(interval, host, port)
|
|
8
|
-
super(interval)
|
|
9
|
-
@sock = UDPSocket.new(Socket::AF_INET6)
|
|
10
|
-
@sock.connect(host, port)
|
|
11
|
-
|
|
12
|
-
Thread.new do
|
|
13
|
-
loop do
|
|
14
|
-
sleep interval
|
|
15
|
-
|
|
16
|
-
Collectd.run_pollables_for self
|
|
17
|
-
Thread.critical = true
|
|
18
|
-
pkt = make_pkt
|
|
19
|
-
Thread.critical = false
|
|
20
|
-
@sock.send(pkt, 0)
|
|
21
|
-
end
|
|
22
|
-
end.abort_on_exception = true
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
end
|
|
26
|
-
end
|