Skip to content

Instantly share code, notes, and snippets.

@martin-magakian
Forked from mmoulton/README.md
Last active August 29, 2015 14:17
Show Gist options
  • Save martin-magakian/32fd447e7f2574115b79 to your computer and use it in GitHub Desktop.
Save martin-magakian/32fd447e7f2574115b79 to your computer and use it in GitHub Desktop.

Docker stats collection for collectd

This script can be used to feed collectd with cpu and memory usage statistics for running docker containers using the collectd exec plugin.

This script will report the used and cached memory as well as the user and system cpu usage by inspecting the appropriate cgroup stat file for each running container.

Usage

This script is intented to be executed by collectd on a host with running docker containers. To use, simply configure the exec plugin in collectd to execute the collectd-docker.sh script. You may need to adjust the script to match your particulars, such as the mount location for cgroup.

Example collectd.conf snippet

LoadPlugin exec

<Plugin exec>
 Exec ubuntu "/usr/share/collectd/collectd-docker.sh"
</Plugin>

This will execute the collectd-docker.sh you placed in /usr/share/collectd using the ubuntu user.

#!/bin/bash
#
# CollectD - Docker
#
# This script will collect cpu/memory stats on running docker containers using cgroup
# and output the data in a collectd-exec plugin friendly format.
#
# Author: Mike Moulton (mike@meltmedia.com)
# License: MIT
#
# Location of the cgroup mount point, adjust for your system
CGROUP_MOUNT="/sys/fs/cgroup"
HOSTNAME="${COLLECTD_HOSTNAME:-localhost}"
INTERVAL="${COLLECTD_INTERVAL:-60}"
collect ()
{
cd "$1"
# If the directory length is 64, it's likely a docker instance
LENGTH=$(expr length $1);
if [ "$LENGTH" -eq "64" ]; then
# Shorten the name to 12 for brevity, like docker does
NAME=$(expr substr $1 1 12);
# If we are in a cpuacct cgroup, we can collect cpu usage stats
if [ -e cpuacct.stat ]; then
USER=$(cat cpuacct.stat | grep '^user' | awk '{ print $2; }');
SYSTEM=$(cat cpuacct.stat | grep '^system' | awk '{ print $2; }');
echo "PUTVAL \"$HOSTNAME/docker-$NAME/cpu-user\" interval=$INTERVAL N:$USER"
echo "PUTVAL \"$HOSTNAME/docker-$NAME/cpu-system\" interval=$INTERVAL N:$SYSTEM"
fi;
# If we are in a memory cgroup, we can collect memory usage stats
if [ -e memory.stat ]; then
CACHE=$(cat memory.stat | grep '^cache' | awk '{ print $2; }');
RSS=$(cat memory.stat | grep '^rss' | awk '{ print $2; }');
echo "PUTVAL \"$HOSTNAME/docker-$NAME/memory-cached\" interval=$INTERVAL N:$CACHE"
echo "PUTVAL \"$HOSTNAME/docker-$NAME/memory-used\" interval=$INTERVAL N:$RSS"
fi;
fi;
# Iterate over all sub directories
for d in *
do
if [ -d "$d" ]; then
( collect "$d" )
fi;
done
}
while sleep "$INTERVAL"; do
# Collect stats on memory usage
( collect "$CGROUP_MOUNT/memory" )
# Collect stats on cpu usage
( collect "$CGROUP_MOUNT/cpuacct" )
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment