Skip to content

Instantly share code, notes, and snippets.

@mikz
Last active August 29, 2015 13:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mikz/9646767 to your computer and use it in GitHub Desktop.
Save mikz/9646767 to your computer and use it in GitHub Desktop.
sensu plugin to get stats from docker containers
#!/usr/bin/env ruby
require 'rubygems' if RUBY_VERSION < '1.9.0'
require 'sensu-plugin/metric/cli'
require 'socket'
require 'pathname'
require 'sys/proctable'
class DockerContainerMetrics < Sensu::Plugin::Metric::CLI::Graphite
option :scheme,
:description => 'Metric naming scheme, text to prepend to metric',
:short => '-s SCHEME',
:long => '--scheme SCHEME',
:default => "docker.#{Socket.gethostname}"
option :cgroup_path,
:description => 'path to cgroup mountpoint',
:short => '-c PATH',
:long => '--cgroup PATH',
:default => '/sys/fs/cgroup'
option :docker_host,
description: 'docker host',
short: '-H DOCKER_HOST',
long: '--docker-host DOCKER_HOST',
default: 'tcp://127.0.1.1:4243'
def run
container_metrics
ok
end
def container_metrics
cgroup = Pathname(config[:cgroup_path]).join('cpu/docker')
ps = Sys::ProcTable.ps.group_by(&:pid)
timestamp = Time.now.to_i
fields = [:rss, :vsize, :nswap, :pctcpu, :pctmem]
ENV['DOCKER_HOST'] = config[:docker_host]
containers = `docker ps --quiet --no-trunc`.split("\n")
containers.each do |container|
pids = cgroup.join(container).join('cgroup.procs').read.split("\n").map(&:to_i)
processes = ps.values_at(*pids).flatten.group_by(&:comm)
processes.each do |comm, processes|
prefix = "#{config[:scheme]}.#{container}.#{comm}"
fields.each do |field|
output "#{prefix}.#{field}", processes.map(&field).reduce(:+), timestamp
end
# this check requires a lot of permissions, even root maybe?
output "#{prefix}.fd", processes.map { |p| p.fd.keys.count }.reduce(:+), timestamp
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment