Created
June 10, 2013 19:11
-
-
Save nwjsmith/5751366 to your computer and use it in GitHub Desktop.
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 '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