Имејл извештај о искоришћености ресурса путем команде sar – сумирано и по дану

Ова скрипта ће направити известаје о искоришћености ресурса на дневном или месечном нивоу и послати вам исте на мејл како бисте могли да проверите да ли је можда некад било некаквог загушења. Скрипта користи „sar“ који је део пакета sysstat, тако да инсталирајте тај пакет стандардним yum install, sudo apt-get install и сличним методама зависно од дистрибуције.

Ово може бити неки вид ‘брзинског мониторинга’ ако вам је мрско да инсталирате Nagios или слични мониторинг алат – овде одмах после yum install sysstat – генерисање извештаја почиње на дневном нивоу.

Зависно од дистрибуције али sar кад је исталиран обично чува статистику последњих 28 дана (погледати линију HISTORY у конфиг фајлу /etc/sysconfig/sysstat), и исту прикупља сваких 10 минута…али ако желите да ставите мању вредност како би резултати били још валиднији промените то у crontab фајлу: /etc/cron.d/sysstat али имајте на уму да ће то повећати или смањити „sar“ фајлове (кад је на 10 минута лог по дану је око пола мегабајта).

Sar памти у формату /var/log/sa/sa<DanUMesecu> тако да ће рецимо sar -q /var/log/sa/sa15 дати податке о load-у за овај месец (ако је данашњи датум >15, тј ако рецимо 22 Мај) или за 15-ти претходног месеца (ако је данас дан <15 односно рецимо 10 Мај) и добићете извештаје само за дане у којима се статистика генерисала.
Овде скрипту окидамо на ЦентОС седмици, на другим дистроима може да се разликује путања до са фајлова. Овде сам ставио проверу искоришћености CPU, RAM, SWAP, I/О диска (провера диска није историјска већ тренутна) али можете додати и ви своје провере за sar.

#!/bin/bash
#########################################################################################
# Opis: Skripta za report i statistiku iskoriscenja resursa po danu ili po srednjim 
# vrednostima i slanje tih reporta na email. Crontab ready skripta.
# Autor: Kompjuteras.com, Slobodni ste da skriptu koristite/menjate kako vam srcu drago
#
# Crontab primer (da se okida svakog prvog u mesecu):
# 00  01  1  *  *  /root/skripte/ResourceProvera.sh > /tmp/CrontabResourceProvera.log 2>&1
#
#########################################################################################
 
shopt -s expand_aliases           # Za slucaj da mailx ima varijable
source /root/.bash_profile        # za potrebe crontaba

###################################### VARIJABLE #########################################
# Ime servera u human friendly formatu, prefix (PROD, TEST, STAGOD, HOSNTAME i IP adrese)
# Mozete i da hardkodujete, tipa IME_SERVERA=KOMPJUTERAS
JAVNA_IP_ADRESA=$(ip route get 8.8.8.8 | grep src | sed 's/.*src \(.*\)$/\1/g' | cut -d ' ' -f1)
IME_SERVERA="$(hostname -s) (${JAVNA_IP_ADRESA})"

# Ko treba da dobija izvestaje, ako ima vise primaoca dodati ih (separator je prazno mesto)
MAIL_TO="moj@mejl.kom"

# Gde treba da se pakuju privremeni logovi. Najbolje u tmp folder. Svetite nesto ne-sistemsko
LOGFAJL_PREFIX=/tmp/SAR

# Da li zelite da vam stize izvestaj po svakom danu zasebno (u jednom fajlu ce biti)
# Ako da stavite Y ako ne stavite N
IZVESTAJ_PO_DANU=Y

# Da li zelite da vam prosecne (average) vrednosti iskoriscenja resursa)
# Napomena, ako ste restartovali server imacete dva average za taj dan, average do restarta 
# i na kraju dana
# Ako da stavite Y ako ne stavite N          
IZVESTAJ_SA_PROSECIMA_PO_DANU=Y
##########################################################################################

# Da li je sysstat instaliran
if [ `hash sar 2>/dev/null  ; echo $?` -gt 0 ] ; then echo "Instalirajte sysstat program prvo, izlazim!" ; exit 1 ; fi
if [ `hash mail 2>/dev/null ; echo $?` -gt 0 ] ; then echo "Instalirajte mailx program prvo, izlazim!"   ; exit 1 ; fi

# Gde se nalaze sar arhive statistika
CONFIG_FILE="$(grep '/sa/' /etc/cron.d/sysstat | grep -v '#' | awk '{print $7}' | head -1)"
SAR_LOG_FILE_LOCATION="$(cat $CONFIG_FILE | grep DDIR= | cut -d '=' -f2)"

# Brisi stare logove
rm -f ${LOGFAJL_PREFIX}_*.log
# Generisanje punog loga - ako je IZVESTAJ_PO_DANU=Y  bice i oni poslati u zasebnom mailu
for i in {01..30}
do
	if [ -f ${SAR_LOG_FILE_LOCATION}/sa${i} ] ; then
		echo "`sar -u -f ${SAR_LOG_FILE_LOCATION}/sa${i} ` | DayOfTheMonth ${i}" | grep -v `hostname` >> ${LOGFAJL_PREFIX}_CPU.log
		echo "`sar -r -f ${SAR_LOG_FILE_LOCATION}/sa${i} ` | DayOfTheMonth ${i}" | grep -v `hostname` >> ${LOGFAJL_PREFIX}_RAM.log
		echo "`sar -S -f ${SAR_LOG_FILE_LOCATION}/sa${i} ` | DayOfTheMonth ${i}" | grep -v `hostname` >> ${LOGFAJL_PREFIX}_SWP.log
		echo "`sar -q -f ${SAR_LOG_FILE_LOCATION}/sa${i} ` | DayOfTheMonth ${i}" | grep -v `hostname` >> ${LOGFAJL_PREFIX}_LOAD.log
		echo "`sar -b -f ${SAR_LOG_FILE_LOCATION}/sa${i} ` | DayOfTheMonth ${i}" | grep -v `hostname` >> ${LOGFAJL_PREFIX}_IO.log
	fi
done

# Generisanje average loga
	# CPU iskoriscenost
	CPU_CORES=`cat /proc/cpuinfo | grep vendor_id | wc -l`
	echo "CPU Cores       : ${CPU_CORES}"                        > ${LOGFAJL_PREFIX}_CPU_AVG.log
	cat /proc/cpuinfo | grep 'model name' | sort -u             >> ${LOGFAJL_PREFIX}_CPU_AVG.log
	cat /proc/cpuinfo | grep 'cpu MHz'    | sort -u             >> ${LOGFAJL_PREFIX}_CPU_AVG.log
	echo "-----------------------------"                        >> ${LOGFAJL_PREFIX}_CPU_AVG.log
	echo "`sar -u | sed -n 3p` | Description"                   >> ${LOGFAJL_PREFIX}_CPU_AVG.log
	cat ${LOGFAJL_PREFIX}_CPU.log | grep 'Average:'             >> ${LOGFAJL_PREFIX}_CPU_AVG.log
	# RAM iskoriscenost
	echo "-----------------------------"                         > ${LOGFAJL_PREFIX}_RAM_AVG.log
	cat /proc/meminfo | grep 'MemTotal'  | sort -u              >> ${LOGFAJL_PREFIX}_RAM_AVG.log
	cat /proc/meminfo | grep 'SwapTotal' | sort -u              >> ${LOGFAJL_PREFIX}_RAM_AVG.log
	echo "-----------------------------"                        >> ${LOGFAJL_PREFIX}_RAM_AVG.log
	echo "`sar -r | sed -n 3p` | Description"                   >> ${LOGFAJL_PREFIX}_RAM_AVG.log
	cat ${LOGFAJL_PREFIX}_RAM.log    | grep 'Average:'          >> ${LOGFAJL_PREFIX}_RAM_AVG.log
	# SWAP iskoriscenost
	echo "-----------------------------"                         > ${LOGFAJL_PREFIX}_SWP_AVG.log
	cat /proc/meminfo | grep 'SwapTotal' | sort -u              >> ${LOGFAJL_PREFIX}_SWP_AVG.log
	echo "-----------------------------"                        >> ${LOGFAJL_PREFIX}_SWP_AVG.log
	echo "`sar -S | sed -n 3p` | Description"                   >> ${LOGFAJL_PREFIX}_SWP_AVG.log
	cat ${LOGFAJL_PREFIX}_SWP.log    | grep 'Average:'          >> ${LOGFAJL_PREFIX}_SWP_AVG.log
	# LOAD servera
	echo "-----------------------------"                         > ${LOGFAJL_PREFIX}_LOAD_AVG.log
	echo "CPU Cores       : ${CPU_CORES}"                       >> ${LOGFAJL_PREFIX}_LOAD_AVG.log
	echo "-----------------------------"                        >> ${LOGFAJL_PREFIX}_LOAD_AVG.log
	echo "`sar -q | sed -n 3p` | Description"                   >> ${LOGFAJL_PREFIX}_LOAD_AVG.log
	cat ${LOGFAJL_PREFIX}_LOAD.log | grep 'Average:'            >> ${LOGFAJL_PREFIX}_LOAD_AVG.log
	# Zauzetost diska
	echo "------------------------------------------------"      > ${LOGFAJL_PREFIX}_HDD.log
	df -Ph | grep -v tmpfs                                      >> ${LOGFAJL_PREFIX}_HDD.log
	echo "------------------------------------------------"     >> ${LOGFAJL_PREFIX}_HDD.log
	# I/O aktivnosti
	echo "-----------------------------"                         > ${LOGFAJL_PREFIX}_IO_AVG.log
	echo "I/O activity on server"                               >> ${LOGFAJL_PREFIX}_IO_AVG.log
	echo "-----------------------------"                        >> ${LOGFAJL_PREFIX}_IO_AVG.log
	echo "`sar -b | sed -n 3p` | Description"                   >> ${LOGFAJL_PREFIX}_IO_AVG.log
	cat ${LOGFAJL_PREFIX}_IO.log | grep 'Average:'              >> ${LOGFAJL_PREFIX}_IO_AVG.log

# Ako ste odabrali da zelite izvestaj sa srednjim vrednostima
if [ ${IZVESTAJ_SA_PROSECIMA_PO_DANU} == "Y" ] ; then
echo "Prosecne vrednosti su u prilogu" | mail -s "${IME_SERVERA} - Prosecna iskoriscenost resursa zu 30 dana" \
-a ${LOGFAJL_PREFIX}_CPU_AVG.log  \
-a ${LOGFAJL_PREFIX}_RAM_AVG.log  \
-a ${LOGFAJL_PREFIX}_SWP_AVG.log  \
-a ${LOGFAJL_PREFIX}_LOAD_AVG.log \
-a ${LOGFAJL_PREFIX}_IO_AVG.log   \
-a ${LOGFAJL_PREFIX}_HDD.log      \
${MAIL_TO}
fi
# Ako ste odabrali da zelite detaljnije izvestaj sa po danu
if [ ${IZVESTAJ_PO_DANU} == "Y" ] ; then
echo "Puna statistika je u prilogu"    | mail -s "${IME_SERVERA} - Iskoriscenost po danima za 30 dana" \
-a ${LOGFAJL_PREFIX}_CPU.log  \
-a ${LOGFAJL_PREFIX}_RAM.log  \
-a ${LOGFAJL_PREFIX}_SWP.log  \
-a ${LOGFAJL_PREFIX}_LOAD.log \
-a ${LOGFAJL_PREFIX}_IO.log   \
-a ${LOGFAJL_PREFIX}_HDD.log  \
${MAIL_TO}
fi

exit 0

Ево рецимо како изгледа један известај са средњим вредностима везан за средњу CPU искоришћеност за сва CPU језгра.