📄 stat.cpp
字号:
DISPLAY_CROSS_LINE (); for (int i = 0; i < MAX_RTD_INFO_LENGTH; i++) { char s[20]; if (M_counters[CPT_C_NbOfCallUsedForAverageResponseTime + i] == 0) { continue; } sprintf(s, "Response Time %d", i + 1); DISPLAY_TXT_COL (s, msToHHMMSSmmm( M_counters [CPT_PD_AverageResponseTime + i] ), msToHHMMSSmmm( M_counters [CPT_C_AverageResponseTime + i] )); } DISPLAY_TXT_COL ("Call Length", msToHHMMSSmmm( M_counters [CPT_PD_AverageCallLength] ), msToHHMMSSmmm( M_counters [CPT_C_AverageCallLength] ));}void CStat::displayRepartition (FILE *f){ DISPLAY_INFO("Average Response Time Repartition"); displayRepartition(f, M_ResponseTimeRepartition[0], M_SizeOfResponseTimeRepartition); DISPLAY_INFO("Average Call Length Repartition"); displayRepartition(f, M_CallLengthRepartition, M_SizeOfCallLengthRepartition);}void CStat::displaySecondaryRepartition (FILE *f, int which){ DISPLAY_INFO("Average Response Time Repartition"); displayRepartition(f, M_ResponseTimeRepartition[which], M_SizeOfResponseTimeRepartition);}void CStat::dumpData (){ long localElapsedTime, globalElapsedTime ; struct timeval currentTime; float averageCallRate; float realInstantCallRate; unsigned long numberOfCall; // computing the real call rate GET_TIME (¤tTime); globalElapsedTime = computeDiffTimeInMs (¤tTime, &M_startTime); localElapsedTime = computeDiffTimeInMs (¤tTime, &M_plStartTime); // the call rate is for all the call : incoming and outgoing numberOfCall = (M_counters[CPT_C_IncomingCallCreated] + M_counters[CPT_C_OutgoingCallCreated]); averageCallRate = (globalElapsedTime > 0 ? 1000*(float)numberOfCall/(float)globalElapsedTime : 0.0); numberOfCall = (M_counters[CPT_PL_IncomingCallCreated] + M_counters[CPT_PL_OutgoingCallCreated]); realInstantCallRate = (localElapsedTime > 0 ? 1000*(float)numberOfCall / (float)localElapsedTime : 0.0); if(M_outputStream == NULL) { // if the file is still not opened, we opened it now M_outputStream = new ofstream(M_fileName); M_headerAlreadyDisplayed = false; if(M_outputStream == NULL) { cerr << "Unable to open stat file '" << M_fileName << "' !" << endl; exit(EXIT_FATAL_ERROR); }#ifndef __osf__ if(!M_outputStream->is_open()) { cerr << "Unable to open stat file '" << M_fileName << "' !" << endl; exit(EXIT_FATAL_ERROR); }#endif } if(M_headerAlreadyDisplayed == false) { // header - it's dump in file only one time at the beginning of the file (*M_outputStream) << "StartTime" << stat_delimiter << "LastResetTime" << stat_delimiter << "CurrentTime" << stat_delimiter << "ElapsedTime(P)" << stat_delimiter << "ElapsedTime(C)" << stat_delimiter << "CallRate(P)" << stat_delimiter << "CallRate(C)" << stat_delimiter << "IncomingCall(P)" << stat_delimiter << "IncomingCall(C)" << stat_delimiter << "OutgoingCall(P)" << stat_delimiter << "OutgoingCall(C)" << stat_delimiter << "TotalCallCreated" << stat_delimiter << "CurrentCall" << stat_delimiter << "SuccessfulCall(P)" << stat_delimiter << "SuccessfulCall(C)" << stat_delimiter << "FailedCall(P)" << stat_delimiter << "FailedCall(C)" << stat_delimiter << "FailedCannotSendMessage(P)" << stat_delimiter << "FailedCannotSendMessage(C)" << stat_delimiter << "FailedMaxUDPRetrans(P)" << stat_delimiter << "FailedMaxUDPRetrans(C)" << stat_delimiter << "FailedUnexpectedMessage(P)" << stat_delimiter << "FailedUnexpectedMessage(C)" << stat_delimiter << "FailedCallRejected(P)" << stat_delimiter << "FailedCallRejected(C)" << stat_delimiter << "FailedCmdNotSent(P)" << stat_delimiter << "FailedCmdNotSent(C)" << stat_delimiter << "FailedRegexpDoesntMatch(P)" << stat_delimiter << "FailedRegexpDoesntMatch(C)" << stat_delimiter << "FailedRegexpHdrNotFound(P)" << stat_delimiter << "FailedRegexpHdrNotFound(C)" << stat_delimiter << "FailedOutboundCongestion(P)" << stat_delimiter << "FailedOutboundCongestion(C)" << stat_delimiter << "FailedTimeoutOnRecv(P)" << stat_delimiter << "FailedTimeoutOnRecv(C)" << stat_delimiter << "OutOfCallMsgs(P)" << stat_delimiter << "OutOfCallMsgs(C)" << stat_delimiter << "Retransmissions(P)" << stat_delimiter << "Retransmissions(C)" << stat_delimiter << "AutoAnswered(P)" << stat_delimiter << "AutoAnswered(C)" << stat_delimiter; for (int i = 0; i < MAX_RTD_INFO_LENGTH; i++) { char s_P[30]; char s_C[30]; sprintf(s_P, "ResponseTime%d(P)%s", i + 1, stat_delimiter); sprintf(s_C, "ResponseTime%d(C)%s", i + 1, stat_delimiter); (*M_outputStream) << s_P << s_C; sprintf(s_P, "ResponseTime%dStDev(P)%s", i + 1, stat_delimiter); sprintf(s_C, "ResponseTime%dStDev(C)%s", i + 1, stat_delimiter); (*M_outputStream) << s_P << s_C; } (*M_outputStream) << "CallLength(P)" << stat_delimiter << "CallLength(C)" << stat_delimiter; (*M_outputStream) << "CallLengthStDev(P)" << stat_delimiter << "CallLengthStDev(C)" << stat_delimiter; for (int i = 0; i < MAX_COUNTER; i++) { (*M_outputStream) << "GenericCounter" << (i + 1) << "(P)" << stat_delimiter; (*M_outputStream) << "GenericCounter" << (i + 1) << "(C)" << stat_delimiter; } for (int i = 0; i < MAX_RTD_INFO_LENGTH; i++) { char s[30]; sprintf(s, "ResponseTimeRepartition%d", i + 1); (*M_outputStream) << sRepartitionHeader(M_ResponseTimeRepartition[i], M_SizeOfResponseTimeRepartition, s); } (*M_outputStream) << sRepartitionHeader(M_CallLengthRepartition, M_SizeOfCallLengthRepartition, (char*) "CallLengthRepartition"); (*M_outputStream) << endl; M_headerAlreadyDisplayed = true; } // content (*M_outputStream) << formatTime(&M_startTime) << stat_delimiter; (*M_outputStream) << formatTime(&M_plStartTime) << stat_delimiter; (*M_outputStream) << formatTime(¤tTime) << stat_delimiter << msToHHMMSS(localElapsedTime) << stat_delimiter; (*M_outputStream) << msToHHMMSS(globalElapsedTime) << stat_delimiter << realInstantCallRate << stat_delimiter << averageCallRate << stat_delimiter << M_counters[CPT_PL_IncomingCallCreated] << stat_delimiter << M_counters[CPT_C_IncomingCallCreated] << stat_delimiter << M_counters[CPT_PL_OutgoingCallCreated] << stat_delimiter << M_counters[CPT_C_OutgoingCallCreated] << stat_delimiter << (M_counters[CPT_C_IncomingCallCreated]+ M_counters[CPT_C_OutgoingCallCreated])<< stat_delimiter << M_counters[CPT_C_CurrentCall] << stat_delimiter << M_counters[CPT_PL_SuccessfulCall] << stat_delimiter << M_counters[CPT_C_SuccessfulCall] << stat_delimiter << M_counters[CPT_PL_FailedCall] << stat_delimiter << M_counters[CPT_C_FailedCall] << stat_delimiter << M_counters[CPT_PL_FailedCallCannotSendMessage] << stat_delimiter << M_counters[CPT_C_FailedCallCannotSendMessage] << stat_delimiter << M_counters[CPT_PL_FailedCallMaxUdpRetrans] << stat_delimiter << M_counters[CPT_C_FailedCallMaxUdpRetrans ] << stat_delimiter << M_counters[CPT_PL_FailedCallUnexpectedMessage] << stat_delimiter << M_counters[CPT_C_FailedCallUnexpectedMessage] << stat_delimiter << M_counters[CPT_PL_FailedCallCallRejected] << stat_delimiter << M_counters[CPT_C_FailedCallCallRejected] << stat_delimiter << M_counters[CPT_PL_FailedCallCmdNotSent] << stat_delimiter << M_counters[CPT_C_FailedCallCmdNotSent] << stat_delimiter << M_counters[CPT_PL_FailedCallRegexpDoesntMatch] << stat_delimiter << M_counters[CPT_C_FailedCallRegexpDoesntMatch] << stat_delimiter << M_counters[CPT_PL_FailedCallRegexpHdrNotFound] << stat_delimiter << M_counters[CPT_C_FailedCallRegexpHdrNotFound] << stat_delimiter << M_counters[CPT_PL_FailedOutboundCongestion] << stat_delimiter << M_counters[CPT_C_FailedOutboundCongestion] << stat_delimiter << M_counters[CPT_PL_FailedTimeoutOnRecv] << stat_delimiter << M_counters[CPT_C_FailedTimeoutOnRecv] << stat_delimiter << M_counters[CPT_PL_OutOfCallMsgs] << stat_delimiter << M_counters[CPT_C_OutOfCallMsgs] << stat_delimiter << M_counters[CPT_PL_Retransmissions] << stat_delimiter << M_counters[CPT_C_Retransmissions] << stat_delimiter << M_counters[CPT_PL_AutoAnswered] << stat_delimiter << M_counters[CPT_C_AutoAnswered] << stat_delimiter; // SF917289 << M_counters[CPT_C_UnexpectedMessage] << stat_delimiter; for (int i = 0; i < MAX_RTD_INFO_LENGTH; i++) { (*M_outputStream) << msToHHMMSSmmm( M_counters [CPT_PL_AverageResponseTime + i] ) << stat_delimiter; (*M_outputStream) << msToHHMMSSmmm( M_counters [CPT_C_AverageResponseTime + i] ) << stat_delimiter; (*M_outputStream) << msToHHMMSSmmm( computeStdev((E_CounterName)(CPT_PL_AverageResponseTime + i), (E_CounterName)(CPT_PL_NbOfCallUsedForAverageResponseTime + i), (E_CounterName)(CPT_PL_AverageResponseTime_Squares + i)) ) << stat_delimiter; (*M_outputStream) << msToHHMMSSmmm( computeStdev((E_CounterName)(CPT_C_AverageResponseTime + i), (E_CounterName)(CPT_C_NbOfCallUsedForAverageResponseTime + i), (E_CounterName)(CPT_C_AverageResponseTime_Squares + i)) ) << stat_delimiter; } (*M_outputStream) << msToHHMMSSmmm( M_counters [CPT_PL_AverageCallLength ] ) << stat_delimiter; (*M_outputStream) << msToHHMMSSmmm( M_counters [CPT_C_AverageCallLength ] ) << stat_delimiter; (*M_outputStream) << msToHHMMSSmmm( computeStdev(CPT_PL_AverageCallLength, CPT_PL_NbOfCallUsedForAverageCallLength, CPT_PL_AverageCallLength_Squares )) << stat_delimiter; (*M_outputStream) << msToHHMMSSmmm( computeStdev(CPT_C_AverageCallLength, CPT_C_NbOfCallUsedForAverageCallLength, CPT_C_AverageCallLength_Squares )) << stat_delimiter; for (int i = 0; i < MAX_COUNTER; i++) { (*M_outputStream) << M_counters[CPT_PL_Generic + i] << stat_delimiter; (*M_outputStream) << M_counters[CPT_C_Generic + i] << stat_delimiter; } for (int i = 0; i < MAX_RTD_INFO_LENGTH; i++) { (*M_outputStream) << sRepartitionInfo(M_ResponseTimeRepartition[i], M_SizeOfResponseTimeRepartition); } (*M_outputStream) << sRepartitionInfo(M_CallLengthRepartition, M_SizeOfCallLengthRepartition); (*M_outputStream) << endl; // flushing the output file to let the tail -f working ! (*M_outputStream).flush();} /* end of logData () */void CStat::dumpDataRtt (){ int L_i ; if(M_outputStreamRtt == NULL) { // if the file is still not opened, we opened it now M_outputStreamRtt = new ofstream(M_fileNameRtt); M_headerAlreadyDisplayedRtt = false; if(M_outputStreamRtt == NULL) { cerr << "Unable to open rtt file '" << M_fileNameRtt << "' !" << endl; exit(EXIT_FATAL_ERROR); }#ifndef __osf__ if(!M_outputStreamRtt->is_open()) { cerr << "Unable to open rtt file '" << M_fileNameRtt << "' !" << endl; exit(EXIT_FATAL_ERROR); }#endif } if(M_headerAlreadyDisplayedRtt == false) { (*M_outputStreamRtt) << "Date_ms;" << "response_time_ms;"; (*M_outputStreamRtt) << endl; M_headerAlreadyDisplayedRtt = true; } for (L_i = 0; L_i < M_counterDumpRespTime ; L_i ++) { (*M_outputStreamRtt) << M_dumpRespTime[L_i].date << stat_delimiter ; (*M_outputStreamRtt) << M_dumpRespTime[L_i].rtt << stat_delimiter ; M_dumpRespTime[L_i].date = 0.0; M_dumpRespTime[L_i].rtt = 0.0; (*M_outputStreamRtt) << endl; (*M_outputStreamRtt).flush(); } // flushing the output file (*M_outputStreamRtt).flush(); M_counterDumpRespTime = 0;}/* Time Gestion */char* CStat::msToHHMMSS (unsigned long P_ms){ static char L_time [TIME_LENGTH]; unsigned long hh, mm, ss; P_ms = P_ms / 1000; hh = P_ms / 3600; mm = (P_ms - hh * 3600) / 60; ss = P_ms - (hh * 3600) - (mm * 60); sprintf (L_time, "%2.2d:%2.2d:%2.2d", hh, mm, ss); return (L_time);} /* end of msToHHMMSS */char* CStat::msToHHMMSSmmm (unsigned long P_ms){ static char L_time [TIME_LENGTH]; unsigned long sec, hh, mm, ss, mmm; sec = P_ms / 1000; hh = sec / 3600; mm = (sec - hh * 3600) / 60; ss = sec - (hh * 3600) - (mm * 60); mmm = P_ms - (hh * 3600000) - (mm * 60000) - (ss*1000); sprintf (L_time, "%2.2d:%2.2d:%2.2d:%3.3d", hh, mm, ss, mmm); return (L_time);} /* end of msToHHMMSS */char* CStat::formatTime (struct timeval* P_tv){ static char L_time [TIME_LENGTH]; struct tm * L_currentDate; // Get the current date and time L_currentDate = localtime ((const time_t *)&P_tv->tv_sec); // Format the time if (L_currentDate == NULL) { memset (L_time, 0, TIME_LENGTH); } else { // SF917230 sprintf(L_time, "%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d:%3.3d", sprintf(L_time, "%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d", L_currentDate->tm_year + 1900, L_currentDate->tm_mon + 1, L_currentDate->tm_mday, L_currentDate->tm_hour, L_currentDate->tm_min, L_currentDate->tm_sec); // SF917230 (int) (P_tv->tv_usec)/1000); } return (L_time);} /* end of formatTime */long CStat::computeDiffTimeInMs (struct timeval* tf, struct timeval* ti){ long v1, v2; v1 = tf->tv_sec - ti->tv_sec; v2 = tf->tv_usec - ti->tv_usec; if (v2 < 0) v2 += 1000000, v1--; return (v1*1000 + v2/1000);}CStat* CStat::M_instance = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -