module PgMetrics::Statsd

Constants

APPNAME

Public Class Methods

main(args) click to toggle source
# File lib/pg_metrics/statsd.rb, line 10
def self.main(args)
  options = self.parse(args)

  if options[:version]
    STDOUT.puts %(pg_metrics #{PgMetrics::VERSION})
    return 0
  end

  if options[:pgbouncer]
    metrics = PgMetrics::PgbouncerMetrics::fetch_pgbouncer_metrics(APPNAME, options[:conn])
  else
    regexp = options[:exclude] ? options[:exclude] : nil

    metrics = if options[:dbname]
                PgMetrics::Metrics::fetch_database_metrics(APPNAME, options[:conn], options[:dbname],
                                                           options[:dbstats], regexp)
              else
                PgMetrics::Metrics::fetch_instance_metrics(APPNAME, options[:conn], regexp)
              end
  end

  statsd = ::Statsd.new(options[:host], options[:port]).tap do |sd|
    sd.namespace = options[:scheme]
  end

  metrics.map! { |m| [m[0].join("."), m[1]] }

  metrics.each { |m| STDOUT.puts m.join(" ") } if options[:verbose]

  metrics.each do |m|
    statsd.gauge(m[0], m[1])
  end

  exit 0
end
mutate_stats(stats, key, do_add) click to toggle source
# File lib/pg_metrics/statsd.rb, line 92
def self.mutate_stats(stats, key, do_add)
  if do_add
    stats[:added].add(key)
  else
    stats[:default].delete(key)
  end
  stats
end
parse(args) click to toggle source
# File lib/pg_metrics/statsd.rb, line 46
def self.parse(args)
  default_stats = [PgMetrics::Metrics::Functions,
                   PgMetrics::Metrics::Locks,
                   PgMetrics::Metrics::TableSizes,
                   PgMetrics::Metrics::IndexSizes,
                   PgMetrics::Metrics::TableStatio,
                   PgMetrics::Metrics::TableStats,
                   PgMetrics::Metrics::IndexStatio,
                   PgMetrics::Metrics::IndexStats].to_set
  options = {
    host: "localhost",
    port: 8125,
    conn: "",
    scheme: %(#{Socket.gethostname}.postgresql),
    dbstats: Set.new
  }

  stats = { added: Set.new, default: default_stats }

  OptionParser.new do |opts|
    opts.on("-h", "--host STATSD_HOST", "StatsD host") { |v| options[:host] = v }
    opts.on("-p", "--port STATSD_PORT", "StatsD port") { |v| options[:port] = v.to_i }
    opts.on("-c", "--connection CONN", "PostgreSQL connection string") { |v| options[:conn] = v }
    opts.on("-d", "--dbname DBNAME", "PostgreSQL database name for database metrics") { |v| options[:dbname] = v }
    opts.on("-e", "--exclude REGEXP", "Exclude objects matching given regexp") { |v| options[:exclude] = ::Regexp.new(v) }
    opts.on("-s", "--scheme SCHEME", "Metric namespace") { |v| options[:scheme] = v }
    opts.on("--only", "Collect only specified stats") { |v| stats[:default] = Set.new }
    opts.on("--[no-]functions", "Collect database function stats") { |v| stats = mutate_stats(stats, PgMetrics::Metrics::Functions, v) }
    opts.on("--[no-]locks", "Collect database lock stats") { |v| stats = mutate_stats(stats, PgMetrics::Metrics::Locks, v) }
    opts.on("--[no-]table-sizes", "Collect database table size stats") { |v| stats = mutate_stats(stats, PgMetrics::Metrics::TableSizes, v) }
    opts.on("--[no-]index-sizes", "Collect database index size stats") { |v| stats = mutate_stats(stats, PgMetrics::Metrics::IndexSizes, v) }
    opts.on("--[no-]table-statio", "Collect database table statio stats") { |v| stats = mutate_stats(stats, PgMetrics::Metrics::TableStatio, v) }
    opts.on("--[no-]table-stats", "Collect database table stats") { |v| stats = mutate_stats(stats, PgMetrics::Metrics::TableStats, v) }
    opts.on("--[no-]index-statio", "Collect database index statio stats") { |v| stats = mutate_stats(stats, PgMetrics::Metrics::IndexStatio, v) }
    opts.on("--[no-]index-stats", "Collect database index stats") { |v| stats = mutate_stats(stats, PgMetrics::Metrics::IndexStats, v) }
    opts.on("--[no-]table-free-space", "Collect database table free space stats (requires pg_freespacemap)") { |v| stats = mutate_stats(stats, PgMetrics::Metrics::TableFreeSpace, v) }
    opts.on("--[no-]index-ideal-sizes", "Collect database index ideal size estimates") { |v| stats = mutate_stats(stats, PgMetrics::Metrics::IndexIdealSizes, v) }
    opts.on("--pgbouncer", "Collect pgbouncer stats") { |v| options[:pgbouncer] = true }
    opts.on("--verbose") { |v| options[:verbose] = true }
    opts.on("--version") { |v| options[:version] = v }
  end.order!(args)

  options[:dbstats] = stats[:added].merge(stats[:default])
  options
end