Repository
Munin (contrib)
Last change
2021-02-16
Graph Categories
Family
auto
Capabilities
Keywords
Language
Shell
License
GPL-2.0-only

cpu_osx

Name

cpu - Plugin to measure cpu on osx.

Notes

This plugin runs the top command once per interval, to discover the current value of CPU usage on OSX. The result is scaled to # of CPU’s, so a 4 core machine will reach 400% utilization (unless $scaleto100 is set to “yes”, in which case the maximum will be 100%).

Contributions are welcome to convert the plugin to use a long running counter such as /proc/stat in Linux.

License

GPLv2

Magic Markers

#%# family=auto
#%# capabilities=autoconf
#!/bin/sh
# -*- sh -*-

# shellcheck disable=SC2046

: << =cut

=head1 NAME

cpu - Plugin to measure cpu on osx.

=head1 NOTES

This plugin runs the top command once per interval, to discover the current value of CPU usage on OSX.
The result is scaled to # of CPU's, so a 4 core machine will reach 400% utilization (unless $scaleto100 is set to "yes", in which case the maximum will be 100%).

Contributions are welcome to convert the plugin to use a long running counter such as /proc/stat in Linux.

=head1 LICENSE

GPLv2

=head1 MAGIC MARKERS

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

=cut

if [ "$1" = "autoconf" ]; then
    if [ "$(uname)" = "Darwin" ]; then
        echo yes
        exit 0
    else
        echo "no (uname does not report 'Darwin')"
        exit 0
    fi
fi

scaleto100=${scaleto100:-}

if [ "$scaleto100" = "yes" ]; then
    NCPU="1"
else
    NCPU=$(sysctl hw.ncpu | cut -d" " -f2)
fi

if [ "$1" = "config" ]; then
        graphlimit=$(( NCPU*100 ))
        echo 'graph_title CPU usage'
        echo "graph_order system user idle"
        echo "graph_args --base 1000 -r --lower-limit 0 --upper-limit $graphlimit"
        echo 'graph_scale no'
        echo 'graph_vlabel %'
        echo 'graph_category system'
        echo 'system.label system'
        echo 'system.draw AREA'
        echo 'system.min 0'
        echo "system.info CPU time spent by the kernel in system activities"
        echo 'user.label user'
        echo 'user.draw STACK'
        echo 'user.min 0'
        echo 'user.info CPU time spent by normal programs and daemons'
        echo 'idle.label idle'
        echo 'idle.draw STACK'
        echo 'idle.min 0'
        echo 'idle.info Idle CPU time'

        exit 0
fi

# The second cpu reading is more accurate than the first, so "-l 2":
TOPINFO=$(top -l 2 | grep "CPU usage: " | tail -n 1)

CPU_USER=$(echo "$TOPINFO" | awk '/CPU usage: / { print substr($3, 1, length($3)-1) }')
CPU_SYS=$(echo "$TOPINFO" | awk '/CPU usage: / { print substr($5, 1, length($5)-1) }') 
CPU_IDLE=$(echo "$TOPINFO" | awk '/CPU usage: / { print substr($7, 1, length($7)-1) }') 
echo "system.value" $(echo "$NCPU" "$CPU_SYS" | awk '{print($1 * $2)}')
echo "user.value" $(echo "$NCPU" "$CPU_USER" | awk '{print($1 * $2)}')
echo "idle.value" $(echo "$NCPU" "$CPU_IDLE" | awk '{print($1 * $2)}')