Created
January 29, 2013 17:29
-
-
Save artbikes/4665995 to your computer and use it in GitHub Desktop.
Send response times from Google, Yahoo, and Heroku to Graphite.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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