rubix 0.0.6 → 0.0.7
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/VERSION +1 -1
- data/lib/rubix/models/item.rb +4 -0
- data/lib/rubix/sender.rb +51 -36
- data/spec/rubix/monitors/chef_monitor_spec.rb +0 -1
- data/spec/rubix/monitors/cluster_monitor_spec.rb +0 -1
- data/spec/rubix/sender_spec.rb +14 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/support/configliere_helper.rb +12 -0
- metadata +5 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.7
|
data/lib/rubix/models/item.rb
CHANGED
@@ -63,6 +63,10 @@ module Rubix
|
|
63
63
|
self.application_ids = properties[:application_ids]
|
64
64
|
end
|
65
65
|
|
66
|
+
def resource_name
|
67
|
+
"#{self.class.resource_name} #{self.key || self.id}"
|
68
|
+
end
|
69
|
+
|
66
70
|
def self.find_request options={}
|
67
71
|
request('item.get', 'hostids' => [options[:host_id]], 'filter' => {'key_' => options[:key], 'id' => options[:id]}, "select_applications" => "refer", "output" => "extend")
|
68
72
|
end
|
data/lib/rubix/sender.rb
CHANGED
@@ -28,51 +28,63 @@ module Rubix
|
|
28
28
|
def initialize settings
|
29
29
|
@settings = settings
|
30
30
|
confirm_settings
|
31
|
-
|
32
|
-
|
33
|
-
info("Forwarding for #{self.host.name}...") if settings['verbose']
|
31
|
+
if fast?
|
32
|
+
info("Forwarding for #{settings['host']}...") if settings['verbose']
|
34
33
|
else
|
35
34
|
initialize_hostgroups
|
36
35
|
initialize_templates
|
37
36
|
initialize_host
|
38
37
|
initialize_applications
|
39
|
-
info("Forwarding for #{
|
38
|
+
info("Forwarding for #{host.name}...") if settings['verbose']
|
40
39
|
end
|
41
40
|
end
|
42
41
|
|
43
|
-
def
|
44
|
-
settings['fast']
|
42
|
+
def fast?
|
43
|
+
settings['fast']
|
45
44
|
end
|
46
45
|
|
46
|
+
def auto_vivify?
|
47
|
+
!fast?
|
48
|
+
end
|
49
|
+
|
47
50
|
def initialize_hostgroups
|
48
|
-
self.host_groups = settings['host_groups'].split(',').flatten.compact.map { |group_name | HostGroup.
|
51
|
+
self.host_groups = settings['host_groups'].split(',').flatten.compact.map { |group_name | HostGroup.find_or_create(:name => group_name.strip) }
|
49
52
|
end
|
50
53
|
|
51
54
|
def initialize_templates
|
52
|
-
self.templates = (settings['templates'] || '').split(',').flatten.compact.map { |template_name | Template.
|
55
|
+
self.templates = (settings['templates'] || '').split(',').flatten.compact.map { |template_name | Template.find(:name => template_name.strip) }.compact
|
53
56
|
end
|
54
57
|
|
55
58
|
def initialize_host
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
end
|
61
|
-
# if settings['verbose']
|
62
|
-
# puts "Forwarding data for Host '#{settings['host']}' (#{host_id}) from #{settings['pipe']} to #{settings['server']}"
|
63
|
-
# puts "Creating Items in Application '#{settings['application']}' (#{application_id}) at #{settings['api_server']} as #{settings['username']}"
|
64
|
-
# end
|
59
|
+
self.host = (Host.find(:name => settings['host']) || Host.new(:name => settings['host']))
|
60
|
+
host.host_groups = host_groups
|
61
|
+
host.templates = templates
|
62
|
+
host.save
|
65
63
|
end
|
66
64
|
|
67
65
|
def initialize_applications
|
68
|
-
|
66
|
+
application_names = (settings['applications'] || '').split(',').flatten.compact
|
67
|
+
self.applications = []
|
68
|
+
application_names.each do |app_name|
|
69
|
+
app = Application.find(:name => app_name, :host_id => host.id)
|
70
|
+
if app
|
71
|
+
self.applications << app
|
72
|
+
else
|
73
|
+
app = Application.new(:name => app_name, :host_id => host.id)
|
74
|
+
if app.save
|
75
|
+
self.applications << app
|
76
|
+
else
|
77
|
+
warn("Could not create application '#{app_name}' for host #{host.name}")
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
69
81
|
end
|
70
82
|
|
71
83
|
def confirm_settings
|
72
84
|
raise ConnectionError.new("Must specify a Zabbix server to send data to.") unless settings['server']
|
73
85
|
raise Error.new("Must specify the path to a local configuraiton file") unless settings['configuration_file'] && File.file?(settings['configuration_file'])
|
74
86
|
raise ConnectionError.new("Must specify the name of a host to send data for.") unless settings['host']
|
75
|
-
raise ValidationError.new("Must define at least one host group.") if settings['host_groups'].nil? || settings['host_groups'].empty?
|
87
|
+
raise ValidationError.new("Must define at least one host group.") if auto_vivify? && (settings['host_groups'].nil? || settings['host_groups'].empty?)
|
76
88
|
end
|
77
89
|
|
78
90
|
#
|
@@ -80,7 +92,6 @@ module Rubix
|
|
80
92
|
#
|
81
93
|
|
82
94
|
def run
|
83
|
-
return unless alive?
|
84
95
|
case
|
85
96
|
when settings['pipe']
|
86
97
|
process_pipe
|
@@ -196,8 +207,8 @@ module Rubix
|
|
196
207
|
# Or when sending for another host:
|
197
208
|
#
|
198
209
|
# {
|
199
|
-
# '
|
200
|
-
# '
|
210
|
+
# 'host': 'shazaam',
|
211
|
+
# 'applications': 'silly',
|
201
212
|
# 'data': [
|
202
213
|
# {'key': 'foo.bar.baz', 'value': 10},
|
203
214
|
# {'key': 'snap.crackle.pop', 'value': 8 }
|
@@ -226,7 +237,6 @@ module Rubix
|
|
226
237
|
# present in the line.
|
227
238
|
begin
|
228
239
|
daughter_pipe = self.class.new(settings.stringify_keys.merge(json))
|
229
|
-
return unless daughter_pipe.alive?
|
230
240
|
rescue Error => e
|
231
241
|
error(e.message)
|
232
242
|
return
|
@@ -257,9 +267,23 @@ module Rubix
|
|
257
267
|
# If the +key+ doesn't exist for this local agent's host, it will be
|
258
268
|
# added.
|
259
269
|
def send key, value, timestamp
|
260
|
-
|
261
|
-
|
262
|
-
|
270
|
+
ensure_item_exists(key, value) unless fast?
|
271
|
+
command = "#{settings['sender']} --config #{settings['configuration_file']} --zabbix-server #{settings['server']} --host #{settings['host']} --key #{key} --value '#{value}'"
|
272
|
+
process_zabbix_sender_output(key, `#{command}`)
|
273
|
+
|
274
|
+
# command = "zabbix_sender --config #{configuration_file} --zabbix-server #{server} --input-file - --with-timestamps"
|
275
|
+
# open(command, 'w') do |zabbix_sender|
|
276
|
+
# zabbix_sender.write([settings['host'], key, timestamp.to_i, value].map(&:to_s).join("\t"))
|
277
|
+
# zabbix_sender.close_write
|
278
|
+
# process_zabbix_sender_output(zabbix_sender.read)
|
279
|
+
# end
|
280
|
+
end
|
281
|
+
|
282
|
+
def ensure_item_exists key, value
|
283
|
+
item = Item.find(:key => key, :host_id => host.id)
|
284
|
+
unless item
|
285
|
+
Item.new(:key => key, :host_id => host.id, :applications => applications, :value_type => Item.value_type_from_value(value)).save
|
286
|
+
|
263
287
|
# There is a time lag of about 15-30 seconds between (successfully)
|
264
288
|
# creating an item on the Zabbix server and having the Zabbix accept
|
265
289
|
# new data for that item.
|
@@ -274,17 +298,8 @@ module Rubix
|
|
274
298
|
# points you send to Zabbix, then don't worry about it.
|
275
299
|
sleep settings['create_item_sleep']
|
276
300
|
end
|
277
|
-
command = "#{settings['sender']} --config #{settings['configuration_file']} --zabbix-server #{settings['server']} --host #{settings['host']} --key #{key} --value '#{value}'"
|
278
|
-
process_zabbix_sender_output(key, `#{command}`)
|
279
|
-
|
280
|
-
# command = "zabbix_sender --config #{configuration_file} --zabbix-server #{server} --input-file - --with-timestamps"
|
281
|
-
# open(command, 'w') do |zabbix_sender|
|
282
|
-
# zabbix_sender.write([settings['host'], key, timestamp.to_i, value].map(&:to_s).join("\t"))
|
283
|
-
# zabbix_sender.close_write
|
284
|
-
# process_zabbix_sender_output(zabbix_sender.read)
|
285
|
-
# end
|
286
301
|
end
|
287
|
-
|
302
|
+
|
288
303
|
# Parse the +text+ output by +zabbix_sender+.
|
289
304
|
def process_zabbix_sender_output key, text
|
290
305
|
return unless settings['verbose']
|
data/spec/rubix/sender_spec.rb
CHANGED
@@ -3,6 +3,20 @@ require 'spec_helper'
|
|
3
3
|
describe Rubix::Sender do
|
4
4
|
|
5
5
|
before do
|
6
|
+
@config_file = Tempfile.new('sender', '/tmp')
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "running in --fast mode" do
|
10
|
+
|
11
|
+
it "should not attempt to make any calls to the Zabbix API when writing values" do
|
12
|
+
Rubix.connection.should_not_receive(:request)
|
13
|
+
@sender = Rubix::Sender.new(mock_settings('configuration_file' => @config_file.path, 'host' => 'foohost', 'server' => 'fooserver', 'fast' => true, 'sender' => 'echo'))
|
14
|
+
@sender.process_line("foo.bar.baz 123\n")
|
15
|
+
@sender.process_line({:host => 'newhost', :host_groups => 'foobar,baz', :data => [{:key => 'foo.bar.baz', :value => 123}]}.to_json)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "running in auto-vivify mode" do
|
6
20
|
end
|
7
21
|
|
8
22
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'tempfile'
|
1
2
|
require 'rspec'
|
2
3
|
|
3
4
|
RUBIX_ROOT = File.expand_path(__FILE__, '../../lib')
|
@@ -12,6 +13,7 @@ RSpec.configure do |config|
|
|
12
13
|
config.mock_with :rspec
|
13
14
|
config.include Rubix::ResponseSpecs
|
14
15
|
config.include Rubix::IntegrationHelper
|
16
|
+
config.include Rubix::ConfigliereHelper
|
15
17
|
|
16
18
|
test_yml_path = File.expand_path('../test.yml', __FILE__)
|
17
19
|
if File.exist?(test_yml_path)
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 7
|
10
|
+
version: 0.0.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Dhruv Bansal
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-11-
|
18
|
+
date: 2011-11-23 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: rspec
|
@@ -117,6 +117,7 @@ files:
|
|
117
117
|
- spec/spec_helper.rb
|
118
118
|
- spec/support/integration_helper.rb
|
119
119
|
- spec/support/response_helper.rb
|
120
|
+
- spec/support/configliere_helper.rb
|
120
121
|
- LICENSE
|
121
122
|
- README.rdoc
|
122
123
|
- VERSION
|