LogPlot Class Reference

#include <MonitorWindow.h>

Public Member Functions

 LogPlot (QWidget *parent=0, char *name=0)
 Construtor da classe.
bool ProcessSearchLogs (char *FileName, unsigned int SearchType, QString ServerAddress)
 Funcao para processar um arquivo com o resultado de uma busca nos logs.
bool SaveLogsData (const char *DataFileName)
 Funcao para salvar os logs em um arquivo.

Private Member Functions

bool ProcessConnectedClientsLogLine (char *LogLine)
 Funcao para processar uma linha do resultado da busca nos logs de clientes conectados (do servidor de gerenciamento).
bool ProcessSendRateLogLine (char *LogLine)
 Funcao para processar uma linha do resultado da busca nos logs de pacotes enviados (de um dos servidores de armazenamento).

Private Attributes

LogPoints Points
 Vetor com os pontos da curva atualmente no grafico.
QwtPlotCurve * LogCurve
 Ponteiro para a curva com o grafico atual.
TimeScaleDrawxAxis
 Classe que plota o eixo x.

Detailed Description

Definition at line 225 of file MonitorWindow.h.


Constructor & Destructor Documentation

LogPlot::LogPlot ( QWidget *  parent = 0,
char *  name = 0 
)

Construtor da classe.

Definition at line 372 of file MonitorWindow.cpp.

00372                                               : QwtPlot( parent, name )
00373 {
00374     // Show a legend at the bottom
00375     QwtLegend *legend = new QwtLegend();
00376     insertLegend( legend, QwtPlot::TopLegend );
00377     // Altera o fundo para branco
00378     setCanvasBackground( Qt::white );      
00379     // Define como o eixo x deve ser plotado (usando o tempo)
00380     xAxis = new TimeScaleDraw();
00381     setAxisScaleDraw( xBottom, xAxis );
00382     // Faz com que a grade do grafico se alinhe com os eixos.
00383     plotLayout()->setAlignCanvasToScales( true );
00384 }


Member Function Documentation

bool LogPlot::ProcessConnectedClientsLogLine ( char *  LogLine  )  [private]

Funcao para processar uma linha do resultado da busca nos logs de clientes conectados (do servidor de gerenciamento).

Parameters:
LogLine linha do log a ser processada.
Returns:
true se a linha foi processada com sucesso, ou false se algum erro ocorreu ao processar a linha.

Definition at line 388 of file MonitorWindow.cpp.

00389 {
00390     // Variavel que armazena o tempo lido do arquivo.
00391     unsigned long LogTime;
00392     // Variavel qua armazena o valor lido que, dependendo do tipo da busca, sera
00393     // a taxa de envio ou o numero de clientes (ou de sessoes).
00394     unsigned int LogValue;
00395     // Variavel para armazenar o tipo da operacao.
00396     char LogOperation[ MAXLOGLINESIZE + 1 ];
00397     // Variavel temporaria para armazenar o numero de comandos processados no
00398     // sscanf.
00399     int ScanCount;
00400     // Verifica se a linha possui o formato valido. Neste caso, a linha deve 
00401     // possuir o seguinte formato:
00402     // <tempo> <clientes> <operacao> <arquivo> <IP> <porta>, onde:
00403     //     <tempo> tempo em que a linha do log foi gerada.
00404     //     <clientes> numero de clientes conectados (quando a operacao foi 
00405     //                executada).
00406     //     <operacao> operacao executada sobre o arquivo. "Open" indica a 
00407     //                a abertura de um arquivo transferido normalmente, 
00408     //                "OpenCAC" indica um arquivo transferido em tempo real, 
00409     //                "Close" indica que um arquivo aberto foi fechado,
00410     //                "Connected" indica que um cliente se conectou e,
00411     //                "Disconnected" indica que um cliente se desconectou.
00412     //     <arquivo> arquivo associado a <operacao> descrita anteriormente.
00413     //     <IP> endereco IP (TCP) do cliente que executou <operacao>.
00414     //     <porta> porta (TCP) do cliente que executou <operacao>.
00415     ScanCount = sscanf( LogLine, "%lu %u %s %*s %*s %*u", &LogTime, &LogValue, 
00416                         ( char * ) &LogOperation ); 
00417     if( ( ScanCount == 3 ) && 
00418         ( ( strcmp( LogOperation, "Connected" ) == 0 ) || 
00419           ( strcmp( LogOperation, "Disconnected" ) == 0 ) ) )
00420     {
00421         #ifdef RIO_DEBUG2
00422         RioErr << "MonitorWindow::ProcessConnectedClientsLogLine verificando o "
00423                << "log no tempo " << LogTime << " e o valor " << LogValue 
00424                << ". Numero de pontos e igual a " << Points.size() << endl;
00425         #endif
00426         // Verifica se precisamos criar um novo ponto ou mudar o ultimo ponto 
00427         // inserido.
00428         if( ( Points.size() == 0 ) || 
00429             ( ( unsigned int ) Points.lastX() != LogTime ) )
00430         {
00431             // O tempo e novo. Devemos criar um novo ponto.
00432             if( Points.size() != 0 )
00433             {
00434                 // Antes, vamos preencher a lista com valores se o tempo novo 
00435                 // nao for consecutivo ao tempo anterior. Neste caso, vamos 
00436                 // preencher o gap com o mesmo valor do ultimo tempo antes do 
00437                 // gap.
00438 
00439                 // Variavel que armazena o ultimo tempo em Points ao 
00440                 // preenchermos um gap entre este ultimo tempo e o novo tempo 
00441                 // que vamos inserir.
00442                 unsigned int StartTime;
00443                 StartTime = ( ( unsigned int ) Points.lastX() ) + 1;
00444  
00445                 #ifdef RIO_DEBUG2
00446                 RioErr << "MonitorWindow::ProcessConnectedClientsLogLine "
00447                        << "colocando os pontos  com os tempos de " << StartTime 
00448                        << " ate " << LogTime - 1 << " usando o valor " 
00449                        << Points.lastY() << " em cada um destes pontos" 
00450                        << endl;
00451                 #endif
00452                   
00453                 Points.push( StartTime, LogValue );
00454             }
00455             #ifdef RIO_DEBUG2
00456             RioErr << "MonitorWindow::ProcessConnectedClientsLogLine colocando " 
00457                    << "o ponto (" << LogTime << ", " << LogValue 
00458                    << ") em Points" << endl;
00459             #endif
00460 
00461             Points.push( LogTime, LogValue );
00462         }
00463         else
00464         {
00465             // O tempo foi inserido anteriormente. Deveremos substituir o valor 
00466             // pelo maior dos valores.
00467             if( Points.lastX() < LogValue )
00468             {
00469                 #ifdef RIO_DEBUG2
00470                 RioErr << "MonitorWindow::ProcessConnectedClientsLogLine " 
00471                        << "atualizando o  ponto (" << Points.lastX() << ", " 
00472                        << Points.lastY() << ") para o ponto (" << LogTime 
00473                        << ", " << LogValue << ") em Points" << endl;
00474                 #endif
00475                 Points.setLastY( LogValue );
00476             }
00477         }
00478         return true;
00479     }
00480     else if( ScanCount == 3 )
00481     {
00482         // A linha foi descartada.
00483         #ifdef RIO_DEBUG2
00484         RioErr << "MonitorWindow::ProcessConnectedClientsLogLine LogOperation "
00485                << LogOperation << endl;
00486         RioErr << "MonitorWindow::ProcessConnectedClientsLogLine a linha "
00487                << LogLine << " foi ignorada!" << endl;
00488         #endif
00489         return true; 
00490     }
00491     else
00492     {
00493         // A linha possui o formato invalido.
00494         #ifdef RIO_DEBUG2
00495         RioErr << "MonitorWindow::ProcessConnectedClientsLogLine a linha "
00496                << LogLine << " esta em um formato incorreto!" << endl;
00497         #endif
00498         return false; 
00499     }
00500 }

bool LogPlot::ProcessSearchLogs ( char *  FileName,
unsigned int  SearchType,
QString  ServerAddress 
)

Funcao para processar um arquivo com o resultado de uma busca nos logs.

Parameters:
FileName arquivo (compactado) com os logs.
SearchType tipo da busca (SEARCHINTRAFFICLOGS para buscas nos logs de um dos servidores de armazenamento e SEARCHINCLIENTSLOGS para buscas nos logs do servidor de gerenciamento). Obs: Os pontos computados a partir dos logs sao colocados nos vetores XPoint (as abscissas dos pontos) e YPoint (as ordenadas dos pontos)
ServerAddress string com o endereco IP do servidor associado a busca.
Returns:
true se o grafico foi plotado com sucesso ou false se algum erro ocorreu ao plotarmos o grafico.

Definition at line 596 of file MonitorWindow.cpp.

00598 {
00599     // Identificador para o arquivo compactado a ser aberto.
00600     gzFile File;
00601     // Buffer para ler uma linha do arquivo.
00602     char LogLine[ MAXLOGLINESIZE + 1 ];
00603     // Flag usada para indicar que nenhum erro ocorreu ao processarmos o 
00604     // arquivo.
00605     bool NoError;
00606     // Curva a ser criada
00607     QwtPlotCurve *Curve;
00608 
00609     // Limpa a curva que estava anteriormente no grafico.
00610     Points.clear();
00611     detachItems();
00612     
00613     // Verifica se o tipo da busca e valido.
00614     if( ( SearchType == SEARCHINTRAFFICLOGS ) || 
00615         ( SearchType == SEARCHINCLIENTSLOGS ) )
00616     {
00617         // Tenta abrir o arquivo para leitura
00618         File = gzopen( FileName, "rb" );
00619         NoError = ( File != NULL );
00620     }
00621     else
00622     {
00623         NoError = false;
00624         File = NULL;
00625     }
00626     if( File != NULL )
00627     {
00628         while( ( NoError ) && ( !gzeof( File ) ) )
00629         {
00630             // Tenta ler uma linha do arquivo de logs.
00631             if( gzgets( File, LogLine, MAXLOGLINESIZE ) != Z_NULL )
00632             {
00633                 #ifdef RIO_DEBUG2
00634                 RioErr << "MonitorWindow::ProcessSearchLogs Processando a "
00635                        << " linha " << LogLine << " do arquivo " << FileName 
00636                        << endl;
00637                 #endif       
00638                 // Le e processa de acordo com o tipo da busca.
00639                 switch( SearchType )
00640                 {
00641                     // Logs com os clientes conectados (servidor de
00642                     // gerenciamento).
00643                     case SEARCHINTRAFFICLOGS:
00644                         NoError = ProcessSendRateLogLine( LogLine );
00645                         break;
00646                     // Logs de envio de pacotes (servidor de armazenamento).
00647                     case SEARCHINCLIENTSLOGS:
00648                         NoError = ProcessConnectedClientsLogLine( LogLine );
00649                         break;
00650                     // Se chegarmos aqui temos um erro interno, pois
00651                     // verificamos acima se o tipo de log era valido.
00652                     default:
00653                         NoError = false;
00654                         break;  
00655                 }
00656             }
00657             else
00658                 NoError = false;
00659         }
00660         // Fecha o arquivo compactado.
00661         gzclose( File );
00662     } 
00663     
00664     // Verifica se algum erro ocorreu ao processarmos os logs.
00665     if( !NoError )
00666     {
00667         #ifdef RIO_DEBUG2 
00668         RioErr << "MonitorWindow::ProcessSearchLogs Erro ao ler o arquivo "
00669                << FileName << " com os logs" << endl;
00670         #endif       
00671         Points.clear();
00672         
00673         return false;
00674     }
00675     else
00676     {
00677         // Se a busca for do tipo SEARCHINTRAFFICLOG, entao divide a taxa do 
00678         // ultimo ponto por 1000000, caso exista este ponto, para converter de 
00679         // bits/s para Mbits/s.
00680         if( ( Points.size() != 0 ) && ( SearchType == SEARCHINTRAFFICLOGS ) )
00681             Points.setLastY( Points.lastY() / 1000000.0 );
00682         // Como os dados foram corretamente processados, devemos agora construir
00683         // a curva do grafico.
00684         #ifdef RIO_DEBUG2 
00685         RioErr << "MonitorWindow::ProcessSearchLogs O arquivo " << FileName 
00686                << " foi processado com sucesso" << endl;
00687         #endif
00688 
00689         // Cria uma nova curva.
00690         Curve = new QwtPlotCurve( ServerAddress );
00691 
00692         // Define os dados da curva.
00693         Curve->setData( Points );
00694         // Define os limites do eixo x, baseado no menor (a abscissa do primeiro 
00695         // ponto) e no maior (a abscissa do ultimo ponto) tempo.
00696         setAxisScale( QwtPlot::xBottom, Points.firstX(), Points.lastX() );
00697         // Define a cor da curva
00698         Curve->setPen( QPen( blue ) );
00699         // Define como os eixos devem ser rotulados, de acordo com a diferenca
00700         // do primeiro e do ultimo ponto. Para isso, vamos verificar se a 
00701         // diferenca entre os dois tempos (medidos em segundos desde a Epoch 
00702         // (00:00:00 UTC, Janeiro 1 de 1970) e maior do que 86400, o numero de
00703         // segundos em um dia.
00704         if( Points.lastX() - Points.firstX() > 86400 )
00705             xAxis->setAxisLabel( DateLabel );
00706         else
00707             xAxis->setAxisLabel( TimeLabel );
00708        
00709         // Cria o novo grafico, mudando os rotulos de acordo com o tipo de 
00710         // busca.
00711         if( SearchType == SEARCHINCLIENTSLOGS )
00712         {
00713             setTitle( "Connected Clients" );
00714             setAxisTitle( xBottom, "Time" );
00715             setAxisTitle( yLeft, "Clients" );
00716             Curve->setStyle( QwtPlotCurve::Steps );
00717         }
00718         else
00719         {
00720             setTitle( "Storage Send Rate" );
00721             setAxisTitle( xBottom, "Time" );
00722             setAxisTitle( yLeft, "Send Rate (Mbits/s)" );
00723             Curve->setStyle( QwtPlotCurve::Lines );
00724         }
00725 
00726         Curve->attach(this);
00727         // Redesenha o grafico.
00728         replot();      
00729           
00730         return true;
00731                 
00732     }               
00733 }

bool LogPlot::ProcessSendRateLogLine ( char *  LogLine  )  [private]

Funcao para processar uma linha do resultado da busca nos logs de pacotes enviados (de um dos servidores de armazenamento).

Parameters:
LogLine linha do log a ser processada.
Returns:
true se a linha foi processada com sucesso, ou false se algum erro ocorreu ao processar a linha.

Definition at line 504 of file MonitorWindow.cpp.

00505 {
00506     // Variavel que armazena o tempo lido do arquivo.
00507     unsigned long LogTime;
00508     // Variavel qua armazena o valor lido que, dependendo do tipo da busca, sera
00509     // a taxa de envio ou o numero de clientes (ou de sessoes).
00510     unsigned int LogValue;
00511     // Verifica se a linha possui o formato valido. Neste caso, a linha deve 
00512     // possuir o seguinte formato:
00513     // <tempo> <bytes_enviados>
00514     //     <tempo> tempo em que a linha do log foi gerada.
00515     //     <bytes_enviados> numero de butes enviados pelo servidor de 
00516     //                      armazenamento nas transferencias UDP (o trafego em
00517     //                      tempo real mais as mensagens para determinar o
00518     //                      mapeamento).
00519     if( sscanf( LogLine, "%lu %u", &LogTime, &LogValue ) == 2 )
00520     {
00521         #ifdef RIO_DEBUG2
00522         RioErr << "MonitorWindow::ProcessSendRateLogLine verificando o log no "
00523                << "tempo " << LogTime << " e o valor " << LogValue 
00524                << ". Numero de pontos e igual a " << Points.size() << endl;
00525         #endif
00526         // Verifica se precisamos criar um novo ponto ou mudar o ultimo ponto 
00527         // inserido.
00528         if( ( Points.size() == 0 ) || 
00529             ( ( unsigned int ) Points.lastX() != LogTime ) )
00530         {
00531             // O tempo e novo. Devemos criar um novo ponto.
00532             if( Points.size() != 0 )
00533             {
00534                 // Divide a taxa anterior por 1000000, caso exista, para converter 
00535                 // de bits/s para Mbits/s.
00536                 Points.setLastY( Points.lastY() / 1000000.0 );
00537                 // Antes, vamos preencher a lista com valores se o tempo novo 
00538                 // nao for consecutivo. Neste caso, vamos preencher o gap no 
00539                 // tempo com o valor 0.
00540 
00541                 // Variavel que armazena o ultimo tempo em Points ao 
00542                 // preenchermos um gap entre este ultimo tempo e o novo tempo 
00543                 // que vamos inserir.
00544                 unsigned int StartTime;
00545                 StartTime = ( ( unsigned int ) Points.lastX() ) + 1;
00546 
00547                 #ifdef RIO_DEBUG2
00548                 RioErr << "MonitorWindow::ProcessSendRateLogLine colocando os "
00549                        << "pontos com os tempos de " << StartTime << " ate " 
00550                        << LogTime - 1 << " usando o valor 0 em cada um destes "
00551                        << "pontos" << endl;
00552                 #endif       
00553                                  
00554                 for( unsigned int t = StartTime; t < LogTime; t++ )
00555                     Points.push( t, 0 );
00556             }
00557 
00558             #ifdef RIO_DEBUG2
00559             RioErr << "MonitorWindow::ProcessSendRateLogLine colocando o ponto" 
00560                    << " (" << LogTime << ", " << ( LogValue * 8 ) / 1000000.0
00561                    << ") em Points" << endl;
00562             #endif       
00563 
00564             // O tempo e novo. Devemos criar um novo ponto.
00565             // A multiplicacao por 8 e para converter de bytes/s para bits/s.
00566             #ifdef RIO_DEBUG2
00567             RioErr << "MonitorWindow::ProcessSendRateLogLine atualizando o " 
00568                    << "ponto (" << Points.lastX() << ", " << Points.lastY() 
00569                    << ") para o ponto (" << LogTime << ", " 
00570                    << ( Points.lastY() + ( LogValue * 8 ) ) << ") em Points" 
00571                    << endl;
00572             #endif
00573             Points.push( LogTime, ( LogValue * 8 ) );
00574         }
00575         else
00576         {
00577             // O tempo foi inserido anteriormente. Deveremos acumular a taxa de 
00578             // transferencia. A multiplicacao por 8 e para converter de bytes/s 
00579             // para bits/s. 
00580             Points.setLastY( Points.lastY() + ( LogValue * 8 ) );
00581         }
00582         return true;
00583     }
00584     else
00585     {
00586         // A linha possui o formato invalido.
00587         #ifdef RIO_DEBUG2
00588         RioErr << "MonitorWindow::ProcessSendRateLogLine a linha " << LogLine 
00589                << " esta em um formato incorreto!" << endl;
00590         #endif
00591         return false; 
00592     }
00593 }

bool LogPlot::SaveLogsData ( const char *  DataFileName  ) 

Funcao para salvar os logs em um arquivo.

Parameters:
DataFileName nome do arquivo em que os logs serao salvos.
Returns:
true se os dados foram salvos com sucesso e false em caso contrario.

Definition at line 735 of file MonitorWindow.cpp.

00736 {
00737     ofstream DataFile( DataFileName );
00738         for( unsigned int i = 0 ; i < Points.size(); i++ )
00739             DataFile << ( unsigned int ) Points.x( i ) << " " 
00740                      << ( unsigned int ) Points.y( i ) << endl;
00741     DataFile.close();
00742     return true;
00743 }


Field Documentation

QwtPlotCurve* LogPlot::LogCurve [private]

Ponteiro para a curva com o grafico atual.

Definition at line 231 of file MonitorWindow.h.

Vetor com os pontos da curva atualmente no grafico.

Definition at line 229 of file MonitorWindow.h.

Classe que plota o eixo x.

Definition at line 233 of file MonitorWindow.h.


The documentation for this class was generated from the following files:
Generated on Wed Jul 4 16:03:35 2012 for RIO by  doxygen 1.6.3