você está aqui: Home  → Arquivo de Mensagens

Criando belos gráficos com GNUPlot

Colaboração: Gustavo Mendes de Carvalho

Data de Publicação: 11 de agosto de 2011

Há alguns meses atrás eu me lembro de ter visto uma dica muito interessante sobre a criação de gráficos de ocupação de espaço em disco, utilizando para isso a Google Chart Tools, porém a criação destes gráficos ficava sempre vinculada ao envio dos dados para o Google lhe devolver uma URL com o respectivo gráfico.

Porém como em alguns casos não é possível que uma máquina não tenha o acesso à Internet, fiz uma pesquisa sobre métodos de se criar gráficos em Linux, quando me deparei com uma ferramentra chamada GNUPlot.

Esta ferramenta é muito poderosa e bem simples de se usar. Basicamente, esta ferramenta gera diversos tipos de gráficos, tendo como informações de entrada apenas uma lista numérica, do tipo:

  cat lista.dat
  31/05/2010      33670
  01/06/2010      23700
  02/06/2010      23950
  03/06/2010      22455
  04/06/2010      10939
  05/06/2010      5498
  06/06/2010      23168
  07/06/2010      23096
  08/06/2010      23954
  09/06/2010      24102
  10/06/2010      22909
  11/06/2010      11639
  12/06/2010      6770
  13/06/2010      26603
  14/06/2010      25437
  15/06/2010      25597
  16/06/2010      24613
  17/06/2010      23166
  18/06/2010      11474
  19/06/2010      6659
  20/06/2010      26154
  21/06/2010      26301

Com base nesta lista, eu decidi verificar em um gráfico estes valores. Inicialmente eu criei um arquivo texto simples, com as entradas necessárias necessárias ao GNUPlot para criar um gráfico de barras bem simples.

  cat grafico.plot
  reset
  set terminal png size 700,200
  set output '/var/www/graf/grafico.png'
  set size 1,1
  set boxwidth 0.7 relative
  set style fill solid 1.0 border lt -1
  set grid
  set xdata time
  set format x "%d"
  set xrange ["31/05/2010":"21/06/2010"]
  set xlabel "Dias"
  set ylabel "Total"
  plot '/var/www/graf/lista.dat' using 1:2 with boxes t''
  exit

Depois disso, basta executar o comando

  root@linux:/var/www/graf# gnuplot grafico.plot

O resultado foi um gráfico bastante interessante. Copiem estes arquivos e executem os comandos.

Baseado nisso, eu então resolvi criar scripts em shell para monitorar a CPU de 1 servidor windows que eu tenho. Para isso, eu criei este script abaixo, que faz a coleta das informações de consumo de CPU no meu servidor, armazena o histórico das informações, gera o arquivo plot específico, e cria o gráfico:

  #!/bin/bash
  #-------------------------------------------------------------
  #
  # Este script tem a funcao de coletar as informacoes de
  #  consumo de CPU dos servidores fisicos, adicionando estes
  #  valores em um arquivo de texto, para que possa ser
  #  apresentado em uma pagina de monitoracao
  #
  # O formato do arquivo de saida segue o padrao
  #  dd/mmm/yyyy hh:mm CPU1 CPU2 IPServidor
  #
  # data: 09/jul/2011
  # por: Gustavo Mendes de Carvalho
  #-------------------------------------------------------------
  
  # Comandos usados
  BASEDIR="/var/www/cpuwin"
  ARQUIVOPLOT="$BASEDIR/plot.gnu"
  SNMPGET="/usr/bin/snmpget"
  AWK="/usr/bin/awk"
  TAIL="/usr/bin/tail"
  GREP="/bin/grep"
  ECHO="/bin/echo"
  RM="/bin/rm"
  GNUPLOT="/usr/bin/gnuplot"
  COMUNIDADE="comunidadesnmp"
  IP1="10.1.28.17"
  OID1CPU="1.3.6.1.2.1.25.3.3.1.2.2"
  OID2CPU="1.3.6.1.2.1.25.3.3.1.2.3"
  ARQDADOS="$BASEDIR/cpu-$IP1.dat"
  ARQ1CPU="$BASEDIR/cpu1.tmp"
  ARQ2CPU="$BASEDIR/cpu2.tmp"
  AGORA=`/bin/date "+%d/%h/%Y %H:%M"`
  
  # Obtencao dos valores de consumo de CPU
  PERCENT1=`$SNMPGET -v 2c -c $COMUNIDADE $IP1 $OID1CPU | $AWK '{print $4}'`
  PERCENT2=`$SNMPGET -v 2c -c $COMUNIDADE $IP1 $OID2CPU | $AWK '{print $4}'`
  $ECHO $AGORA" "$PERCENT1" "$PERCENT2" "$IP1 >> $ARQDADOS
  
  #Sequencia de comandos para a geracao dos graficos
  $TAIL -180 $ARQDADOS | $GREP $IP1 | $AWK '{print $3}'> $ARQ1CPU
  $TAIL -180 $ARQDADOS | $GREP $IP1 | $AWK '{print $4}'> $ARQ2CPU
  
  # Criacao do arquivo plot para a geracao do grafico
  $ECHO "reset" > $ARQUIVOPLOT
  $ECHO "set grid front linetype 0 linewidth 1.000,  linetype 0 linewidth 1.000" >> $ARQUIVOPLOT
  $ECHO "set terminal png size 430,220" >> $ARQUIVOPLOT
  $ECHO -n "set output 'cpu-" >> $ARQUIVOPLOT
  $ECHO $IP1".png'" >> $ARQUIVOPLOT
  $ECHO "set size 1,1" >> $ARQUIVOPLOT
  $ECHO "set grid ytics" >> $ARQUIVOPLOT
  $ECHO -n 'set title "CPU Servidor ' >> $ARQUIVOPLOT
  $ECHO $IP1 '(2 cpus)"' >> $ARQUIVOPLOT
  $ECHO "show title" >> $ARQUIVOPLOT
  $ECHO "unset xtics" >> $ARQUIVOPLOT
  $ECHO 'set xlabel "3                  2     horas       1                  0' >> $ARQUIVOPLOT
  $ECHO "plot '$ARQ1CPU' with filledcurves x1 lt 2 lw 1 t'', \\" >> $ARQUIVOPLOT
  $ECHO "     '$ARQ2CPU' with lines lt 1 lw 2 t''" >> $ARQUIVOPLOT
  $ECHO "exit" >> $ARQUIVOPLOT
  
  # Criacao do grafico
  cd $BASEDIR
  $GNUPLOT $ARQUIVOPLOT
  
  # Exclusao dos arquivos tempporarios
  $RM -fr $ARQ1CPU $ARQ2CPU $ARQUIVOPLOT

Feito isso, basta criar uma entrada no crontab de seu linux, para executar este script a cada alguns minutos. É claro que eu ainda estou melhorando este script para fazer a coleta de consumo de CPU em mais de 1 servidor, mas ainda não está terminado.

Para ver o arquivo plot final, basta comentar a última linha deste script, que remove este arquivo. Com isso, voces poderão ver como ficam as instruções neste arquivo.

Esta ferramenta também disponibiliza um excelente manual em seu site http://gnuplot.info/, além de vários exemplos de gráficos que podem ser gerados com ela.

Fiquem à vontade para entrar em contato, e aceito sugestões de melhoria :-)

Um abraço a todos



Veja a relação completa dos artigos de Gustavo Mendes de Carvalho

 

 

Opinião dos Leitores

Lucas Villela Canôas
13 Ago 2011, 19:31
Boa dica! Procurei muito sobre geradores de gráficos no Linux, mas não tinha achado um realmente bom, e então utilizava o google chart mesmo, mas como você disse tinha a limitação pelo acesso à internet, parabéns! Vou pesquisar sobre o GNUPlot, e quando tiver tempo faço um artigo sobre ele (:

abraços
Murilo Fujita
12 Ago 2011, 15:55
Depois de corrigir o arquivo grafico.plot trocando '/var/www/graf/grafico.png' por um diretório do meu userspace, gerou um gráfico de barras muito bem feito.
Gostei muito do artigo do autor. Eu já usava gnuplot, mas ainda não tinha uma interação com shell script. Uma ótima ideia! Parabéns!
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script