= Rubix
Rubix is a Ruby client for Zabbix[http://www.zabbix.com/] that makes
it easier to programatically control Zabbix resources so that they can
be coordinated in complex, dynamic, and distributed environments like
clouds.
Rubix provides a wrapper for the {Zabbix API
documentation}[http://www.zabbix.com/documentation/1.8/api] and an ORM
for resources like Hosts, HostGroups, Templates, Items, &c.
Rubix also provides simple command line tools and Ruby classes that
make it easier to query Zabbix and send it data.
There are a lot of other projects out there that connect Ruby to
Zabbix. Here's a quick list:
zabbix[http://github.com/lorieri/zabbix]::
zabbix aws templates, scripts, chef automations
zabbixapi[http://github.com/verm666/zabbixapi]::
Ruby module for work with zabbix api
zabbix-rb[http://github.com/mhat/zabbix-rb]::
send data to zabbix from ruby
zabbix_pusher[http://github.com/iteh/zabbix_pusher]::
zabbix_pusher is a gem to parse zabbix templates and push the data
to the corresponding zabbix server
zabbix-trappers[http://github.com/vzctl/zabbix-trappers]::
Collection of ruby scripts for zabbix trappers
rzabbix[http://github.com/neerfri/rzabbix]::
Zabbix API client for Ruby
zabboard[http://github.com/yammer/zabboard]::
zabbix analytics
zabbix-web[http://github.com/legiar/zabbix-web]::
Zabbix frontend
zabcon[http://trac.red-tux.net/]::
Zabcon is a command line interface for Zabbix written in Ruby
== Connections, Requests, & Responses
Getting connected to the Zabbix API is easy
require 'rubix'
# Provide API URL & credentials. These are the defaults.
Rubix.connect('http://localhost/api_jsonrpc.php', 'admin', 'zabbix')
As per the {Zabbix API
documentation}[http://www.zabbix.com/documentation/1.8/api] each
request to the Zabbix API needs four values:
+id+::
an integer identifying the request ID.
+auth+::
a string confirming that the API request is authenticated.
+method+::
the name of the API method you're calling, e.g. - host.get, template.delete, &c.
+params+::
parameters for the invocation of the +method+.
When you send a request, Rubix only requires you to specify the
+method+ and the +params+, handling the +id+ and authentication
quietly for you:
response = Rubix.connection.request('host.get', 'filter' => { 'host' => 'My Zabbix Host' })
case
when response.has_data?
# Response is a success and "has data" -- it's not empty. This
# means we found our host.
puts response.result
#=> [{"hostid"=>"10017"}]
when response.success?
# Response was succssful but doesn't "have data" -- it's empty, no
# such host!
puts "No such host"
else
# Response was an error. Uh oh!
puts response.error_message
end
=== On the command line
Rubix comes with a command line utility +zabbix_api+ which lets you
issue these sorts of requests directly on the command line.
$ zabbix_api host.get '{"filter": {"host": "My Zabbix Host"}}'
[{"hostid"=>"10017"}]
+zabbix_api+ lets you specify the credentials and will pretty-print
responses for you. Try zabbix_api --help for more details.
=== Logging
Rubix produces log messages at the Logger::INFO level to a
+Logger+ instance by default. When the logger severity is
Logger::DEBUG Rubix will log the request and response to
every API call it makes against the Zabbix API. This can be useful
when debugging why a particular interaction isn't working as expected.
Besides programatically modifying the logger, the log level and path
can be modified at runtime with the environment variables
+RUBIX_LOG_LEVEL+ and +RUBIX_LOG_PATH+.
== ORM
If you don't want to deal with the particulars of the Zabbix API
itself, Rubix provides a set of classes that you can use instead.
The following example goes through setting up an item on a host
complete with host groups, templates, applications, and so on.
require 'rubix'
Rubix.connect('http://localhost/api_jsonrpc.php', 'admin', 'zabbix')
# Ensure the host group we want exists.
host_group = Rubix::HostGroup.find_or_create(:name => "My Zabbix Hosts")
# Now the template -- created templates are empty by default!
template = Rubix::Template.new(:name => "Template_Some_Service")
template.save
# Now the host.
host = Rubix::Host.new(:name => "My Host", :ip => '123.123.123.123', :templates => [template], :host_groups => [host_group])
host.save
# Now for the application
app = Rubix::Application.new(:name => 'Some App', :host => host)
app.save
# Now the item
item = Rubix::Item.new(:host => host, :key => 'foo.bar.baz', :description => "Some Item", :value_type => :unsigned_int, :applications => [app])
item.save
You can also +update+ and +destroy+ resources as well as probe
associations: host.items.
== Monitors
Rubix also comes with some classes that make it easy to write simple
monitors. The output of these monitors should match the expected
input format of +zabbix_pipe+. This way they can be chained together.
Here's an example of a simple monitor that calculates the currently
used memory in bytes.
# in memory_monitor.rb
require 'rubix'
class MemoryMonitor < Rubix::Monitor
def measure
write do |data|
mem_used = `free | tail -n+2 | head -n1`.chomp.split[2].to_i
data << [['mem.used', mem_used]]
end
end
end
MemoryMonitor.run if $0 == __FILE__
The file memory_monitor.rb can now be run on the command line
in various ways. Most simply it will just output a measurement.
$ ruby memory_monitor.rb
'mem.used' 11595908
You can also have it loop after a number of seconds
$ ruby memory_monitor.rb --loop=30
'mem.used' 11595760
'mem.used' 11595800
'mem.used' 11596016
'mem.used' 11596008
You can pipe the results directly to Zabbix (uses {Zabbix
sender}[http://www.zabbix.com/documentation/1.8/manual/processes/zabbix_sender]
behind the scenes):
$ ruby memory_monitor.rb --loop=30 --send