Skip to content

Instantly share code, notes, and snippets.

@christopher-b
Last active December 15, 2015 10:39
Show Gist options
  • Save christopher-b/5247384 to your computer and use it in GitHub Desktop.
Save christopher-b/5247384 to your computer and use it in GitHub Desktop.
Passenger - Statsd
#! /usr/bin/ruby
require 'socket'
statsd_host = ""
statsd_port = "8125"
namespace_prefix = "statsd-ruby"
mode = "statsd"
ARGV.each do |arg|
name, value = arg.split '='
case name
when 'host' then statsd_host = value
when 'namespace' then namespace_prefix = value
when 'port' then statsd_port = value
when 'mode' then mode = value
else
exit("#{name} is not a valid parameter")
end
end
namespace = "#{namespace_prefix}.passenger.#{Socket.gethostname}"
loop do
metrics = []
`passenger-status`.each_line do |line|
value = nil
field = nil
case line
when /^Processes/
field = "processes"
when /^Requests in top-level queue/
field = "queue"
end
value = line.split(':').pop.strip
next unless value && field
metrics << "#{namespace}.#{field}:#{value}|g"
end
# Average memory consumption of passenger processes
line_count = 0
mem_total = 0
`passenger-memory-stats 2>/dev/null`.each_line do |line|
case line
when /RackApp/
mem_total += (line.split(' ')[3]).to_f
line_count += 1
end
end
if line_count > 0
value = (mem_total / line_count).to_i
metrics << "#{namespace}.avg_mem:#{value}|g"
metrics << "#{namespace}.total_mem:#{mem_total}|g"
end
packet = metrics.join("\n")
if mode == 'statsd'
socket = UDPSocket.open.send(packet, 0, statsd_host, statsd_port)
elsif mode == 'stdout'
puts packet
else
puts "#{mode} is not a valid output mode. Valid modes are 'statsd' (default) and 'stdout'."
exit
end
sleep(10)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment