Skip to content

Instantly share code, notes, and snippets.

@artbikes
Created January 29, 2013 17:29
Show Gist options
  • Save artbikes/4665995 to your computer and use it in GitHub Desktop.
Save artbikes/4665995 to your computer and use it in GitHub Desktop.
Send response times from Google, Yahoo, and Heroku to Graphite.
#!/usr/bin/env ruby
require 'pp'
require 'rubygems'
require 'rest-client'
require 'json'
require 'optparse'
require 'ostruct'
class ParseOpts
def self.parse(args)
options = OpenStruct.new
options.graphiteserver = "graphite.example.com"
options.graphiteport = "2003"
options.prefix = "network.latency"
opts = OptionParser.new do |opts|
opts.banner = "Usage: #{$PROGRAM_NAME} [options]"
opts.on("-s", "--graphiteserver SERVER", "Graphite server address") do |s|
options.graphiteserver = s
end
opts.on("-p", "--graphiteport PORT", "Graphite server port") do |p|
options.graphiteport = p
end
opts.on("", "--prefix", "Graphite metric prefix") do |r|
options.prefix = r
end
end
opts.parse!(args)
options
end
end
class PingVal
attr_accessor :hosts
attr_accessor :response
def initialize
@hosts = %w[ www.google.com www.yahoo.com www.heroku.com ]
@response = []
end
def latency(target)
retvals = %x[ping -q -c 5 #{target} | tail -1]
response = /^.* = (.*) ms/.match(retvals)[1].split('/')
end
end
class GraphiteServer
attr_reader :prefix
attr_accessor :data
def initialize(server, port, prefix)
@server = server
@port = port
@prefix = prefix
@data = {}
end
def add_data(key, value)
@token = prefix + "." + key
data[@token] = value
end
def send
time = Time.new
epoch = time.to_i
begin
s = TCPSocket.open(@server, @port)
rescue Errno::ECONNREFUSED => e
puts "Unable to send to Graphite"
end
data.each do |queue, value|
s.write("#{queue} #{value} #{epoch}\n")
end
end
end
options = ParseOpts.parse(ARGV)
ping = PingVal.new
graphite = GraphiteServer.new(options.graphiteserver, options.graphiteport, options.prefix)
ping.hosts.each do |x|
a = ping.latency(x)
graphite.add_data(x.tr_s('.','_') + '.min',a[0])
graphite.add_data(x.tr_s('.','_') + '.avg',a[1])
graphite.add_data(x.tr_s('.','_') + '.max',a[2])
graphite.add_data(x.tr_s('.','_') + '.stddev',a[3])
end
graphite.send
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment