Skip to content

Instantly share code, notes, and snippets.

@nwjsmith
Created June 10, 2013 19:11
Show Gist options
  • Save nwjsmith/5751366 to your computer and use it in GitHub Desktop.
Save nwjsmith/5751366 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require 'csv'
require 'socket'
class AverageSessionsPerServer
Server = Struct.new(:name, :current_sessions, :status) do
META_SERVER_NAMES = ['FRONTEND', 'BACKEND'].freeze
def up?
status == 'UP'
end
def sessions
current_sessions.to_i
end
def meta?
META_SERVER_NAMES.include? name
end
end
def initialize(stats)
@stats = stats
end
def aggregate
result = total_sessions.to_f / number_of_servers_up.to_f
result.finite? ? result : 0.0
end
def print_to(stream)
stream.puts aggregate
end
def number_of_servers_up
servers.select(&:up?).size
end
def total_sessions
servers.map(&:sessions).inject(0) { |mem, obj| mem + obj }
end
def servers
rows = CSV.parse(@stats, headers: true)
rows.map do |row|
Server.new(row['svname'], row['scur'], row['status'])
end.reject(&:meta?)
end
end
class HAProxySocket
SHOW_STATS_COMMAND = 'show stat'.freeze
def initialize(socket_path)
@socket_path = socket_path
end
def show_stats
response_to SHOW_STATS_COMMAND
end
def response_to(command)
socket = UNIXSocket.new(@socket_path)
socket.puts command
socket.read
end
end
stat = AverageSessionsPerServer.new(HAProxySocket.new("/tmp/.haproxy.sock").show_stats)
stat.print_to STDOUT
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment