warcorrespondent 0.0.2 → 0.0.3
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/README.rdoc +49 -1
- data/VERSION +1 -1
- data/bin/warcorrespondent +7 -2
- data/lib/warcorrespondent/reporter.rb +6 -4
- data/lib/warcorrespondent/reporters/linux/cpu.rb +42 -0
- data/lib/warcorrespondent/reporters/linux/loadavg.rb +26 -0
- data/lib/warcorrespondent/reporters/linux/memory.rb +36 -0
- data/lib/warcorrespondent/reporters/linux/net.rb +46 -0
- data/lib/warcorrespondent/uplink.rb +11 -9
- data/lib/warcorrespondent.rb +1 -2
- metadata +7 -3
data/README.rdoc
CHANGED
@@ -1,6 +1,54 @@
|
|
1
1
|
= warcorrespondent
|
2
2
|
|
3
|
-
warcorrespondent reports to the warroom
|
3
|
+
<em>warcorrespondent reports to the warroom.</em>
|
4
|
+
|
5
|
+
warcorrespondent is a tool that reports measured data in json format to a web application.
|
6
|
+
At the moment the functionality is only available in a standalone binary.
|
7
|
+
|
8
|
+
== Data Format
|
9
|
+
The data is subitted to the web app via POST, setting <em>secret</em> and <em>data</em>.
|
10
|
+
<em>secret</em> is set to the string specified in the configuration file and is meant as a simple authentication method.
|
11
|
+
<em>data</em> is a json structure and looks like this:
|
12
|
+
[
|
13
|
+
{
|
14
|
+
identifier:"hosts:example:users",
|
15
|
+
timestamp: 1271146141,
|
16
|
+
type:"integer",
|
17
|
+
value:12
|
18
|
+
},
|
19
|
+
{
|
20
|
+
identifier: "apps:example:dontations",
|
21
|
+
timestamp: 1271146141,
|
22
|
+
type:"money",
|
23
|
+
unit:"EUR",
|
24
|
+
value:100
|
25
|
+
}
|
26
|
+
]
|
27
|
+
|
28
|
+
|
29
|
+
== Configuration
|
30
|
+
|
31
|
+
The main configuration lies in /etc/warcorrespondent/warcorrespondent.yml by default.
|
32
|
+
Example:
|
33
|
+
url: http://localhost:3000/graphs
|
34
|
+
secret: adsfdsafdsfa
|
35
|
+
|
36
|
+
The reporters are by default defined in /etc/warcorrespondent/reporters/*.rb
|
37
|
+
WarCorrespondent::Reporter.new(:timeout => 300, :identifier => 'hosts:example:users') do
|
38
|
+
count = 0
|
39
|
+
IO.popen('who') do |p|
|
40
|
+
count = p.readlines.size
|
41
|
+
end
|
42
|
+
{:value => count, :type => "integer"}
|
43
|
+
end
|
44
|
+
The block may either return one hash or an array of hashes.
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
To start/stop the daemon use:
|
49
|
+
warcorrespondent start
|
50
|
+
or
|
51
|
+
warcorrespondent stop
|
4
52
|
|
5
53
|
== Note on Patches/Pull Requests
|
6
54
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
data/bin/warcorrespondent
CHANGED
@@ -3,7 +3,7 @@ module WarCorrespondent
|
|
3
3
|
attr_accessor :timeout
|
4
4
|
attr_accessor :identifier
|
5
5
|
def initialize(args, &block)
|
6
|
-
@timeout =
|
6
|
+
@timeout = 300
|
7
7
|
[:timeout, :identifier].each do |key|
|
8
8
|
if args[key] && self.respond_to?("#{key}=")
|
9
9
|
self.send("#{key}=",args[key])
|
@@ -17,10 +17,12 @@ module WarCorrespondent
|
|
17
17
|
data = @block.call
|
18
18
|
data = [data] if data.class == Hash
|
19
19
|
data.map! do |e|
|
20
|
-
e
|
20
|
+
e = {:timestamp => Time.now.to_i}.merge(e)
|
21
|
+
e[:identifier] = identifier + (e[:identifier] ? (':' + e[:identifier]) : '')
|
22
|
+
e[:identifier].gsub!(/:+/, ':')
|
21
23
|
e
|
22
24
|
end
|
23
|
-
WarCorrespondent::update(
|
25
|
+
WarCorrespondent::update(data)
|
24
26
|
end
|
25
27
|
|
26
28
|
def run
|
@@ -36,7 +38,7 @@ module WarCorrespondent
|
|
36
38
|
|
37
39
|
|
38
40
|
end
|
39
|
-
|
41
|
+
|
40
42
|
Dir.glob(File.dirname(__FILE__) + "/reporters/*.rb") do |i|
|
41
43
|
require i
|
42
44
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module WarCorrespondent
|
2
|
+
module Reporters
|
3
|
+
module Linux
|
4
|
+
class CPU < WarCorrespondent::Reporter
|
5
|
+
def initialize(args)
|
6
|
+
@block = Proc.new do
|
7
|
+
get_data = Proc.new do
|
8
|
+
data = nil
|
9
|
+
File.open('/proc/stat','r') do |f|
|
10
|
+
f.readlines.select{|l| l =~ /^cpu /}.each do |l|
|
11
|
+
data = l.split
|
12
|
+
data.shift
|
13
|
+
end
|
14
|
+
end
|
15
|
+
data
|
16
|
+
end
|
17
|
+
if !@prev_data
|
18
|
+
@prev_data = get_data.call
|
19
|
+
sleep 5
|
20
|
+
end
|
21
|
+
@new_data = get_data.call
|
22
|
+
difference = @prev_data.zip(@new_data).map{|i| i[1].to_f - i[0].to_f}
|
23
|
+
sum = difference.inject{|a,b| a+b}
|
24
|
+
difference.map!{|i| i/sum}
|
25
|
+
@prev_data = @new_data
|
26
|
+
[
|
27
|
+
{:identifier => "cpu:user", :type => "float", :value => difference[0]},
|
28
|
+
{:identifier => "cpu:nice", :type => "float", :value => difference[1]},
|
29
|
+
{:identifier => "cpu:system", :type => "float", :value => difference[2]},
|
30
|
+
{:identifier => "cpu:idle", :type => "float", :value => difference[3]},
|
31
|
+
{:identifier => "cpu:running", :type => "float", :value => difference[4]},
|
32
|
+
{:identifier => "cpu:iowait", :type => "float", :value => difference[5]},
|
33
|
+
{:identifier => "cpu:irq", :type => "float", :value => difference[6]},
|
34
|
+
{:identifier => "cpu:softirq", :type => "float", :value => difference[7]}
|
35
|
+
]
|
36
|
+
end
|
37
|
+
super(args)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module WarCorrespondent
|
2
|
+
module Reporters
|
3
|
+
module Linux
|
4
|
+
class LoadAvg < WarCorrespondent::Reporter
|
5
|
+
def initialize(args)
|
6
|
+
|
7
|
+
@block = Proc.new do
|
8
|
+
File.open('/proc/loadavg','r') do |f|
|
9
|
+
line = f.readline
|
10
|
+
load_one_min, load_five_min, load_fivteen_min, processes = line.split
|
11
|
+
processes_running, processes_total = processes.split('/')
|
12
|
+
[
|
13
|
+
{:identifier => "load:1", :type => "float", :value => load_one_min},
|
14
|
+
{:identifier => "load:5", :type => "float", :value => load_five_min},
|
15
|
+
{:identifier => "load:15", :type => "float", :value => load_fivteen_min},
|
16
|
+
{:identifier => "processes:running", :type => "integer", :value => processes_running},
|
17
|
+
{:identifier => "processes:running", :type => "integer", :value => processes_total}
|
18
|
+
]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
super(args)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module WarCorrespondent
|
2
|
+
module Reporters
|
3
|
+
module Linux
|
4
|
+
class Memory < WarCorrespondent::Reporter
|
5
|
+
def initialize(args)
|
6
|
+
@block = Proc.new do
|
7
|
+
items = {
|
8
|
+
'mem:free' => 'MemFree',
|
9
|
+
'mem:cached' => 'Cached',
|
10
|
+
'mem:buffers' => 'Buffers',
|
11
|
+
'mem:total' => 'MemTotal',
|
12
|
+
'swap:total' => 'SwapTotal',
|
13
|
+
'swap:free' => 'SwapFree'
|
14
|
+
|
15
|
+
}
|
16
|
+
File.open('/proc/meminfo','r') do |f|
|
17
|
+
f.readlines.each do |l|
|
18
|
+
items.each_pair do |i, k|
|
19
|
+
if matches = Regexp.new("#{k}: +([0-9]+)").match(l)
|
20
|
+
items[i] = matches[1].to_i
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
items['mem:used'] = items['mem:total'] - items['mem:free'] - items['mem:cached'] - items['mem:buffers']
|
25
|
+
items['swap:used'] = items['mem:total'] - items['mem:free']
|
26
|
+
end
|
27
|
+
items.map{|k,v|
|
28
|
+
{:identifier => k, :value => v, :type => "integer", :unit => "kB"}
|
29
|
+
}
|
30
|
+
end
|
31
|
+
super(args)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module WarCorrespondent
|
2
|
+
module Reporters
|
3
|
+
module Linux
|
4
|
+
class Net < WarCorrespondent::Reporter
|
5
|
+
def initialize(args)
|
6
|
+
@block = Proc.new do
|
7
|
+
get_data = Proc.new do
|
8
|
+
delta = nil
|
9
|
+
data = {}
|
10
|
+
File.open('/proc/net/dev','r') do |f|
|
11
|
+
f.readlines.select{|l| l =~ /:/}.each do |l|
|
12
|
+
l.gsub!(/ +/,' ').strip!
|
13
|
+
id, body = l.split(':')
|
14
|
+
body = body.strip.split
|
15
|
+
data[id] = [body[0],body[1],body[8],body[9]]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
data
|
19
|
+
end
|
20
|
+
if !@prev_data
|
21
|
+
@prev_data = get_data.call
|
22
|
+
delta = 5
|
23
|
+
sleep 5
|
24
|
+
end
|
25
|
+
delta ||= timeout
|
26
|
+
@new_data = get_data.call
|
27
|
+
difference ={}
|
28
|
+
@prev_data.keys.each{|k|
|
29
|
+
difference[k] = @prev_data[k].zip(@new_data[k]).map{|i| (i[1].to_f - i[0].to_f)/delta}
|
30
|
+
}
|
31
|
+
@prev_data = @new_data
|
32
|
+
result=[]
|
33
|
+
difference.each{|k,body|
|
34
|
+
result << {:identifier => "net:#{k}:rbytes", :value => body[0], :type => "integer"}
|
35
|
+
result << {:identifier => "net:#{k}:rpackets", :value => body[1], :type => "integer"}
|
36
|
+
result << {:identifier => "net:#{k}:sbytes", :value => body[2], :type => "integer"}
|
37
|
+
result << {:identifier => "net:#{k}:spackets", :value => body[3], :type => "integer"}
|
38
|
+
}
|
39
|
+
result
|
40
|
+
end
|
41
|
+
super(args)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'net/http'
|
2
|
-
require 'pp'
|
3
2
|
module WarCorrespondent
|
4
3
|
class Uplink
|
5
4
|
|
@@ -16,11 +15,16 @@ module WarCorrespondent
|
|
16
15
|
|
17
16
|
def sync
|
18
17
|
return if @@messages.size == 0
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
18
|
+
buffer = []
|
19
|
+
10.times do
|
20
|
+
buffer << @@messages.shift if @@messages.size > 0
|
21
|
+
end
|
22
|
+
buffer.each do |message|
|
23
|
+
begin
|
24
|
+
post(encode(message))
|
25
|
+
rescue
|
26
|
+
add(message)
|
27
|
+
end
|
24
28
|
end
|
25
29
|
end
|
26
30
|
|
@@ -38,9 +42,7 @@ module WarCorrespondent
|
|
38
42
|
end
|
39
43
|
|
40
44
|
def post(message)
|
41
|
-
|
42
|
-
res = Net::HTTP.post_form(URI.parse(url),
|
43
|
-
{'secret'=>secret, 'data'=>message})
|
45
|
+
res = Net::HTTP.post_form(URI.parse(url), {'secret'=>secret, 'data'=>message})
|
44
46
|
raise if res.code == 200
|
45
47
|
end
|
46
48
|
|
data/lib/warcorrespondent.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'warcorrespondent/reporter.rb'
|
2
2
|
require 'warcorrespondent/uplink.rb'
|
3
3
|
require 'json'
|
4
|
-
require 'pp'
|
5
4
|
|
6
5
|
module WarCorrespondent
|
7
6
|
CONFIG_FILE = '/etc/warcorrespondent/warcorrespondent.yml'
|
@@ -14,7 +13,7 @@ module WarCorrespondent
|
|
14
13
|
@@uplink.url = @@config['url']
|
15
14
|
@@uplink.secret = @@config['secret']
|
16
15
|
rescue
|
17
|
-
|
16
|
+
raise "Could not load config file #{CONFIG_FILE}"
|
18
17
|
exit
|
19
18
|
end
|
20
19
|
Dir.glob("#{REPORTERS_DIRECTORIES}/*.rb").each do |i|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 3
|
9
|
+
version: 0.0.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Stefan Maier
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-04-
|
17
|
+
date: 2010-04-17 00:00:00 +02:00
|
18
18
|
default_executable: warcorrespondent
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -48,6 +48,10 @@ files:
|
|
48
48
|
- bin/warcorrespondent
|
49
49
|
- lib/warcorrespondent.rb
|
50
50
|
- lib/warcorrespondent/reporter.rb
|
51
|
+
- lib/warcorrespondent/reporters/linux/cpu.rb
|
52
|
+
- lib/warcorrespondent/reporters/linux/loadavg.rb
|
53
|
+
- lib/warcorrespondent/reporters/linux/memory.rb
|
54
|
+
- lib/warcorrespondent/reporters/linux/net.rb
|
51
55
|
- lib/warcorrespondent/reporters/users.rb
|
52
56
|
- lib/warcorrespondent/uplink.rb
|
53
57
|
- test/helper.rb
|