IFPR-Labtelecom: CMS (Uptime)

O uptime indica quanto tempo um determinado equipamento está ligado sem interrupções. Essas interrupções podem ocorrer por diversos motivos, dentre eles podemos citar queda de energia e atualizações que precisam reiniciar o dispositivo. O Labtelecom possui servidores de rede e nessa página são apresentadas algumas técnicas desenvolvidas para monitorar o uptime de alguns equipamentos. No final de cada dia um script no servidor principal verifica automaticamente o uptime dos equipamentos e apresenta a resposta temporal abaixo. Nesse gráfico, a linha em preto é uma referência do dispositivo FailsafePi que está conectado em um no-break e por isso é mais difícil de zerar o uptime por interrupção de energia. O gráfico em azul é do servidor principal que tem duas fontes de energia conectadas apenas em estabilizadores de energia. Importante salientar que o uptime também pode ser resetado por alguma atualização de software.

Aquisição no Linux:

Geralmente, os equipamentos tem algum comando que fornece esses valores de uptime, por exemplo no Linux o comando uptime no terminal fornece o seguinte resultado:

14:46:33 up 32 days, 4:52, 2 users, load average: 0,98, 1,26, 1,17

Nesse caso, o sistema desenvolvido mede a quantidade de dias, logo é realizada uma medição diária e salva no arquivo Uptime_acc.txt. O comando sed é utilizado para filtrar a resposta fornecida pelo comando uptime.

(uptime;) > Uptime_acc.txt; UPTIME_1=$(sed -e 's/up / /g' -e 's/\day.*//' Uptime_acc.txt);

Na segunda linha são retirados a expressão up e tudo que vem descrito depois de days, resultando apenas no horário da medição e a quantidade de dias sem interrupção:

14:46:33 32

Aquisição no Raspberry Pi:

Semelhante ao Linux, o Raspberry Pi fornece o mesmo resultado com o comando uptime. Logo, é possível realizar a mesma técnica de captura. Inicialmente o servidor do laboratório realiza a captura remota com o comando sshpass salvando o resultado na arquivo Uptime_acc.txt.

(sshpass -p "SENHA" ssh pi@192.168.1.244 uptime;) > Uptime_acc.txt;

O mesmo procedimento de filtragem é realizado com o comando sed, porém o resultado é armazenado na varíavel UPTIME_2, conforme mostrado abaixo.

UPTIME_2=$(sed -e 's/up / /g' -e 's/\day.*//' Uptime_acc.txt);

Armazenamento:

Após o procedimento de leitura é necessário armazenar os dados da aquisição (varíaveis UPTIME_1 e UPTIME_2). Nesse caso, é utilizado o comando echo sendo plotado no arquivo Uptime.txt a data de leitura na primeira coluna e posteriormente as váriaveis com o uptime dos equipamentos.

(echo -e $(date +%Y)/$(date +%m)/$(date +%d)" "$UPTIME_1 $UPTIME_2) >> Uptime.txt;

Com o comando tail podemos filtrar a quantidade de amostras, por exemplo se quiser saber o resultado dos últimos 30 dias, basta informar o parâmetro tail -n 30, conforme abaixo.

tail -n 30 Uptime.txt > Uptime_buffer.txt;

Logo abaixo é possível ver a resposta com o comando cat Uptime_buffer.txt com os dados de aquisição dos últimos 30 dias.

2019/07/15 23:09:44 2 23:09:44 37 2019/07/16 23:09:23 3 23:09:24 38 2019/07/17 23:09:02 4 23:09:02 39 2019/07/18 23:10:09 5 23:10:10 40 2019/07/19 23:09:15 6 23:09:15 41 2019/07/20 23:09:29 7 23:09:30 42 2019/07/21 23:10:30 8 23:10:31 43 2019/07/22 23:10:53 9 23:10:53 44 2019/07/23 23:08:31 10 23:08:32 45 2019/07/24 23:10:29 11 23:10:29 46 2019/07/25 23:09:36 12 23:09:37 47 2019/07/26 23:10:03 13 23:10:03 48 2019/07/27 23:11:00 14 23:11:00 49 2019/07/28 23:10:03 15 23:10:03 50 2019/07/29 23:10:41 16 23:10:41 51 2019/07/30 23:10:33 17 23:10:34 52 2019/07/31 23:11:38 18 23:11:38 53 2019/08/01 23:10:01 19 23:10:01 54 2019/08/02 23:10:19 20 23:10:20 55 2019/08/03 23:10:07 21 23:10:07 56 2019/08/04 23:09:10 22 23:09:10 57 2019/08/05 23:10:58 23 23:10:58 58 2019/08/06 23:10:07 24 23:10:08 59 2019/08/07 23:09:55 25 23:09:55 60 2019/08/08 23:10:15 26 23:10:16 61 2019/08/09 23:10:43 27 23:10:44 62 2019/08/10 23:08:48 28 23:08:48 63 2019/08/11 23:09:33 29 23:09:33 64 2019/08/12 23:10:58 30 23:10:59 65 2019/08/13 23:09:20 31 23:09:20 66

Plotagem:

Com base no arquivo Uptime_buffer.txt mostrado logo acima, foi utilizado o gnuplot para mostrar a resposta temporal da medição, conforme o script

gnuplot -e "set title ''; set xlabel 'Tempo - Mês/Dia' offset 0,-1; set ylabel 'Quantidade de dias'; set terminal png size 750,440; set xdata time; set timefmt '%Y/%m/%d'; set style data lines; set autoscale xfix; set linetype 1 lw 2 lc rgb 'blue'; set linetype 2 lw 2 lc rgb 'red'; set timestamp; set grid; set terminal png size 750,440; plot 'Uptime_buffer.txt' using 1:3 title'Amanda Server', 'Uptime_buffer.txt' using 1:5 title'FailsafePi' " > Uptime.png;

Na figura abaixo é apresentada a resposta do uptime no período de 06/06/2019 até 14/08/2019.

É importante salientar que em 06/06/2019 (logo no começo do gráfico) os dois dispositivos reiniciaram. Nesse dia, foi observada uma interrupção longa de energia e o FailsafePi que está ligado em um no-break também reiniciou devido a falta de energia. No dia 14/07/2019 o servidor foi reiniciado devido uma atualização. Apesar de não relatar o evento, essa resposta temporal permite visualizar em qual dia ocorreu uma interrupção de um determinado equipamento.

Web:

Para enviar os dados para esse site foi utilizado GDrive no Linux. Inicialmente é necessário fazer o upload do arquivo Uptime.png conforme comando:

./gdrive-linux-x64 upload -p 1iw18oMh071kYoEPj11T2U42VgIlZz-z9 Uptime.png

Na sequência basta atualizar o gráfico na nuvem com o comando:

./gdrive-linux-x64 update 1oFH2r0-PCljWkFC8UlCoVnnKS5x$5hrR Uptime.png

É importante salientar que o arquivo é enviado para a conta do Google Drive sendo necessário um cadastro inicial pelo Gdrive. Além disso, é necessário liberar as permissões do arquivo caso deseje compartilhar na internet.

Conclusão:

O script completo é apresentado logo abaixo, sendo executado automaticamente pelo crontab todos os dias as 23:00 hrs no servidor principal. No final do script o gráfico com a resposta temporal é enviado a nuvem e apresentado no começo dessa página.

cd /home/cluster; (uptime;) > Uptime_acc.txt;UPTIME_1=$(sed -e 's/up / /g' -e 's/\day.*//' Uptime_acc.txt);(sshpass -p "SENHA" ssh pi@192.168.1.244 uptime;) > Uptime_acc.txt; UPTIME_2=$(sed -e 's/up / /g' -e 's/\day.*//' Uptime_acc.txt); (echo $(date +%Y)/$(date +%m)/$(date +%d)" "$UPTIME_1 $UPTIME_2) >> Uptime.txt; tail -n 100 Uptime.txt > Uptime_buffer.txt; gnuplot -e "set title ''; set xlabel 'Tempo - Mês/Dia' offset 0,-1; set ylabel 'Quantidade de dias'; set terminal png size 750,440; set xdata time; set timefmt '%Y/%m/%d'; set style data lines; set autoscale xfix; set linetype 1 lw 2 lc rgb 'blue'; set linetype 2 lw 2 lc rgb 'red'; set timestamp; set grid; set terminal png size 750,440; plot 'Uptime_buffer.txt' using 1:3 title'Amanda Server', 'Uptime_buffer.txt' using 1:5 title'FailsafePi' " > Uptime.png; ./gdrive-linux-x64 update 1oFH2r0-PCljWkFC8UlCoVnnKS5x$5hrR Uptime.png;

Em 02/09/2019 foi modificada a resposta do gráfico para melhor apresentacao dos dados, segue script completo logo abaixo:

cd /home/cluster; (uptime;) > Uptime_acc.txt;UPTIME_1=$(sed -e 's/up / /g' -e 's/\day.*//' Uptime_acc.txt);(sshpass -p "SENHA" ssh pi@192.168.1.244 uptime;) > Uptime_acc.txt; UPTIME_2=$(sed -e 's/up / /g' -e 's/\day.*//' Uptime_acc.txt); (echo $(date +%Y)/$(date +%m)/$(date +%d)" "$UPTIME_1 $UPTIME_2) >> Uptime.txt; tail -n 100 Uptime.txt > Uptime_buffer.txt; gnuplot -e "set title ''; set xlabel 'Tempo - Mês/Dia' offset 0,-1; set ylabel 'Quantidade de dias'; set terminal png size 750,440; set xdata time; set timefmt '%Y/%m/%d'; set style data histeps; set autoscale xfix; set linetype 1 lw 2 lc rgb 'blue'; set linetype 2 lw 2 lc rgb 'black'; set timestamp; set grid; set terminal png size 750,440; plot 'Uptime_buffer.txt' using 1:3 title'Amanda Server' w boxes fill solid 1 border 1, 'Uptime_buffer.txt' using 1:5 title'FailsafePi'" > Uptime.png;; ./gdrive-linux-x64 update 1oFH2r0-PCljWkFC8UlCoVnnKS5x$5hrR Uptime.png;

Obs: a hash dos arquivos foram modificadas e as senhas foram omitidas por questões de segurança.