module Tcptop

Constants

VERSION

Public Class Methods

parse_options!() click to toggle source
# File lib/tcptop.rb, line 10
def self.parse_options!
  options = {:tcp => [], :unix => [], :interval => 2, :sort => :active}
  OptionParser.new do |opts|
    opts.banner = "Usage: tcptop [options]"

    opts.on("-t", "--tcp SOCKET", "tcp socket to filter, can be used multiple times") do |sock|
      options[:tcp] << sock
    end
    opts.on("-u", "--unix PATH", "domain socket to filter, can be used multiple times, will not show by default") do |path|
      options[:unix] << path
    end
    opts.on("-1", "--once", "print once and exit") do
      options[:once] = true
    end
    opts.on("-n", "--interval SECONDS", Float, "seconds between stat collection, DEFAULT: 2") do |interval|
      options[:interval] = interval
    end
    opts.on("--queued", "sort on queued requests, defaults to active") do
      options[:sort] = :queued
    end
    opts.on("--collectd LABEL", "print output suitable for collectd, must also provide socket or path") do |label|
      options[:collectd] = label
    end
    opts.on("-v", "--version", "prints the version and exits") do
      options[:version] = true
    end
  end.parse!
  options
end
print_info(sockets, paths, sort) click to toggle source
run!() click to toggle source
# File lib/tcptop.rb, line 40
def self.run!
  options = parse_options!
  if options[:version]
    puts "tcptop: version #{Tcptop::VERSION}"
    exit 0
  elsif options[:once]
    print_info(options[:tcp], options[:unix], options[:sort])
    exit 0
  elsif options[:collectd]
    unless options[:tcp].size == 1 || options[:unix].size == 1
      puts "the --tcp or --unix option must be used once to identify the socket"
      exit 1
    end

    Signal.trap("INT") { exit 0 }
    hostname = ENV["COLLECTD_HOSTNAME"] || 'localhost'
    interval = (ENV["COLLECTD_INTERVAL"] || '60').to_i
    label = options[:collectd]

    loop do
      stats = nil
      if options[:tcp].size > 0
        _, stats = Raindrops::Linux.tcp_listener_stats(options[:tcp]).first
      else
        _, stats = Raindrops::Linux.unix_listener_stats(options[:unix]).first
      end
      Collectd.reading(stats.active, stats.queued, hostname, label)
      sleep interval
    end
  else
    Signal.trap("INT") { exit 0 }

    loop do
      system "clear"
      puts "Updated: #{Time.now}, checking every #{options[:interval]} seconds"
      puts
      print_info(options[:tcp], options[:unix], options[:sort])
      sleep options[:interval]
    end
  end
end