monitoring-client 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +12 -2
- data/Rakefile +6 -0
- data/bin/monitoringd +5 -4
- data/lib/monitoring/client/compiler.rb +26 -0
- data/lib/monitoring/client/config.rb +41 -0
- data/lib/monitoring/client/profiler.rb +26 -4
- data/lib/monitoring/client/routine.rb +5 -19
- data/lib/monitoring/client/version.rb +1 -1
- data/monitoring-client.gemspec +1 -0
- data/spec/compiler_spec.rb +70 -0
- data/spec/config_spec.rb +12 -0
- data/spec/profiler_spec.rb +31 -0
- data/spec/spec_helper.rb +0 -0
- metadata +25 -5
data/Gemfile.lock
CHANGED
@@ -1,16 +1,26 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
monitoring (0.
|
4
|
+
monitoring-client (0.2.1)
|
5
5
|
json
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: http://rubygems.org/
|
9
9
|
specs:
|
10
|
+
diff-lcs (1.1.2)
|
10
11
|
json (1.5.1)
|
12
|
+
rspec (2.6.0)
|
13
|
+
rspec-core (~> 2.6.0)
|
14
|
+
rspec-expectations (~> 2.6.0)
|
15
|
+
rspec-mocks (~> 2.6.0)
|
16
|
+
rspec-core (2.6.0)
|
17
|
+
rspec-expectations (2.6.0)
|
18
|
+
diff-lcs (~> 1.1.2)
|
19
|
+
rspec-mocks (2.6.0)
|
11
20
|
|
12
21
|
PLATFORMS
|
13
22
|
ruby
|
14
23
|
|
15
24
|
DEPENDENCIES
|
16
|
-
monitoring!
|
25
|
+
monitoring-client!
|
26
|
+
rspec
|
data/Rakefile
CHANGED
data/bin/monitoringd
CHANGED
@@ -110,7 +110,8 @@ module Monitoring
|
|
110
110
|
post_samples(uri, samples_to_post) unless samples_to_post.empty?
|
111
111
|
Kernel.sleep(@sleep_period)
|
112
112
|
end
|
113
|
-
|
113
|
+
|
114
|
+
server.join()
|
114
115
|
end
|
115
116
|
|
116
117
|
def daemonize()
|
@@ -146,7 +147,7 @@ module Monitoring
|
|
146
147
|
JSON.parse(line).each do |sample|
|
147
148
|
@samples.push(sample)
|
148
149
|
end
|
149
|
-
rescue
|
150
|
+
rescue StandardError => e
|
150
151
|
STDOUT.puts("Could not parse " + line.inspect()) rescue nil
|
151
152
|
STDERR.puts([[e.class.name, e.message].join(": "),
|
152
153
|
e.backtrace.join("\n")].join("\n")) rescue nil
|
@@ -162,8 +163,8 @@ module Monitoring
|
|
162
163
|
STDOUT.puts("Could not post sample (will requeue): " + samples.inspect()) rescue nil
|
163
164
|
STDERR.puts([[e.class.name, e.message].join(": "),
|
164
165
|
e.backtrace.join("\n")].join("\n")) rescue nil
|
165
|
-
samples.each
|
166
|
-
rescue
|
166
|
+
samples.each { |s| @samples.push(s) }
|
167
|
+
rescue StandardError => e
|
167
168
|
STDOUT.puts("Could not post sample (will not requeue): " + samples.inspect()) rescue nil
|
168
169
|
STDERR.puts([[e.class.name, e.message].join(": "),
|
169
170
|
e.backtrace.join("\n")].join("\n")) rescue nil
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Monitoring
|
2
|
+
module Client
|
3
|
+
class Compiler
|
4
|
+
|
5
|
+
class << self
|
6
|
+
|
7
|
+
def compile(profiler, routine)
|
8
|
+
decorations = profiler.decorations.reject { |k, v| v.nil? }
|
9
|
+
now = Time.now()
|
10
|
+
routine.metrics.inject([]) do |compilation, metric_tuple|
|
11
|
+
metric_name, metric = metric_tuple
|
12
|
+
compilation.push({
|
13
|
+
"program_name" => profiler.program_name,
|
14
|
+
"routine_name" => routine.name,
|
15
|
+
"metric_name" => metric_name,
|
16
|
+
"metric_units" => metric.units,
|
17
|
+
"sample_value" => metric.value,
|
18
|
+
"sampled_at" => now,
|
19
|
+
"decorations" => decorations,
|
20
|
+
})
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Monitoring
|
2
|
+
module Client
|
3
|
+
class Config
|
4
|
+
|
5
|
+
require "yaml"
|
6
|
+
|
7
|
+
class << self
|
8
|
+
|
9
|
+
def global
|
10
|
+
@@global ||= Config.new
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
DEFAULT_FILENAME = "/usr/local/etc/monitoring-client.yml"
|
15
|
+
|
16
|
+
attr_accessor :hostname, :hostgroup
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
self.hostname = get_hostname
|
20
|
+
self.hostgroup = nil
|
21
|
+
load()
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def load(filename = DEFAULT_FILENAME)
|
26
|
+
c = YAML.load_file(filename)
|
27
|
+
self.hostname = c[:hostname]
|
28
|
+
self.hostgroup = c[:hostgroup]
|
29
|
+
self
|
30
|
+
rescue Errno::ENOENT => e
|
31
|
+
# Squelch missing file if default
|
32
|
+
raise(e) unless filename == DEFAULT_FILENAME
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_hostname
|
36
|
+
%x(hostname).strip
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -4,20 +4,42 @@ module Monitoring
|
|
4
4
|
|
5
5
|
require "json"
|
6
6
|
require "socket"
|
7
|
+
require "monitoring/client/config"
|
8
|
+
require "monitoring/client/compiler"
|
7
9
|
require "monitoring/client/routine"
|
8
|
-
|
9
10
|
|
10
|
-
|
11
|
-
|
11
|
+
attr_accessor :config, :program_name, :decorations
|
12
|
+
|
13
|
+
def initialize(program_name, decorations = {})
|
14
|
+
self.config = Config.global
|
15
|
+
self.program_name = program_name
|
16
|
+
self.decorations = default_decorations.merge(decorations)
|
12
17
|
end
|
13
18
|
|
14
19
|
|
15
20
|
def routine(routine_name)
|
16
21
|
routine = Routine.new(routine_name)
|
17
22
|
yield(routine)
|
18
|
-
|
23
|
+
compiled = compile(routine)
|
24
|
+
post_metrics(compiled)
|
25
|
+
routine
|
26
|
+
end
|
27
|
+
|
28
|
+
def compile(routine)
|
29
|
+
Compiler.compile(self, routine)
|
30
|
+
end
|
31
|
+
|
32
|
+
def post_metrics(compiled)
|
33
|
+
UDPSocket.new().send(compiled.to_json + "\n",
|
19
34
|
0, "localhost", 57475)
|
20
35
|
end
|
36
|
+
|
37
|
+
def default_decorations
|
38
|
+
{
|
39
|
+
:hostname => config.hostname,
|
40
|
+
:hostgroup => config.hostgroup,
|
41
|
+
}
|
42
|
+
end
|
21
43
|
|
22
44
|
end
|
23
45
|
end
|
@@ -4,9 +4,10 @@ module Monitoring
|
|
4
4
|
|
5
5
|
require "monitoring/client/metric"
|
6
6
|
|
7
|
+
attr_reader :name, :metrics
|
7
8
|
|
8
|
-
def initialize(
|
9
|
-
@
|
9
|
+
def initialize(name)
|
10
|
+
@name = name
|
10
11
|
@metrics = Hash.new do |h, k| h[k] = Metric.new(k) end
|
11
12
|
end
|
12
13
|
|
@@ -18,25 +19,10 @@ module Monitoring
|
|
18
19
|
@metrics[metric_name].units = "s"
|
19
20
|
end
|
20
21
|
|
21
|
-
def count(metric_name, increment_by, units = nil)
|
22
|
+
def count(metric_name, increment_by = 1, units = nil)
|
22
23
|
@metrics[metric_name].value = (@metrics[metric_name].value || 0) + increment_by
|
23
24
|
@metrics[metric_name].units = units
|
24
|
-
end
|
25
|
-
|
26
|
-
def compile(program_name)
|
27
|
-
@metrics.inject([]) do |compilation, metric_tuple|
|
28
|
-
metric_name, metric = metric_tuple
|
29
|
-
compilation.push({
|
30
|
-
"program_name" => program_name,
|
31
|
-
"routine_name" => @routine_name,
|
32
|
-
"metric_name" => metric_name,
|
33
|
-
"metric_units" => metric.units,
|
34
|
-
"sample_value" => metric.value,
|
35
|
-
"sampled_at" => Time.now(),
|
36
|
-
})
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
25
|
+
end
|
40
26
|
end
|
41
27
|
end
|
42
28
|
end
|
data/monitoring-client.gemspec
CHANGED
@@ -0,0 +1,70 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
require "monitoring/client/profiler"
|
4
|
+
|
5
|
+
module Monitoring::Client
|
6
|
+
describe Compiler do
|
7
|
+
|
8
|
+
def mk_metrics(n)
|
9
|
+
metrics = {}
|
10
|
+
n.times do |i|
|
11
|
+
name = "metric-#{i+1}"
|
12
|
+
metric = double(name)
|
13
|
+
metric.stub(:value).
|
14
|
+
and_return(i+1)
|
15
|
+
metric.stub(:units).
|
16
|
+
and_return("units-#{i+1}")
|
17
|
+
metrics[name] = metric
|
18
|
+
end
|
19
|
+
metrics
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should compile properly" do
|
23
|
+
profiler = double("profiler")
|
24
|
+
profiler.stub(:name).
|
25
|
+
and_return("sample-profiler")
|
26
|
+
profiler.stub(:decorations).
|
27
|
+
and_return({:foo => :bar})
|
28
|
+
routine = double("routine")
|
29
|
+
routine.stub(:name).
|
30
|
+
and_return("sample-routine")
|
31
|
+
routine.stub(:metrics).
|
32
|
+
and_return(mk_metrics(3))
|
33
|
+
|
34
|
+
now = Time.now
|
35
|
+
Time.stub(:now).
|
36
|
+
and_return(now)
|
37
|
+
|
38
|
+
expected = [
|
39
|
+
{
|
40
|
+
"program_name" => "sample-profiler",
|
41
|
+
"routine_name" => "sample-routine",
|
42
|
+
"metric_name" => "metric-1",
|
43
|
+
"metric_units" => "units-1",
|
44
|
+
"sample_value" => 1,
|
45
|
+
"sampled_at" => now,
|
46
|
+
"decorations" => {:foo => :bar},
|
47
|
+
},
|
48
|
+
{
|
49
|
+
"program_name" => "sample-profiler",
|
50
|
+
"routine_name" => "sample-routine",
|
51
|
+
"metric_name" => "metric-2",
|
52
|
+
"metric_units" => "units-2",
|
53
|
+
"sample_value" => 2,
|
54
|
+
"sampled_at" => now,
|
55
|
+
"decorations" => {:foo => :bar},
|
56
|
+
},
|
57
|
+
{
|
58
|
+
"program_name" => "sample-profiler",
|
59
|
+
"routine_name" => "sample-routine",
|
60
|
+
"metric_name" => "metric-3",
|
61
|
+
"metric_units" => "units-3",
|
62
|
+
"sample_value" => 3,
|
63
|
+
"sampled_at" => now,
|
64
|
+
"decorations" => {:foo => :bar},
|
65
|
+
},
|
66
|
+
]
|
67
|
+
Compiler.compile(profiler, routine).should eq(expected)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/spec/config_spec.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
require "monitoring/client/profiler"
|
4
|
+
|
5
|
+
module Monitoring::Client
|
6
|
+
describe Profiler do
|
7
|
+
|
8
|
+
it "should post metrics" do
|
9
|
+
p = Profiler.new("program_name")
|
10
|
+
p.decorations.should be_a Hash
|
11
|
+
p.decorations.should include :hostname
|
12
|
+
routine = double("routine")
|
13
|
+
Routine.stub(:new).
|
14
|
+
and_return(routine)
|
15
|
+
compiled_routine = double("compiled_routine")
|
16
|
+
p.should_receive(:compile).
|
17
|
+
with(routine).
|
18
|
+
and_return(compiled_routine)
|
19
|
+
p.should_receive(:post_metrics).
|
20
|
+
with(compiled_routine).
|
21
|
+
and_return(true)
|
22
|
+
p.routine("routine_name") {}
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should decorate with the hostname" do
|
26
|
+
p = Profiler.new("program_name")
|
27
|
+
p.decorations.should include(:hostname)
|
28
|
+
p.decorations[:hostname].should eq(Config.global.hostname)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/spec/spec_helper.rb
ADDED
File without changes
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: monitoring-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 2
|
10
|
+
version: 0.2.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Marc Bowes
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-08-27 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -32,6 +32,20 @@ dependencies:
|
|
32
32
|
version: "0"
|
33
33
|
type: :runtime
|
34
34
|
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: rspec
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
47
|
+
type: :development
|
48
|
+
version_requirements: *id002
|
35
49
|
description: Ruby client which uses UDP to communicate with a daemon which uses HTTP POST to communicate with a Web server
|
36
50
|
email:
|
37
51
|
- marcbowes+monitoring+client@gmail.com
|
@@ -48,11 +62,17 @@ files:
|
|
48
62
|
- Rakefile
|
49
63
|
- bin/monitoringd
|
50
64
|
- lib/monitoring.rb
|
65
|
+
- lib/monitoring/client/compiler.rb
|
66
|
+
- lib/monitoring/client/config.rb
|
51
67
|
- lib/monitoring/client/metric.rb
|
52
68
|
- lib/monitoring/client/profiler.rb
|
53
69
|
- lib/monitoring/client/routine.rb
|
54
70
|
- lib/monitoring/client/version.rb
|
55
71
|
- monitoring-client.gemspec
|
72
|
+
- spec/compiler_spec.rb
|
73
|
+
- spec/config_spec.rb
|
74
|
+
- spec/profiler_spec.rb
|
75
|
+
- spec/spec_helper.rb
|
56
76
|
has_rdoc: true
|
57
77
|
homepage: http://rubygems.org/gems/monitoring-client
|
58
78
|
licenses: []
|
@@ -83,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
103
|
requirements: []
|
84
104
|
|
85
105
|
rubyforge_project: monitoring-client
|
86
|
-
rubygems_version: 1.
|
106
|
+
rubygems_version: 1.6.2
|
87
107
|
signing_key:
|
88
108
|
specification_version: 3
|
89
109
|
summary: Simple client & daemon to post metrics
|