#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. | |
TimeScaleDraw * | xAxis |
Classe que plota o eixo x. |
Definition at line 225 of file MonitorWindow.h.
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 }
bool LogPlot::ProcessConnectedClientsLogLine | ( | char * | LogLine | ) | [private] |
Funcao para processar uma linha do resultado da busca nos logs de clientes conectados (do servidor de gerenciamento).
LogLine | linha do log a ser processada. |
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.
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. |
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).
LogLine | linha do log a ser processada. |
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.
DataFileName | nome do arquivo em que os logs serao salvos. |
Definition at line 735 of file MonitorWindow.cpp.
QwtPlotCurve* LogPlot::LogCurve [private] |
Ponteiro para a curva com o grafico atual.
Definition at line 231 of file MonitorWindow.h.
LogPoints LogPlot::Points [private] |
Vetor com os pontos da curva atualmente no grafico.
Definition at line 229 of file MonitorWindow.h.
TimeScaleDraw* LogPlot::xAxis [private] |
Classe que plota o eixo x.
Definition at line 233 of file MonitorWindow.h.