Skip to content

Commit

Permalink
Added RRD::Xport to wrap rrd_xport function along with specs
Browse files Browse the repository at this point in the history
  • Loading branch information
neilljordan committed May 4, 2012
1 parent 90f98ab commit db1f843
Show file tree
Hide file tree
Showing 4 changed files with 171 additions and 3 deletions.
9 changes: 8 additions & 1 deletion lib/rrd.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,27 @@
require "rrd/wrapper"
require "rrd/base"
require "rrd/graph"
require "rrd/xport"
require "rrd/builder"
require "rrd/time_extension"

module RRD
extend self

BANG_METHODS = [:graph!]
BANG_METHODS = [:graph!, :xport!]

def graph(image_file, options = {}, &block)
graph = Graph.new(image_file, options)
graph.instance_eval(&block)
graph.save
end

def xport(options = {}, &block)
xport = Xport.new(options)
xport.instance_eval(&block)
xport.save
end

def error
Wrapper.error
end
Expand Down
49 changes: 49 additions & 0 deletions lib/rrd/xport.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# -*- coding: UTF-8 -*-
require 'digest/md5'
module RRD
class Xport
attr_accessor :output, :parameters, :definitions, :printables

DEF_OPTIONS= [:from]

def initialize(parameters = {})
@parameters = {:start => Time.now - 1.day, :end => Time.now}.merge parameters
@parameters[:start] = @parameters[:start].to_i
@parameters[:end] = @parameters[:end].to_i

@definitions = []
@printables = []
end

def for_rrd_data(data_name, options)
dataset = options.reject {|name, value| DEF_OPTIONS.include?(name.to_sym)}
definition = "DEF:#{data_name}=#{options[:from]}:#{dataset.keys.first}:#{dataset.values.first.to_s.upcase}"
definitions << definition
definition
end

def using_calculated_data(data_name, options)
definition = "CDEF:#{data_name}=#{options[:calc]}"
definitions << definition
definition
end

def xport(data_name, options)
printable = "XPORT:#{data_name}:#{options[:label].gsub(/:/, '\\:')}"
printables << printable
[printable]
end

def save
Wrapper.xport(*generate_args)
end

private
def generate_args
args = []
args += RRD.to_line_parameters(parameters)
args += definitions
args += printables
end
end
end
69 changes: 69 additions & 0 deletions spec/rrd/xport_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
require "spec_helper"
require 'digest/md5'

describe RRD::Xport do

before do
@rrd = RRD::Base.new(RRD_FILE)
@rrd.restore(XML_FILE)

@xport = RRD::Xport.new :start => @rrd.starts_at, :end => @rrd.ends_at, :step => 2
end

it "should store definition for rrd data" do
result = @xport.for_rrd_data "cpu0", :cpu0 => :average, :from => RRD_FILE
result.should == "DEF:cpu0=#{RRD_FILE}:cpu0:AVERAGE"
end

it "should store definition for calculated data" do
result = @xport.using_calculated_data "half_mem", :calc => "mem,2,/"
result.should == "CDEF:half_mem=mem,2,/"
end

it "should store printable for xport" do
result = @xport.xport 'memory', :label => "Memory"
result[0].should == "XPORT:memory:Memory"
end

it "should export data correctly" do
memory_ds_name = Digest::MD5.hexdigest("#{RRD_FILE}_memory_average")
cpu_ds_name = Digest::MD5.hexdigest("#{RRD_FILE}_cpu0_average")
expected_args = [
"--start", @rrd.starts_at.to_i.to_s,
"--end", @rrd.ends_at.to_i.to_s,
"--step", "2",
"DEF:memory=/Users/neilljordan/Documents/rrd-ffi/spec/vm.rrd:memory:AVERAGE",
"DEF:cpu0=#{RRD_FILE}:cpu0:AVERAGE",
"CDEF:half_mem=memory,2,/",
"XPORT:memory:Memory\\: Average",
"XPORT:cpu0:cpu0\\: Average",
"XPORT:half_mem:Half Memory",
]

@xport.for_rrd_data "memory", :memory => :average, :from => RRD_FILE
@xport.for_rrd_data "cpu0", :cpu0 => :average, :from => RRD_FILE
@xport.using_calculated_data "half_mem", :calc => "memory,2,/"
@xport.xport "memory", :label => "Memory: Average"
@xport.xport "cpu0", :label => "cpu0: Average"
@xport.xport "half_mem", :label => "Half Memory"

generated_args = @xport.send(:generate_args)
generated_args.should == expected_args

data = @xport.save

expected_data = [
["time", "Memory: Average", "cpu0: Average", "Half Memory"],
[1266944780, 536870912.0, 0.0002, 268435456.0],
[1266944785, 536870912.0, 0.0022, 268435456.0],
[1266944790, 536870912.0, 0.0022, 268435456.0],
]

data[0,4].should == expected_data
end

it "should export via dsl" do

end

end
47 changes: 45 additions & 2 deletions spec/rrd_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@

result.should be_true
File.should be_file(IMG_FILE)
end
end

it "should list all bang methods" do
(RRD.methods & RRD::BANG_METHODS).should == RRD::BANG_METHODS
end
Expand All @@ -45,4 +45,47 @@
result.should be_true
File.should be_file(IMG_FILE)
end


it "should export data using xport dsl" do
rrd = RRD::Base.new(RRD_FILE)
data = RRD.xport :start => rrd.starts_at, :end => rrd.ends_at, :step => 2 do
for_rrd_data "memory", :memory => :average, :from => RRD_FILE
for_rrd_data "cpu0", :cpu0 => :average, :from => RRD_FILE
using_calculated_data "half_mem", :calc => "memory,2,/"
xport "memory", :label => "Memory: Average"
xport "cpu0", :label => "cpu0: Average"
xport "half_mem", :label => "Half Memory"
end

expected_data = [
["time", "Memory: Average", "cpu0: Average", "Half Memory"],
[1266944780, 536870912.0, 0.0002, 268435456.0],
[1266944785, 536870912.0, 0.0022, 268435456.0],
[1266944790, 536870912.0, 0.0022, 268435456.0],
]

data[0,4].should == expected_data
end

it "should export data using xport!" do
rrd = RRD::Base.new(RRD_FILE)
data = RRD.xport! :start => rrd.starts_at, :end => rrd.ends_at, :step => 2 do
for_rrd_data "memory", :memory => :average, :from => RRD_FILE
for_rrd_data "cpu0", :cpu0 => :average, :from => RRD_FILE
using_calculated_data "half_mem", :calc => "memory,2,/"
xport "memory", :label => "Memory: Average"
xport "cpu0", :label => "cpu0: Average"
xport "half_mem", :label => "Half Memory"
end

expected_data = [
["time", "Memory: Average", "cpu0: Average", "Half Memory"],
[1266944780, 536870912.0, 0.0002, 268435456.0],
[1266944785, 536870912.0, 0.0022, 268435456.0],
[1266944790, 536870912.0, 0.0022, 268435456.0],
]

data[0,4].should == expected_data
end
end

0 comments on commit db1f843

Please sign in to comment.