riemann-babbler 0.0.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/Gemfile +13 -0
- data/Gemfile.lock +47 -0
- data/Rakefile +1 -0
- data/bin/riemann-babbler.rb +66 -0
- data/config.yml +16 -0
- data/lib/deep_merge.rb +48 -0
- data/lib/riemann/babbler/plugin.rb +77 -0
- data/lib/riemann/babbler/plugins/dummy.rb +25 -0
- data/lib/riemann/version.rb +3 -0
- data/riemann-babbler.gemspec +25 -0
- metadata +156 -0
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
awesome_print (1.1.0)
|
5
|
+
beefcake (0.3.7)
|
6
|
+
coderay (1.0.9)
|
7
|
+
configatron (2.10.0)
|
8
|
+
yamler (>= 0.1.0)
|
9
|
+
diff-lcs (1.2.2)
|
10
|
+
logger (1.2.8)
|
11
|
+
method_source (0.8.1)
|
12
|
+
mtrc (0.0.4)
|
13
|
+
parallel (0.6.4)
|
14
|
+
pry (0.9.12)
|
15
|
+
coderay (~> 1.0.5)
|
16
|
+
method_source (~> 0.8)
|
17
|
+
slop (~> 3.4)
|
18
|
+
rake (10.0.4)
|
19
|
+
riemann-client (0.2.1)
|
20
|
+
beefcake (>= 0.3.5)
|
21
|
+
mtrc (>= 0.0.4)
|
22
|
+
trollop (>= 1.16.2)
|
23
|
+
rspec (2.13.0)
|
24
|
+
rspec-core (~> 2.13.0)
|
25
|
+
rspec-expectations (~> 2.13.0)
|
26
|
+
rspec-mocks (~> 2.13.0)
|
27
|
+
rspec-core (2.13.1)
|
28
|
+
rspec-expectations (2.13.0)
|
29
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
30
|
+
rspec-mocks (2.13.0)
|
31
|
+
slop (3.4.3)
|
32
|
+
trollop (2.0)
|
33
|
+
yamler (0.1.0)
|
34
|
+
|
35
|
+
PLATFORMS
|
36
|
+
ruby
|
37
|
+
|
38
|
+
DEPENDENCIES
|
39
|
+
awesome_print
|
40
|
+
configatron
|
41
|
+
logger
|
42
|
+
parallel
|
43
|
+
pry
|
44
|
+
rake
|
45
|
+
riemann-client
|
46
|
+
rspec
|
47
|
+
trollop
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
@@ -0,0 +1,66 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#encoding: utf-8
|
3
|
+
|
4
|
+
require 'trollop'
|
5
|
+
require 'yaml'
|
6
|
+
require 'configatron'
|
7
|
+
require 'parallel'
|
8
|
+
require 'logger'
|
9
|
+
|
10
|
+
require File.expand_path('../../lib/riemann/version', __FILE__)
|
11
|
+
require File.expand_path('../../lib/deep_merge', __FILE__)
|
12
|
+
require File.expand_path('../../lib/riemann/babbler/plugin', __FILE__)
|
13
|
+
|
14
|
+
opts = Trollop::options do
|
15
|
+
version "Riemann babbler #{Babbler::VERSION}"
|
16
|
+
banner <<-EOS
|
17
|
+
Riemann-babbler is plugin manager for riemann-tools.
|
18
|
+
|
19
|
+
Usage:
|
20
|
+
riemann-babbler [options]
|
21
|
+
where [options] are:
|
22
|
+
EOS
|
23
|
+
|
24
|
+
opt :config, "Config file", :default => "/etc/riemann-babbler/config.yml"
|
25
|
+
end
|
26
|
+
|
27
|
+
# logger
|
28
|
+
log = Logger.new(STDOUT)
|
29
|
+
|
30
|
+
# merge configs
|
31
|
+
config_file = if File.exist?( opts[:config] )
|
32
|
+
YAML.load_file( opts[:config] ).to_hash
|
33
|
+
else
|
34
|
+
log.error "Can't load config file #{opts[:config]}"
|
35
|
+
Hash.new
|
36
|
+
end
|
37
|
+
|
38
|
+
config_default = YAML.load_file( File.expand_path('../../config.yml', __FILE__) )
|
39
|
+
|
40
|
+
config = config_default.deep_merge( config_file )
|
41
|
+
configatron.configure_from_hash config
|
42
|
+
|
43
|
+
# отправляем к плагинам
|
44
|
+
$configatron = configatron
|
45
|
+
$logger = log
|
46
|
+
|
47
|
+
# get plugins
|
48
|
+
plugins = []
|
49
|
+
default_plugins_dir = File.expand_path('../../lib/riemann/babbler/plugins/', __FILE__)
|
50
|
+
Dir.glob( default_plugins_dir + "/*.rb" ) do |file|
|
51
|
+
plugins << file
|
52
|
+
end
|
53
|
+
|
54
|
+
unless configatron.plugins.dirs.nil?
|
55
|
+
configatron.plugins.dirs.each do |dir|
|
56
|
+
next unless Dir.exist? dir
|
57
|
+
Dir.glob( dir + "/*.rb" ) do |file|
|
58
|
+
plugins << file
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# start plugins
|
64
|
+
Parallel.each( plugins, :in_threads => plugins.count ) do |plugin|
|
65
|
+
require "#{plugin}"
|
66
|
+
end
|
data/config.yml
ADDED
data/lib/deep_merge.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# https://raw.github.com/Offirmo/hash-deep-merge/master/lib/hash_deep_merge.rb
|
2
|
+
class Hash
|
3
|
+
|
4
|
+
def deep_merge!(specialized_hash)
|
5
|
+
return internal_deep_merge!(self, specialized_hash)
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
def deep_merge(specialized_hash)
|
10
|
+
return internal_deep_merge!(Hash.new.replace(self), specialized_hash)
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
protected
|
15
|
+
|
16
|
+
# better, recursive, preserving method
|
17
|
+
# OK OK this is not the most efficient algorithm,
|
18
|
+
# but at last it's *perfectly clear and understandable*
|
19
|
+
# so fork and improve if you need 5% more speed, ok ?
|
20
|
+
def internal_deep_merge!(source_hash, specialized_hash)
|
21
|
+
|
22
|
+
#puts "starting deep merge..."
|
23
|
+
|
24
|
+
specialized_hash.each_pair do |rkey, rval|
|
25
|
+
#puts " potential replacing entry : " + rkey.inspect
|
26
|
+
|
27
|
+
if source_hash.has_key?(rkey) then
|
28
|
+
#puts " found potentially conflicting entry for #{rkey.inspect} : #{rval.inspect}, will merge :"
|
29
|
+
if rval.is_a?(Hash) and source_hash[rkey].is_a?(Hash) then
|
30
|
+
#puts " recursing..."
|
31
|
+
internal_deep_merge!(source_hash[rkey], rval)
|
32
|
+
elsif rval == source_hash[rkey] then
|
33
|
+
#puts " same value, skipping."
|
34
|
+
else
|
35
|
+
#puts " replacing."
|
36
|
+
source_hash[rkey] = rval
|
37
|
+
end
|
38
|
+
else
|
39
|
+
#puts " found new entry #{rkey.inspect}, adding it..."
|
40
|
+
source_hash[rkey] = rval
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
#puts "deep merge done."
|
45
|
+
|
46
|
+
return source_hash
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module Riemann
|
2
|
+
module Babbler
|
3
|
+
|
4
|
+
require 'riemann/client'
|
5
|
+
|
6
|
+
def self.included(base)
|
7
|
+
base.instance_eval do
|
8
|
+
def run
|
9
|
+
new.run
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@configatron = $configatron
|
17
|
+
super
|
18
|
+
end
|
19
|
+
|
20
|
+
def log
|
21
|
+
@logger ||= $logger
|
22
|
+
end
|
23
|
+
|
24
|
+
def options
|
25
|
+
@configatron
|
26
|
+
end
|
27
|
+
alias :opts :options
|
28
|
+
|
29
|
+
def report(event)
|
30
|
+
event[:tags] unless options.riemann.tags.nil?
|
31
|
+
riemann << event
|
32
|
+
end
|
33
|
+
|
34
|
+
def riemann
|
35
|
+
@riemann ||= Riemann::Client.new(
|
36
|
+
:host => options.riemann.host,
|
37
|
+
:port => options.riemann.port
|
38
|
+
)
|
39
|
+
end
|
40
|
+
alias :r :riemann
|
41
|
+
|
42
|
+
def run
|
43
|
+
t0 = Time.now
|
44
|
+
loop do
|
45
|
+
begin
|
46
|
+
tick
|
47
|
+
rescue => e
|
48
|
+
$stderr.puts "#{e.class} #{e}\n#{e.backtrace.join "\n"}"
|
49
|
+
end
|
50
|
+
|
51
|
+
# Sleep.
|
52
|
+
sleep(plugin.interval - ((Time.now - t0) % plugin.interval))
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Переодически вызываемое действие
|
57
|
+
def tick
|
58
|
+
end
|
59
|
+
|
60
|
+
# Доступ к конфигу определенного плагина
|
61
|
+
def plugin
|
62
|
+
end
|
63
|
+
|
64
|
+
# описание статуса
|
65
|
+
def state(my_state)
|
66
|
+
case
|
67
|
+
when my_state.between?(plugin.states.warning, plugin.states.critical)
|
68
|
+
'warning'
|
69
|
+
when my_state > plugin.states.warning
|
70
|
+
'critical'
|
71
|
+
else
|
72
|
+
'ok'
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Riemann::Babbler::Dummy
|
2
|
+
include Riemann::Babbler
|
3
|
+
|
4
|
+
def plugin
|
5
|
+
options.plugins.dummy
|
6
|
+
end
|
7
|
+
|
8
|
+
def status
|
9
|
+
Random.rand(100)
|
10
|
+
end
|
11
|
+
|
12
|
+
def tick
|
13
|
+
current_status = status
|
14
|
+
status = {
|
15
|
+
:service => plugin.service,
|
16
|
+
:metric => current_status,
|
17
|
+
:state => state(current_status)
|
18
|
+
}
|
19
|
+
log.debug "Report status: #{status.inspect}"
|
20
|
+
report status
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
Riemann::Babbler::Dummy.run
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/riemann/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "riemann-babbler"
|
6
|
+
s.version = Babbler::VERSION
|
7
|
+
s.authors = ["Vasiliev D.V."]
|
8
|
+
s.email = %w(vadv.mkn@gmail.com)
|
9
|
+
s.homepage = "https://github.com/vadv/riemann-babbler"
|
10
|
+
s.summary = %q{Riemann health cheker.}
|
11
|
+
s.description = %q{Some plugins mannager for riemann.}
|
12
|
+
s.licenses = %w(MIT)
|
13
|
+
|
14
|
+
s.add_dependency('riemann-client')
|
15
|
+
s.add_dependency('configatron')
|
16
|
+
s.add_dependency('logger')
|
17
|
+
s.add_dependency('trollop')
|
18
|
+
s.add_dependency('yaml')
|
19
|
+
s.add_dependency('parallel')
|
20
|
+
|
21
|
+
s.files = `git ls-files`.split("\n")
|
22
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
23
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
24
|
+
s.require_paths = %w(lib)
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,156 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: riemann-babbler
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Vasiliev D.V.
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-04-03 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: riemann-client
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: configatron
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: logger
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: trollop
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: yaml
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: parallel
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :runtime
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
description: Some plugins mannager for riemann.
|
111
|
+
email:
|
112
|
+
- vadv.mkn@gmail.com
|
113
|
+
executables:
|
114
|
+
- riemann-babbler.rb
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- Gemfile
|
119
|
+
- Gemfile.lock
|
120
|
+
- Rakefile
|
121
|
+
- bin/riemann-babbler.rb
|
122
|
+
- config.yml
|
123
|
+
- lib/deep_merge.rb
|
124
|
+
- lib/riemann/babbler/plugin.rb
|
125
|
+
- lib/riemann/babbler/plugins/dummy.rb
|
126
|
+
- lib/riemann/version.rb
|
127
|
+
- riemann-babbler.gemspec
|
128
|
+
homepage: https://github.com/vadv/riemann-babbler
|
129
|
+
licenses:
|
130
|
+
- MIT
|
131
|
+
post_install_message:
|
132
|
+
rdoc_options: []
|
133
|
+
require_paths:
|
134
|
+
- lib
|
135
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
136
|
+
none: false
|
137
|
+
requirements:
|
138
|
+
- - ! '>='
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '0'
|
141
|
+
segments:
|
142
|
+
- 0
|
143
|
+
hash: 4400440854509407224
|
144
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
150
|
+
requirements: []
|
151
|
+
rubyforge_project:
|
152
|
+
rubygems_version: 1.8.25
|
153
|
+
signing_key:
|
154
|
+
specification_version: 3
|
155
|
+
summary: Riemann health cheker.
|
156
|
+
test_files: []
|