Skip to content

Instantly share code, notes, and snippets.

@porjo
Forked from mmoulton/README.md
Last active August 29, 2015 14:03
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save porjo/b16df99ff0ccd962980b to your computer and use it in GitHub Desktop.
Save porjo/b16df99ff0ccd962980b to your computer and use it in GitHub Desktop.
Docker stats collection for collectd

Forked from: https://gist.github.com/mmoulton/6224509

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"
CGROUP_MOUNT="/cgroup"
HOSTNAME="${COLLECTD_HOSTNAME:-localhost}"
INTERVAL="${COLLECTD_INTERVAL:-60}"
collect () {
cd -- "$1"
echo $1 | grep "^docker-" > /dev/null
if [ $? -eq 0 ]; then
# Shorten the name to 12 for brevity, like docker does
NAME=$(expr substr $1 8 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 \"$NAME/cpu-0/cpu-user\" interval=$INTERVAL N:$USER"
echo "PUTVAL \"$NAME/cpu-0/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 \"$NAME/memory-0/memory-cached\" interval=$INTERVAL N:$CACHE"
echo "PUTVAL \"$NAME/memory-0/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
}
mainLoop () {
# Collect stats on memory usage
( collect "$CGROUP_MOUNT/memory" )
# Collect stats on cpu usage
( collect "$CGROUP_MOUNT/cpuacct" )
}
mainLoop
while sleep "$INTERVAL"; do
mainLoop
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment