diff --git a/check_docker_stats b/check_docker_stats new file mode 100755 index 0000000000000000000000000000000000000000..34bc33d04596a6c78d177a61fef247c99ebe2af3 --- /dev/null +++ b/check_docker_stats @@ -0,0 +1,210 @@ +#!/bin/bash +# ====================================================================== +# +# Check DOCKER INFOS +# +# requirements: +# - docker +# - sudo permissions on docker command +# - jq +# - bc +# +# ---------------------------------------------------------------------- +# Cli docs: +# https://docs.docker.com/engine/reference/commandline/docker/ +# ---------------------------------------------------------------------- +# 2024-01-26 v0.1 <axel.hahn@unibe.ch> init +# ====================================================================== + + +. $(dirname $0)/inc_pluginfunctions +. $(dirname $0)/inc_dockerfunctions.sh + +self_APPVERSION=1.0 + +# ---------------------------------------------------------------------- +# FUNCTIONS +# ---------------------------------------------------------------------- + + +# show help +function _showHelp(){ + local _self=$( basename $0 ) + cat <<EOH +$( ph.showImlHelpHeader ) + +Show resources of running docker instances. + +This check provides performance data except on mode "all". + +USAGE: + $_self [OPTIONS] + +OPTIONS: + + General: + -h, --help this help + -d, --debug Debug; Flag: show all docker system infos + + Connect to docker: + -p, --path Custom directory for docker binary + -t, --target Custom docker target; value for DOCKER_HOST + Needed only if Docker does not run on a unix socket or + multiple users run a rootless docker daemon. + + mode: + -m, --mode MODE Mode what kind of information to show. + The output of container list is sorted by the maximum + value first. + + all default; This view is unsorted. + This check has no performance data. + + cpu CPU usage total of all containers + mem Memory max usage of most consuming container + + memtotal sum of memory usage + netio sum of netio of all containers IN and OUT + blockio sum of blockio of all containers IN and OUT + +EXAMPLES: + $_self + Show stats of all containers + + $_self -p /usr/bin + Show stats of all containers. The docker binary will be searched in + given path first - then in all other dirs of \$PATH + + $_self -d + Show stats of all containers and json with all docker system infos. + + $_self -m cpu + Show cpu usage total of all containers. The container list is sorted + by cpu usage. The most consuming container is on top. + +EOH +} + +# ---------------------------------------------------------------------- +# MAIN +# ---------------------------------------------------------------------- + +bOptDebug=0 +sMode="all" +while [[ "$#" -gt 0 ]]; do case $1 in + -h|--help) _showHelp; exit 0;; + -d|--debug) bOptDebug=1; shift;; + -p|--path) PATH="$2:$PATH"; shift; shift;; + -m|--mode) sMode="$2"; shift; shift;; + -t|--target) export DOCKER_HOST="$2"; shift; shift;; + *) echo "ERROR: Unknown parameter: $1"; showHelp; exit 1; +esac; done + +sLabel="Docker stats" + +case "$sMode" in + "cpu") sLabel="Docker CPU usage total of all containers: %s percent"; sUnit="1"; sumkey="CPUPerc"; sColumns=".Container, .${sumkey}, .Name" ;; + "mem") sLabel="Docker Memory max usage in most consuming container: %s percent"; sUnit="1"; maxkey="MemPerc"; sColumns=".Container, .${maxkey}, .MemUsage, .Name" ;; + "netio") sLabel="Docker Network I/O of all containers: %s MB IN .. %s MB OUT"; sUnit="M"; sumkey="NetIO"; f2=1; sColumns=".Container, .${sumkey}, .Name" ;; + "memtotal") sLabel="Docker Memory usage of all containers: %s MB"; sUnit="M"; sumkey="MemUsage";f2=0; sColumns=".Container, .${sumkey}, .Name" ;; + "blockio") sLabel="Docker Network I/O of all containers: %s MB IN .. %s MB OUT"; sUnit="M"; sumkey="BlockIO"; f2=1; sColumns=".Container, .${sumkey}, .Name" ;; + "all") ;; + *) ph.setStatus critical + echo "ERROR: mode [$sMode] is unknown. Use -h to get help." + ph.exit +esac + +test -z "$sColumns" && sColumns=".Container, .CPUPerc, .MemUsage, .MemPerc, .NetIO, .PIDs, .Name" + + +ph.require "docker" +ph.require "jq" +ph.require "bc" + +_detectDockerenv + +# --- get stats data + +data=$( sudo -n --preserve-env docker stats --no-stream --format '{{ json . }}' ) +_detectDockererror "$data" + + +# --- checks to detect maximum + +if [ -n "${maxkey}" ]; then + iMax=0 + sMax=$( echo "$data" | tr -d '%' | jq -r ".${maxkey}" | sort -hr | head -1 | sed "s#^\.#0#" ) + iMax=$( ph.toUnit "$sMax" "1" 0 ) + ph.perfadd "${sMode}-max" "$iMax" "" "" 0 "100" + sLabel=$( printf "${sLabel}" ${sMax} ) +fi + + +# --- checks with sum of a value + +if [ -n "${sumkey}" ]; then + sum=0 + # split 2 value field - get the 1st one. example: "81.1kB / 1.66MB" --> "81.1k" + for myval in $( echo "$data" | tr -d '%' | jq -r ".${sumkey}" | cut -f 1 -d " " | tr -d "B" ) + do + valuniq=$( ph.toUnit "$myval" "" ) + sum=$( bc <<< "$valuniq + ${sum}" ) + done + test "$sUnit" = "1" && sumhr=$( ph.toUnit "$sum" "1" 0 ) + test "$sUnit" = "M" && sumhr=$( ph.toUnit "$sum" "M" 3 ) + + # --- checks with IN and OUT + + if [ "$f2" = "1" ]; then + sum2=0 + # split 2 value field - get the 2nd one. example: "81.1kB / 1.66MB" --> "1.66M" + for myval in $( echo "$data" | tr -d '%' | jq -r ".${sumkey}" | cut -f 3 -d " " | tr -d "B" ) + do + valuniq=$( ph.toUnit "$myval" "" ) + sum2=$( bc <<< "$valuniq + ${sum2}" ) + done + ph.perfadd "${sMode}-1" "$sum" "" "" + ph.perfadd "${sMode}-2" "$sum2" "" "" + sum2hr=$( ph.toUnit "$sum2" "M" 3 ) + + sLabel=$( printf "${sLabel}" ${sumhr} ${sum2hr} ) + + else + ph.perfadd "${sMode}-sum" "$sum" "" "" + sLabel=$( printf "${sLabel}" ${sumhr} ) + fi +fi + + +# --- output +line="------------------------------------------------------------------------------------------" + +ph.status "$sLabel" + +if [ "$sMode" = "all" ]; then + echo "ID CPU % MEM USAGE / LIMIT MEM % NET I/O PIDs Name" + echo "$line" + jq -r "[$sColumns] | @tsv" <<< "$data" +fi + +if [ -n "${maxkey}" ]; then + echo "ID ${maxkey}" + echo "$line" + jq -r "[$sColumns] | @tsv" <<< "$data" | sort -k +2 -h -r +fi + +if [ -n "${sumkey}" ]; then + echo "ID ${sumkey}" + echo "$line" + jq -r "[$sColumns] | @tsv" <<< "$data" | sort -k +2 -h -r +fi + +echo + +# if -d was given then show debug infos too +test $bOptDebug -eq 1 && ( echo; echo "DEBUG: full docker system infos as json"; echo "$data" | jq ; _debugInfos) + +ph.exit + + +# ----------------------------------------------------------------------