#!/bin/sh
# -*- sh -*-

: << =cut

=head1 NAME

lxc_ram - Plugin to monitor LXC memory usage.

=head1 CONFIGURATION

  [lxc_*]
    user root

  [lxc_ram]
    env.areastack true

=head1 INTERPRETATION

This plugin needs root privilege.

If env.areastack is set to true, all memory usages of containers will be
 drawn as stacked area charts.
This option changes graph order, all of 'Mem usage' comes first and then others.
(default: false)

=head1 AUTHOR

vajtsz vajtsz@gmail.com
mitty   mitty@mitty.jp

=head1 LICENSE

Unknown license

=head1 MAGIC MARKERS

 #%# family=auto
 #%# capabilities=autoconf

=cut


# configurable: true/false
areastack=${areastack:-false}


# shellcheck disable=SC1090
. "$MUNIN_LIBDIR/plugins/plugin.sh"


guest_names=$(lxc-ls | sort -u)
for guest in $guest_names; do
    if lxc-info -n "$guest" 2>&1 | grep -qs RUNNING ; then
        active="$active $guest"
    fi
done
guest_names="$active"


f_comm='lxc-cgroup  '


do_autoconf() {
    if [ -r /proc/stat ]; then
        echo yes
    else
        echo "no (no /proc/stat)"
    fi
}


do_config() {
    echo 'graph_title Memory '
    echo 'graph_args -l 0 --base 1024'
    echo 'graph_vlabel byte'
    echo 'graph_category memory'

    for guest_name in $guest_names; do
        guest="$(clean_fieldname "$guest_name")"
        echo "mem_usage_$guest.label $guest_name: Mem usage"
        echo "mem_usage_$guest.type GAUGE"
        if [ "$areastack" = "true" ]; then
            echo "mem_usage_$guest.draw AREASTACK"
        fi
        echo "mem_cache_$guest.label $guest_name: Cache"
        echo "mem_cache_$guest.type GAUGE"
        echo "mem_active_$guest.label $guest_name: Active"
        echo "mem_active_$guest.type GAUGE"
        echo "mem_inactive_$guest.label $guest_name: Inactive"
        echo "mem_inactive_$guest.type GAUGE"
    done
}


do_fetch() {
    for guest_name in $guest_names; do
        guest="$(clean_fieldname "$guest_name")"

        value=$($f_comm -n "$guest_name" memory.usage_in_bytes)
        echo "mem_usage_$guest.value $value"

        value=$($f_comm -n "$guest_name" memory.stat | grep total_cache | awk '{print($2)}')
        echo "mem_cache_$guest.value $value"

        value=$($f_comm -n "$guest_name" memory.stat | grep total_active_anon | awk '{print($2)}')
        echo "mem_active_$guest.value $value"

        value=$($f_comm -n "$guest_name" memory.stat | grep total_inactive_anon | awk '{print($2)}')
        echo "mem_inactive_$guest.value $value"
    done
}


if [ "$1" = "autoconf" ]; then
    do_autoconf
elif [ "$1" = "config" ]; then
    do_config
    if [ "${MUNIN_CAP_DIRTYCONFIG:-0}" = "1" ]; then do_fetch; fi
else
    do_fetch
fi
