zabbix 0.1.0 → 0.2.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.1.0
1
+ 0.2.0
@@ -1,9 +1,12 @@
1
1
  module Zabbix
2
2
  end
3
3
 
4
+ require "socket"
5
+ require "yajl"
4
6
  require "zabbix/agent/configuration"
5
7
  require "zabbix/sender"
6
8
  require "zabbix/sender/easy"
9
+ require "zabbix/sender/buffer"
7
10
 
8
11
  ## we could use zabbix-sender, but that appears to be unecessary; we can instead
9
12
  ## simply talk to the zabbit-server. we get there via the parent.
@@ -1,6 +1,3 @@
1
- require 'socket'
2
- require 'yajl'
3
-
4
1
  class Zabbix::Sender
5
2
 
6
3
  DEFAULT_SERVER_PORT = 10051
@@ -28,9 +25,16 @@ class Zabbix::Sender
28
25
 
29
26
 
30
27
  def connect
31
- TCPSocket.new(@host, @port)
28
+ @socket ||= TCPSocket.new(@host, @port)
32
29
  end
33
30
 
31
+ def disconnect
32
+ if @socket
33
+ @socket.close unless @socket.closed?
34
+ @socket = nil
35
+ end
36
+ return true
37
+ end
34
38
 
35
39
  def send_start(key, opts={})
36
40
  send_data("#{key}.start", 1, opts)
@@ -48,35 +52,49 @@ class Zabbix::Sender
48
52
 
49
53
  def send_data(key, value, opts={})
50
54
  return false unless configured?
51
- host = opts[:host] || Socket.gethostname
52
- ts = opts[:ts] || Time.now.to_i
53
- socket = connect
54
-
55
- # construct json
56
- json = Yajl::Encoder.encode({
57
- :request => "agent data",
58
- :clock => ts,
59
- :data => [{
60
- :host => host,
61
- :key => key,
62
- :value => value,
63
- :clock => ts
64
- }]
65
- })
55
+ host = opts[:host]
56
+ clock = opts[:ts ]
57
+ return send_zabbix_request([ cons_zabbix_data_element(host, key, value, clock) ])
58
+ end
66
59
 
67
- # send the data
68
- socket.write "ZBXD\x01"
69
- socket.write [json.size].pack('q')
70
- socket.write json
71
- socket.flush
60
+ private
72
61
 
73
- # read the response message if desired
74
- #header = socket.read(5)
75
- #len = socket.read(8)
76
- #len = len.unpack('q').shift
77
- #msg = socket.read(len)
78
- socket.close
62
+ def cons_zabbix_data_element(host, key, value, clock=Time.now.to_i)
63
+ return {
64
+ :host => host,
65
+ :key => key,
66
+ :value => value,
67
+ :clock => clock
68
+ }
69
+ end
79
70
 
80
- return true
81
- end
71
+ def send_zabbix_request(data)
72
+ status = false
73
+ request = Yajl::Encoder.encode({
74
+ :request => 'agent data' ,
75
+ :clock => Time.now.to_i,
76
+ :data => data
77
+ })
78
+
79
+ begin
80
+ sock = connect
81
+ sock.write "ZBXD\x01"
82
+ sock.write [request.size].pack('q')
83
+ sock.write request
84
+ sock.flush
85
+
86
+ # FIXME: check header to make sure it's the message we expect?
87
+ header = sock.read(5)
88
+ len = sock.read(8)
89
+ len = len.unpack('q').shift
90
+ response = Yajl::Parser.parse(sock.read(len))
91
+ status = true if response['response'] == 'success'
92
+ rescue => e
93
+ ## FIXME
94
+ ensure
95
+ disconnect
96
+ end
97
+
98
+ return status
99
+ end
82
100
  end
@@ -0,0 +1,24 @@
1
+ class Zabbix::Sender::Buffer < Zabbix::Sender
2
+ def initialize(opts={})
3
+ @buffer = []
4
+ super(opts)
5
+ end
6
+
7
+ def append(key, value, opts={})
8
+ return false unless configured?
9
+ @buffer << {
10
+ :host => opts[:host] || Socket.gethostname,
11
+ :clock => opts[:ts ] || Time.now.to_i,
12
+ :key => key,
13
+ :value => value,
14
+ }
15
+ end
16
+
17
+ def flush
18
+ return false unless @buffer.size > 0
19
+ ret = send_zabbix_request(@buffer)
20
+ @buffer.clear
21
+ return ret
22
+ end
23
+
24
+ end
@@ -18,15 +18,24 @@ class TestZabbix < Test::Unit::TestCase
18
18
  assert_equal true, zbx.configured?
19
19
  end
20
20
 
21
- should "send some data" do
21
+ should "should send start stop and heartbeat" do
22
22
  config_file = "#{File.dirname(__FILE__)}/zabbix_agentd.conf"
23
23
  zbx = Zabbix::Sender.new :config_file => config_file
24
24
  key = :"foo.bar.baz"
25
25
  host = "testhost.example.com"
26
26
  assert_equal true, zbx.send_start(key, :host => host)
27
- assert_equal true, zbx.send_heartbeat(key, "8==D~~~ ADAM", :host => host)
27
+ assert_equal true, zbx.send_heartbeat(key, "8==D", :host => host)
28
28
  assert_equal true, zbx.send_stop(key, :host => host)
29
29
  end
30
30
 
31
-
31
+ should "should bulk send data" do
32
+ config_file = "#{File.dirname(__FILE__)}/zabbix_agentd.conf"
33
+ zbx = Zabbix::Sender::Buffer.new :config_file => config_file
34
+ key = :"foo.bar.baz"
35
+ host = "testhost.example.com"
36
+ zbx.append key, "8===D", :host => host
37
+ zbx.append key, "8====D", :host => host
38
+ zbx.append key, "8=====D", :host => host
39
+ assert_equal true, zbx.flush
40
+ end
32
41
  end
@@ -1,2 +1,2 @@
1
- Server=localhost
1
+ Server=sysmon-002.sc1.yammer.com
2
2
  ServerPort=10051
@@ -0,0 +1,57 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{zabbix}
8
+ s.version = "0.2.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Matthew Knopp"]
12
+ s.date = %q{2010-12-17}
13
+ s.description = %q{send data to zabbix from ruby}
14
+ s.email = %q{mknopp@yammer-inc.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ "LICENSE",
22
+ "README.rdoc",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "lib/zabbix.rb",
26
+ "lib/zabbix/agent/configuration.rb",
27
+ "lib/zabbix/sender.rb",
28
+ "lib/zabbix/sender/buffer.rb",
29
+ "lib/zabbix/sender/easy.rb",
30
+ "test/helper.rb",
31
+ "test/test_zabbix.rb",
32
+ "test/zabbix_agentd.conf",
33
+ "zabbix.gemspec"
34
+ ]
35
+ s.homepage = %q{http://github.com/mhat/zabbix}
36
+ s.require_paths = ["lib"]
37
+ s.rubygems_version = %q{1.3.7}
38
+ s.summary = %q{send data to zabbix from ruby}
39
+ s.test_files = [
40
+ "test/helper.rb",
41
+ "test/test_zabbix.rb"
42
+ ]
43
+
44
+ if s.respond_to? :specification_version then
45
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
46
+ s.specification_version = 3
47
+
48
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
49
+ s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
50
+ else
51
+ s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
52
+ end
53
+ else
54
+ s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
55
+ end
56
+ end
57
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zabbix
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 1
8
+ - 2
9
9
  - 0
10
- version: 0.1.0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Matthew Knopp
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-30 00:00:00 -08:00
18
+ date: 2010-12-17 00:00:00 -08:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -43,7 +43,6 @@ extra_rdoc_files:
43
43
  - README.rdoc
44
44
  files:
45
45
  - .document
46
- - .gitignore
47
46
  - LICENSE
48
47
  - README.rdoc
49
48
  - Rakefile
@@ -51,17 +50,19 @@ files:
51
50
  - lib/zabbix.rb
52
51
  - lib/zabbix/agent/configuration.rb
53
52
  - lib/zabbix/sender.rb
53
+ - lib/zabbix/sender/buffer.rb
54
54
  - lib/zabbix/sender/easy.rb
55
55
  - test/helper.rb
56
56
  - test/test_zabbix.rb
57
57
  - test/zabbix_agentd.conf
58
+ - zabbix.gemspec
58
59
  has_rdoc: true
59
60
  homepage: http://github.com/mhat/zabbix
60
61
  licenses: []
61
62
 
62
63
  post_install_message:
63
- rdoc_options:
64
- - --charset=UTF-8
64
+ rdoc_options: []
65
+
65
66
  require_paths:
66
67
  - lib
67
68
  required_ruby_version: !ruby/object:Gem::Requirement
data/.gitignore DELETED
@@ -1,21 +0,0 @@
1
- ## MAC OS
2
- .DS_Store
3
-
4
- ## TEXTMATE
5
- *.tmproj
6
- tmtags
7
-
8
- ## EMACS
9
- *~
10
- \#*
11
- .\#*
12
-
13
- ## VIM
14
- *.swp
15
-
16
- ## PROJECT::GENERAL
17
- coverage
18
- rdoc
19
- pkg
20
-
21
- ## PROJECT::SPECIFIC