rubix 0.0.12 → 0.1.0

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 CHANGED
@@ -1 +1 @@
1
- 0.0.12
1
+ 0.1.0
@@ -10,6 +10,7 @@ module Rubix
10
10
 
11
11
  autoload :BelongsToHost, 'rubix/associations/belongs_to_host'
12
12
  autoload :BelongsToTemplate, 'rubix/associations/belongs_to_template'
13
+ autoload :BelongsToItem, 'rubix/associations/belongs_to_item'
13
14
 
14
15
  end
15
16
  end
@@ -0,0 +1,34 @@
1
+ module Rubix
2
+ module Associations
3
+
4
+ module BelongsToItem
5
+
6
+ def item= i
7
+ return unless i
8
+ @item = i
9
+ @item_id = i.id
10
+ end
11
+
12
+ def item
13
+ return @item if @item
14
+ return unless @item_id
15
+ @item = Item.find(:id => @item_id)
16
+ end
17
+
18
+ def item_id= iid
19
+ puts "I AM TRYING TO SET ITEM_ID=#{iid}"
20
+ return unless iid
21
+ @item_id = iid
22
+ end
23
+
24
+ def item_id
25
+ return @item_id if @item_id
26
+ return unless @item
27
+ @item_id = @item.id
28
+ end
29
+
30
+ end
31
+ end
32
+ end
33
+
34
+
data/lib/rubix/models.rb CHANGED
@@ -7,4 +7,5 @@ module Rubix
7
7
  autoload :Application, 'rubix/models/application'
8
8
  autoload :UserMacro, 'rubix/models/user_macro'
9
9
  autoload :Trigger, 'rubix/models/trigger'
10
+ autoload :TimeSeries, 'rubix/models/time_series'
10
11
  end
@@ -59,7 +59,7 @@ module Rubix
59
59
  self::VALUE_CODES[value_type_from_value(value)]
60
60
  end
61
61
 
62
- attr_accessor :key, :description
62
+ attr_accessor :key, :description, :units
63
63
  attr_writer :type, :value_type
64
64
 
65
65
  def initialize properties={}
@@ -67,6 +67,7 @@ module Rubix
67
67
  @key = properties[:key]
68
68
  @description = properties[:description]
69
69
  @type = properties[:type]
70
+ @units = properties[:units]
70
71
 
71
72
  self.value_type = properties[:value_type]
72
73
 
@@ -110,9 +111,10 @@ module Rubix
110
111
  :description => (description || 'Unknown'),
111
112
  :type => self.class::TYPE_CODES[type],
112
113
  :key_ => key,
113
- :value_type => self.class::VALUE_CODES[value_type],
114
+ :value_type => self.class::VALUE_CODES[value_type]
114
115
  }.tap do |p|
115
116
  p[:applications] = application_ids if application_ids
117
+ p[:units] = units if units
116
118
  end
117
119
  end
118
120
 
@@ -122,12 +124,14 @@ module Rubix
122
124
 
123
125
  def self.find_params options={}
124
126
  super().merge({
125
- :hostids => [options[:host_id]],
126
127
  :filter => {
127
128
  :key_ => options[:key],
128
129
  :id => options[:id]
129
130
  }
130
- })
131
+ }.tap do |o|
132
+ o[:hostids] = [options[:host_id]] if options[:host_id]
133
+ end
134
+ )
131
135
  end
132
136
 
133
137
  def self.build item
@@ -138,9 +142,14 @@ module Rubix
138
142
  :type => TYPE_NAMES[item['type'].to_i],
139
143
  :value_type => VALUE_NAMES[item['value_type'].to_i],
140
144
  :application_ids => (item['applications'] || []).map { |app| app['applicationid'].to_i },
141
- :key => item['key_']
145
+ :key => item['key_'],
146
+ :units => item['units']
142
147
  })
143
148
  end
149
+
150
+ def time_series options={}
151
+ TimeSeries.find(options.merge(:item_id => self.id, :item => self))
152
+ end
144
153
 
145
154
  end
146
155
  end
@@ -0,0 +1,101 @@
1
+ module Rubix
2
+
3
+ class TimeSeries < Model
4
+
5
+ #
6
+ # == Properties & Finding ==
7
+ #
8
+
9
+ attr_writer :from, :upto
10
+ attr_writer :raw_data
11
+
12
+ def initialize properties={}
13
+ super(properties)
14
+ @from = properties[:from]
15
+ @upto = properties[:upto]
16
+
17
+ self.item = properties[:item]
18
+ self.item_id = properties[:item_id]
19
+ puts "MY ITEM ID IS #{self.item_id}"
20
+ end
21
+
22
+ def self.zabbix_name
23
+ 'history'
24
+ end
25
+
26
+ def self.default_from
27
+ (Time.now - 3600).utc
28
+ end
29
+
30
+ def from
31
+ @from ||= self.class.default_from
32
+ end
33
+
34
+ def self.default_upto
35
+ Time.now.utc
36
+ end
37
+
38
+ def upto
39
+ @upto ||= self.class.default_upto
40
+ end
41
+
42
+ def raw_data
43
+ @raw_data ||= []
44
+ end
45
+
46
+ #
47
+ # == Associations ==
48
+ #
49
+
50
+ include Associations::BelongsToItem
51
+
52
+ #
53
+ # == Requests ==
54
+ #
55
+
56
+ def self.get_params
57
+ super().merge(:output => :extend)
58
+ end
59
+
60
+ def self.find_params options={}
61
+ super().merge({
62
+ :itemids => [options[:item_id].to_s],
63
+ :time_from => (options[:from] || default_from).to_i.to_s,
64
+ :time_till => (options[:upto] || default_upto).to_i.to_s
65
+ })
66
+ end
67
+
68
+ def self.find options={}
69
+ response = find_request(options)
70
+ case
71
+ when response.success?
72
+ new(options.merge(:raw_data => response.result))
73
+ else
74
+ error("Error finding #{resource_name} using #{options.inspect}: #{response.error_message}")
75
+ end
76
+ end
77
+
78
+ #
79
+ # == Transformations ==
80
+ #
81
+
82
+ def parsed_data
83
+ return @parsed_data if @parsed_data
84
+ caster = case
85
+ when item.nil? then nil
86
+ when item.value_type == :float then :to_f
87
+ when item.value_type == :unsigned_int then :to_i
88
+ end
89
+ @parsed_data = raw_data.map do |point|
90
+ next unless point.is_a?(Hash) && point['clock'] && point['value']
91
+ timestamp = point['clock'].to_i
92
+ next if timestamp == 0
93
+ {
94
+ 'time' => Time.at(timestamp),
95
+ 'value' => (caster ? point['value'].send(caster) : point['value'])
96
+ }
97
+ end.compact
98
+ end
99
+
100
+ end
101
+ end
@@ -22,7 +22,7 @@ describe "Items" do
22
22
  end
23
23
 
24
24
  it "can be created" do
25
- item = Rubix::Item.new(:key => 'rubix.spec1', :description => 'rubix item description 1', :host_id => @host_1.id, :value_type => :character, :applications => [@app_1])
25
+ item = Rubix::Item.new(:key => 'rubix.spec1', :description => 'rubix item description 1', :host_id => @host_1.id, :value_type => :character, :applications => [@app_1], :units => 'B')
26
26
  item.save.should be_true
27
27
  item.host.name.should == @host_1.name
28
28
  item.applications.map(&:name).should include(@app_1.name)
@@ -33,7 +33,7 @@ describe "Items" do
33
33
  describe "when existing" do
34
34
 
35
35
  before do
36
- @item = ensure_save(Rubix::Item.new(:key => 'rubix.spec1', :description => 'rubix item description 1', :host_id => @host_1.id, :value_type => :character, :applications => [@app_1]))
36
+ @item = ensure_save(Rubix::Item.new(:key => 'rubix.spec1', :description => 'rubix item description 1', :host_id => @host_1.id, :value_type => :character, :applications => [@app_1], :units => 'B'))
37
37
  end
38
38
 
39
39
  it "can have its host, application, and properties updated" do
@@ -42,6 +42,7 @@ describe "Items" do
42
42
  @item.type = :external
43
43
  @item.value_type = :unsigned_int
44
44
  @item.host_id = @host_2.id
45
+ @item.units = 'MB'
45
46
  @item.applications = [@app_2]
46
47
  @item.save.should be_true
47
48
 
@@ -52,6 +53,7 @@ describe "Items" do
52
53
  new_item.value_type.should == :unsigned_int
53
54
  new_item.type.should == :external
54
55
  new_item.host.name.should == @host_2.name
56
+ new_item.units.should == 'MB'
55
57
  new_item.applications.map(&:name).should include(@app_2.name)
56
58
  end
57
59
 
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe "TimeSeries" do
4
+
5
+ before do
6
+ integration_test
7
+ @host_group = ensure_save(Rubix::HostGroup.new(:name => 'rubix_spec_host_group_1'))
8
+ @host = ensure_save(Rubix::Host.new(:name => 'rubix_spec_host_1', :host_groups => [@host_group]))
9
+ end
10
+
11
+ after do
12
+ truncate_all_tables
13
+ end
14
+
15
+ describe "setting a timeframe" do
16
+
17
+ it "should set a default timeframe" do
18
+ Rubix::TimeSeries.new.from.should_not be_nil
19
+ Rubix::TimeSeries.new.upto.should_not be_nil
20
+ end
21
+
22
+ it "should accept a given timeframe when querying" do
23
+ Rubix::TimeSeries.find_params(:item_id => 100, :from => '1327543430', :upto => Time.at(1327543450))[:time_from].should == '1327543430'
24
+ Rubix::TimeSeries.find_params(:item_id => 100, :from => '1327543430', :upto => Time.at(1327543450))[:time_till].should == '1327543450'
25
+ end
26
+ end
27
+
28
+
29
+ describe "when the item doesn't exist" do
30
+
31
+ it "returns an empty TimeSeries" do
32
+ @ts = Rubix::TimeSeries.find(:item_id => 100)
33
+ @ts.should_not be_nil
34
+ @ts.raw_data.should be_empty
35
+ @ts.parsed_data.should be_empty
36
+ end
37
+
38
+ end
39
+
40
+ describe "when the item exists" do
41
+
42
+ before do
43
+ @item = ensure_save(Rubix::Item.new(:host_id => @host.id, :key => 'foo.bar.baz', :value_type => :unsigned_int, :description => "rubix item description"))
44
+ end
45
+
46
+ it "should parse the results properly" do
47
+ @ts = Rubix::TimeSeries.find(:item_id => @item.id)
48
+ @ts.should_not be_nil
49
+ @ts.should_receive(:raw_data).and_return([{'clock' => '1327543429', 'value' => '3'}, {'clock' => '1327543430'}])
50
+ @ts.parsed_data.should == [{'time' => Time.at(1327543429), 'value' => 3}]
51
+ end
52
+
53
+ end
54
+ end
55
+
@@ -20,7 +20,7 @@ describe Rubix::Monitor do
20
20
 
21
21
  it "should be the default behavior when run with no arguments" do
22
22
  ::ARGV.replace([])
23
- $stdout.should_receive(:puts).with(@measurement)
23
+ $stdout.should_receive(:puts).with(/data/)
24
24
  @wrapper.run
25
25
  end
26
26
 
@@ -47,13 +47,13 @@ describe Rubix::Monitor do
47
47
  it "should create a new file if called with a path that doesn't exist" do
48
48
  FileUtils.rm(@file.path) if File.exist?(@file.path)
49
49
  @wrapper.run
50
- File.read(@file.path).should include(@measurement)
50
+ File.read(@file.path).should match(/data/)
51
51
  end
52
52
 
53
53
  it "should append to an existing file" do
54
54
  File.open(@file.path, 'w') { |f| f.puts('old content') }
55
55
  @wrapper.run
56
- File.read(@file.path).should include(@measurement)
56
+ File.read(@file.path).should match(/data/)
57
57
  File.read(@file.path).should include('old content')
58
58
  end
59
59
  end
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubix
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
5
- prerelease:
4
+ prerelease: false
6
5
  segments:
7
6
  - 0
7
+ - 1
8
8
  - 0
9
- - 12
10
- version: 0.0.12
9
+ version: 0.1.0
11
10
  platform: ruby
12
11
  authors:
13
12
  - Dhruv Bansal
@@ -15,7 +14,8 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2011-12-16 00:00:00 Z
17
+ date: 2012-02-01 00:00:00 -06:00
18
+ default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rspec
@@ -25,7 +25,6 @@ dependencies:
25
25
  requirements:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
- hash: 3
29
28
  segments:
30
29
  - 0
31
30
  version: "0"
@@ -39,7 +38,6 @@ dependencies:
39
38
  requirements:
40
39
  - - ">="
41
40
  - !ruby/object:Gem::Version
42
- hash: 3
43
41
  segments:
44
42
  - 0
45
43
  version: "0"
@@ -53,7 +51,6 @@ dependencies:
53
51
  requirements:
54
52
  - - ">="
55
53
  - !ruby/object:Gem::Version
56
- hash: 3
57
54
  segments:
58
55
  - 0
59
56
  version: "0"
@@ -67,7 +64,6 @@ dependencies:
67
64
  requirements:
68
65
  - - ">="
69
66
  - !ruby/object:Gem::Version
70
- hash: 31
71
67
  segments:
72
68
  - 0
73
69
  - 4
@@ -96,6 +92,7 @@ files:
96
92
  - lib/rubix/models/host.rb
97
93
  - lib/rubix/models/host_group.rb
98
94
  - lib/rubix/models/model.rb
95
+ - lib/rubix/models/time_series.rb
99
96
  - lib/rubix/models/application.rb
100
97
  - lib/rubix/examples/es_monitor.rb
101
98
  - lib/rubix/examples/mongo_monitor.rb
@@ -110,6 +107,7 @@ files:
110
107
  - lib/rubix/associations/belongs_to_template.rb
111
108
  - lib/rubix/associations/has_many_host_groups.rb
112
109
  - lib/rubix/associations/belongs_to_host.rb
110
+ - lib/rubix/associations/belongs_to_item.rb
113
111
  - lib/rubix/associations/has_many_items.rb
114
112
  - lib/rubix/associations/has_many_templates.rb
115
113
  - lib/rubix/associations/has_many_user_macros.rb
@@ -125,6 +123,7 @@ files:
125
123
  - spec/rubix/response_spec.rb
126
124
  - spec/rubix/sender_spec.rb
127
125
  - spec/rubix/connection_spec.rb
126
+ - spec/requests/time_series_request_spec.rb
128
127
  - spec/requests/item_request_spec.rb
129
128
  - spec/requests/host_group_request_spec.rb
130
129
  - spec/requests/user_macro_request_spec.rb
@@ -139,6 +138,7 @@ files:
139
138
  - LICENSE
140
139
  - README.rdoc
141
140
  - VERSION
141
+ has_rdoc: true
142
142
  homepage: http://github.com/dhruvbansal/rubix
143
143
  licenses: []
144
144
 
@@ -152,7 +152,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
152
152
  requirements:
153
153
  - - ">="
154
154
  - !ruby/object:Gem::Version
155
- hash: 3
156
155
  segments:
157
156
  - 0
158
157
  version: "0"
@@ -161,14 +160,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
160
  requirements:
162
161
  - - ">="
163
162
  - !ruby/object:Gem::Version
164
- hash: 3
165
163
  segments:
166
164
  - 0
167
165
  version: "0"
168
166
  requirements: []
169
167
 
170
168
  rubyforge_project:
171
- rubygems_version: 1.8.5
169
+ rubygems_version: 1.3.7
172
170
  signing_key:
173
171
  specification_version: 3
174
172
  summary: A Ruby client for configuring and writing data to Zabbix