ECM ETL LINUX

Monitorare Carte (e Tomcat) con Monit

L’approccio SOA impone un’attività di monitoraggio pro-attivo dei servizi che si scambiano informazioni, puntuale e costante.

A te che utilizzi un server Carte per avviare in remoto trasformazioni o job realizzati con Pentaho DI (KETTLE per i “nostalgici”), questo post potrà tornare molto utile (sopratutto se Carte condivide le risorse del server con un’istanza Tomcat)

Cosa faremo:

  • installazione Monit
  • configurazione Monit
  • creazione file script service Carte
  • creazione file configurazione monitoraggio Carte
  • creazione file configurazione monitoraggio Tomcat (Liferay bundle)

Ma andiamo con ordine…

Che cos’è Monit

monit-logo

Monit è una piccola utility open source per la gestione e il monitoraggio dei sistemi Unix. E’ possibile utilizzarla per controllare l’utilizzo delle risorse del sistema (CPU, disco, rete), verificare il cambiamento di contenuto o dimensioni di file e directory, monitorare lo stato dei processi attivi, etc.

La cosa più interessante? E’ possibile scatenare un azione se dovesse verificarsi una situazione d’errore. Per fare subito un esempio: Il mio servizio sta usando troppa memoria o non è raggiungile? Allora riavvialo.

Requisiti

Ambiente

cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.4 LTS"
NAME="Ubuntu"
VERSION="14.04.4 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.4 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

Installazione Monit

Installare Monit è semplicissimo con apt-get

sudo apt-get install monit

una volta terminato il processo di installazione, dovremmo trovarci la seguente struttura di directory

cd /etc/monit/
ls -al
totale 32
drwxr-xr-x   5 root root  4096 dic 14 14:56 .
drwxr-xr-x 104 root root  4096 dic 13 16:06 ..
drwxr-xr-x   2 root root  4096 dic 14 13:15 conf.d
-rw-------   1 root root 10871 dic 14 15:00 monitrc
drwxr-xr-x   2 root root  4096 dic 13 16:04 monitrc.d
drwxr-xr-x   2 root root  4096 dic 14 13:15 templates
root@feapp:/etc/monit# 

monitrc è il file di configurazione del demone. In templates troviamo file di configurazione di esempio. In conf.d dovremmo andare a copiare le configurazione di monitoraggio che vogliamo attivare.

Configurazione Monit

Monit è veramente molto facile da usare. Di default è impostato per controllare i servizi che sono in esecuzione ogni 2 minuti e memorizza il file di log in /var/log/monit.log. E’ in ogni caso possibile modificare tutte le configurazioni editando il file monitrc

nano monitrc

Di seguito espongo le “porzioni” di file importanti da configurare (importanti per me, per le quali ho dovuto compiere ricerche che vi risparmio).

...
set httpd port 2812 and
 use address localhost
 allow localhost
...

Non lasciatevi ingannare dall’httpd. Se non sono decommentate queste righe incorrerete nell’errore:

Solving monit: error connecting to the monit daemon

perché in realtà lo stessa interfaccia viene utilizzato anche per i tool a riga di comando.

set mailserver smtp.miodominio.it port 25
username "alert@myserver.it" password "s0upopo5Eolw"
with timeout 30 seconds
set mail-format { from: alert@myserver.it }

Una configurazione semplice di mail server con il quale inoltrare una mail di alert in caso di errore.

include /etc/monit/conf.d/*

La direttiva include ci ricorda che i file di configurazione per i singoli servizi possono essere messi nella directory /etc/monit/conf.d

Pertanto andiamo a copiare il file per il monitoraggio di MySQL dalla cartella templates a conf.d

cp templates/mysql conf.d/

editiamolo con le impostazioni per l’inoltro di un alert email in base a determinati eventi (vi rimando alla documentazione di Monit per approfondire)

check process mysqld with pidfile /var/run/mysqld/mysqld.pid alert nizzoalessandro@gmail.com only on { timeout,nonexist,resource,pid,connection }
   group database
...

A questo punto avviamo monit digitando semplicemente

monit

Verifichiamo la sintassi utilizzata nei file di configurazione con

monit -t
Control file syntax OK

Eventualmente correggiamo e ricarichiamola utilizzando il comando

monit reload
Reinitializing monit daemon

Se tutto è andato bene, il monitoraggio è partito

monit summary
The Monit daemon 5.6 uptime: 0m
Process 'mysqld' Running

volendo maggiori dettagli

monit status
The Monit daemon 5.6 uptime: 2m
Process 'mysqld'
  status                            Running
  monitoring status                 Monitored
  pid                               9586
  parent pid                        8520
  uptime                            3h 31m 
  children                          0
  memory kilobytes                  223252
  memory kilobytes total            223252
  memory percent                    2.7%
  memory percent total              2.7%
  cpu percent                       0.0%
  cpu percent total                 0.0%
  unix socket response time         0.001s to /var/run/mysqld/mysqld.sock [MYSQL]
  port response time                0.000s to localhost:3306 [MYSQL via TCP]
  data collected                    Wed, 14 Dec 2016 18:43:49

File 'mysql_bin'
  status                            Accessible
  monitoring status                 Monitored
  permission                        755
  uid                               0
  gid                               0
  timestamp                         Tue, 23 Feb 2016 14:32:38
  size                              11771008 B
  checksum                          72b4de20ca59d514f40969935a2ba032 (MD5)
  data collected                    Wed, 14 Dec 2016 18:43:49

File 'mysql_rc'
  status                            Accessible
  monitoring status                 Monitored
  permission                        755
  uid                               0
  gid                               0
  timestamp                         Tue, 23 Feb 2016 14:32:39
  size                              5491 B
  checksum                          2cc1e39210498f561c2a70ca20f97e28 (MD5)
  data collected                    Wed, 14 Dec 2016 18:43:49

Script di avvio Carte

Lo script di seguito è il risultato di un copia, incolla & modifica dal post

pentaho pdi (kettle) carte init.d script

#!/bin/bash
 
# Start the carte server as a daemon, and helps managing it in a normal
# (service carte start/stop/status) way.
 
# Licence: FreeBSD, do what you want with it but do not hold me responsible.
 
### BEGIN INIT INFO
# Provides: pdi
# Required-Start: $network $syslog $remote_fs
# Required-Stop: $network $syslog
# Default-Start: 3 5
# Default-Stop: 0 1 2 4 6
# Short-Description: Pentaho Carte Server
# Description: Pentaho Carte Server
#
### END INIT INFO
 
## configuration directives
# Which user does carte run under?
PDIUSER=root
# On which port should it listen?
CARTEPORT=8086
# Where is pdi installed?
PDIROOT=/usr/share/data-integration
# Normal output log
LOGOUT=/var/log/pentaho_pdi.out.log
# Error output log
LOGERR=/var/log/pentaho_pdi.err.log
 
## script start here
 
# Note: The functions script is RH only. It is only used here for sexy (colored)
# output of [OK] or [FAILED] via echo_failure and echo_success.
#
# To make this script work under other flavors of linux, the 2 echo_ functions
# are first defined in a portable (but unsexy) way. If the RH functions script
# exists, its definition will override the portable way.
function echo_failure() { echo -en "\n[FAILED]"; }
function echo_success() { echo -en "\n[OK]"; }
[ -f /etc/rc.d/init.d/functions ] && source /etc/rc.d/init.d/functions
 
# Very useful for debugging
#set -x
 
# Find PID of the newest (-n) process owned by $PDIUSER (-u) with carte.sh on
# the full (-f) command, arguments included.
# => this should yield the pid of 'sh ./carte.sh' on STDOUT, with a status of 0
# if there is such a process, 1 otherwise

#M1 cerco anche l'ultimo processo java
LATESTPID="pgrep -u $PDIUSER -n -f java";
FINDPID="pgrep -u $PDIUSER -n -f carte.sh";

function _is_running() {
    $FINDPID 1>/dev/null
    return $?
}
 
function stop_carte() {
    _is_running
    if [ $? -ne 0 ]; then
        echo -n "$0 is not running, cannot stop."
        echo_failure
        echo
        return 1
    else
        echo -n "Stopping $0..."
        # Finding the pid of carte.sh from $FINDPID. Killing it would leave its
        # child, the actual java process, running.
        # Find this java process via ps and kill it.
        $FINDPID | xargs ps h -o pid --ppid | xargs kill

	#M6 prelevo il pid dal file java.pid e uccido il processo
	file="/usr/share/data-integration/java.pid"
	while IFS= read -r line
	do
		kill -9 "$line" 
	done <"$file"

        sleep 1

        _is_running
        if [ $? -eq 0 ]; then
            echo_failure
            echo
            return 1
        else
            echo_success
            echo
            return 0
        fi
    fi
 
}
 
function status() {
    _is_running
    if [ $? -eq 0 ]; then
        echo -n "$0 is running."
        echo_success
        echo
        return 0
    else
        echo -n "$0 does not run."
        echo_failure
        echo
        return 1
    fi
}
 
function start_carte() {
    _is_running
    if [ $? -eq 0 ]; then
        echo -n "$0 already running."
        echo_failure
        echo
        return 1
    else
        echo -n "Starting $0..."
        # Make sure log files exist and are writable by $PDIUSER first
        touch $LOGOUT $LOGERR
        chown $PDIUSER:$PDIUSER $LOGOUT $LOGERR
        #su - $PDIUSER -c "cd $PDIROOT && (nohup sh ./carte.sh $(hostname -i) $CARTEPORT 0<&- 1>>$LOGOUT 2>>$LOGERR &)"
	
	#M3 Utilizzo il file di configurazione al posto dei parametri diretti per avviare Carte
        su - $PDIUSER -c "cd $PDIROOT && (nohup sh ./carte.sh $PDIROOT/configuration.xml 0<&- 1>>$LOGOUT 2>>$LOGERR &)"
	
	sleep 5

   	#M2 stampo su file il pid di carte per abilitare il monitoraggio da parte di monit
   	$FINDPID > /usr/share/data-integration/carte.pid

	#M4 Salvo il pid dell'ultimo processo java istanziato
	$LATESTPID > /usr/share/data-integration/java.pid

        sleep 5
        _is_running
        if [ $? -eq 0 ]; then
            echo_success

	    #M5 Avvio i job demoni
            sleep 15
            su - $PDIUSER -c "cd $PDIROOT && sh ./runjob1.sh"
            echo -n "Job 1 avviato"
            sleep 5
            su - $PDIUSER -c "cd $PDIROOT && sh ./runjob2.sh"
            echo -n "Job 2 avviato"

            echo
            return 0
        else
            echo_failure
            echo
            return 1
        fi

    fi
}
 
case "$1" in
    start)
        start_carte
        exit $?
        ;;
    stop)
        stop_carte
        exit $?
        ;;
    reload|force-reload|restart|force-restart)
        stop_carte
        if [ $? -eq 0 ]; then
            start_carte
            exit $?
        else
            exit 1
        fi
        ;;
    status)
       status
       exit $?
       ;;
    *)
        echo "Usage: $0 {start|stop|restart|status}"
        exit 2
esac
exit 0

Cosa ho modificato e perché

Tutte le mie modifiche nello script sono facilmente rintracciabili in quanto iniziano con #M e poi sono in italiano.

Nei file runJobX.sh utilizzo CURL per richiamare i web service discussi in questo articolo.

curl http://myuser:mypassword@mydomain:8086/kettle/runJob/?job=/mypath/myjob&amp;amp;par1=value1&amp;amp;par2=value2

Configurazione monitoraggio Carte

check process carte with pidfile "/usr/share/data-integration/carte.pid" alert nizzoalessandro@gmail.com only on { timeout,nonexist,resource,pid,connection } 
start program = "/etc/init.d/carte start"
stop program = "/etc/init.d/carte stop"
if failed url http://myuser:mypassword@mydomain:8086 then alert
if failed url http://myuser:mypassword@mydomain:8086 for 5 cycles then restart

Configurazione monitoraggio Tomcat (Liferay bundle)

check process tomcat with pidfile "/nodo1/CincottiCompany/liferay-portal-6.2-ce-ga6/tomcat-7.0.62/bin/catalina.pid" alert nizzoalessandro@gmail.com only on { timeout,nonexist,resource,pid,connection } 
start program = "/etc/init.d/tomcat start"
stop program = "/etc/init.d/tomcat stop"
if failed port 8080 then alert
if failed port 8080 for 5 cycles then restart

Verifichiamo l’avvio del monitoraggio

Ricarichiamo la configurazione e rilanciamo lo status

monit status
The Monit daemon 5.6 uptime: 22m 

Process 'tomcat'
  status                            Running
  monitoring status                 Monitored
  pid                               2615
  parent pid                        1
  uptime                            11m 
  children                          0
  memory kilobytes                  2399860
  memory kilobytes total            2399860
  memory percent                    29.3%
  memory percent total              29.3%
  cpu percent                       0.1%
  cpu percent total                 0.1%
  port response time                0.000s to localhost:8080 [DEFAULT via TCP]
  port response time                0.000s to localhost:8080 [DEFAULT via TCP]
  data collected                    Thu, 15 Dec 2016 06:20:21

Process 'mysqld'
  status                            Running
  monitoring status                 Monitored
  pid                               9586
  parent pid                        8520
  uptime                            15h 8m 
  children                          0
  memory kilobytes                  280256
  memory kilobytes total            280256
  memory percent                    3.4%
  memory percent total              3.4%
  cpu percent                       0.2%
  cpu percent total                 0.2%
  unix socket response time         0.000s to /var/run/mysqld/mysqld.sock [MYSQL]
  port response time                0.000s to localhost:3306 [MYSQL via TCP]
  data collected                    Thu, 15 Dec 2016 06:20:21

File 'mysql_bin'
  status                            Accessible
  monitoring status                 Monitored
  permission                        755
  uid                               0
  gid                               0
  timestamp                         Tue, 23 Feb 2016 14:32:38
  size                              11771008 B
  checksum                          72b4de20ca59d514f40969935a2ba032 (MD5)
  data collected                    Thu, 15 Dec 2016 06:20:21

File 'mysql_rc'
  status                            Accessible
  monitoring status                 Monitored
  permission                        755
  uid                               0
  gid                               0
  timestamp                         Tue, 23 Feb 2016 14:32:39
  size                              5491 B
  checksum                          2cc1e39210498f561c2a70ca20f97e28 (MD5)
  data collected                    Thu, 15 Dec 2016 06:20:21

Process 'carte'
  status                            Running
  monitoring status                 Monitored
  pid                               818
  parent pid                        1
  uptime                            16m 
  children                          3
  memory kilobytes                  772
  memory kilobytes total            817844
  memory percent                    0.0%
  memory percent total              10.0%
  cpu percent                       0.0%
  cpu percent total                 0.2%
  port response time                0.001s to 10.0.128.41:8086/ [HTTP via TCP]
  port response time                0.002s to 10.0.128.41:8086/ [HTTP via TCP]
  data collected                    Thu, 15 Dec 2016 06:20:21

System 'myserver.it'
  status                            Running
  monitoring status                 Monitored
  load average                      [0.00] [0.12] [0.48]
  cpu                               0.4%us 0.1%sy 0.0%wa
  memory usage                      4424096 kB [54.1%]
  swap usage                        17940 kB [0.2%]
  data collected                    Thu, 15 Dec 2016 06:20:21

Testiamo la mail

Per testare l’email ci basta riavviare uno dei processi sotto monitoraggio. Nel mio caso ho riavviato Carte.

service carte restart
Stopping /etc/init.d/carte...
[OK]
Starting /etc/init.d/carte...
[OK]
...

Questa la mail che arriva per impostazione di default. Come al solito basta lavorarsi il file monitrc per personalizzarla.

Da: alert@myserver.it
Oggetto: monit alert -- PID changed carte
Corpo del messaggio:
PID changed Service carte
                 Date:        Thu, 15 Dec 2016 06:04:20
                 Action:      alert
                 Host:        feapp.cincotticompany.it
                 Description: process PID changed from 9906 to 818

            Your faithful employee,
            Monit

Usi anche tu Lifery insieme a Carte?

Allora non devi far altro che scaricare ed utilizzare Life2Carte.

Sitografia