📄 statisticsmessage.cxx
字号:
#include "resip/stack/StatisticsMessage.hxx"#include "rutil/Lock.hxx"#include "rutil/Logger.hxx"#include "rutil/WinLeakCheck.hxx"#include <string.h>using namespace resip;#define RESIPROCATE_SUBSYSTEM Subsystem::STATSStatisticsMessage::StatisticsMessage(const StatisticsMessage::AtomicPayload& payload) : ApplicationMessage(), mPayload(payload){}StatisticsMessage::StatisticsMessage(const StatisticsMessage& rhs) : ApplicationMessage(rhs), mPayload(rhs.mPayload){}StatisticsMessage::~StatisticsMessage(){}std::ostream&StatisticsMessage::encodeBrief(std::ostream& str) const { return str << "StatisticsMessage";}std::ostream& StatisticsMessage::encode(std::ostream& strm) const { strm << "StatisticsMessage[";/* Payload payload; mPayload.loadOut(payload); strm << payload << "]";*/ return strm;}unsigned intStatisticsMessage::Payload::sum2xxIn(MethodTypes method) const{ unsigned int ret = 0; for (int code = 200; code < 300; ++code) { ret += responsesReceivedByMethodByCode[method][code]; } return ret;}unsigned intStatisticsMessage::Payload::sum2xxOut(MethodTypes method) const{ unsigned int ret = 0; for (int code = 200; code < 300; ++code) { ret += responsesSentByMethodByCode[method][code]; } return ret;}unsigned intStatisticsMessage::Payload::sumErrIn(MethodTypes method) const{ unsigned int ret = 0; for (int code = 300; code < MaxCode; ++code) { ret += responsesReceivedByMethodByCode[method][code]; } return ret;}unsigned intStatisticsMessage::Payload::sumErrOut(MethodTypes method) const{ unsigned int ret = 0; for (int code = 300; code < MaxCode; ++code) { ret += responsesSentByMethodByCode[method][code]; } return ret;}void StatisticsMessage::logStats(const resip::Subsystem& subsystem, const StatisticsMessage::Payload& stats){ unsigned int retriesFinal = 0; for (int c = 200; c < 300; ++c) { retriesFinal += stats.responsesRetransmittedByMethodByCode[INVITE][c]; } unsigned int retriesNonFinal = 0; for (int c = 100; c < 200; ++c) { retriesNonFinal += stats.responsesRetransmittedByMethodByCode[INVITE][c]; } WarningLog(<< subsystem << std::endl << "TU summary: " << stats.tuFifoSize << " TRANSPORT " << stats.transportFifoSizeSum << " TRANSACTION " << stats.transactionFifoSize << " CLIENTTX " << stats.activeClientTransactions << " SERVERTX " << stats.activeServerTransactions << " TIMERS " << stats.activeTimers << std::endl << "Transaction summary: reqi " << stats.requestsReceived << " reqo " << stats.requestsSent << " rspi " << stats.responsesReceived << " rspo " << stats.responsesSent << std::endl << "Details: INVi " << stats.requestsReceivedByMethod[INVITE] << "/S" << stats.sum2xxOut(INVITE) << "/F" << stats.sumErrOut(INVITE) << " INVo " << stats.requestsSentByMethod[INVITE]-stats.requestsRetransmittedByMethod[INVITE] << "/S" << stats.sum2xxIn(INVITE) << "/F" << stats.sumErrIn(INVITE) << " ACKi " << stats.requestsReceivedByMethod[ACK] << " ACKo " << stats.requestsSentByMethod[ACK]-stats.requestsRetransmittedByMethod[ACK] << " BYEi " << stats.requestsReceivedByMethod[BYE] << "/S" << stats.sum2xxOut(BYE) << "/F" << stats.sumErrOut(BYE) << " BYEo " << stats.requestsSentByMethod[BYE]-stats.requestsRetransmittedByMethod[BYE] << "/S" << stats.sum2xxIn(BYE) << "/F" << stats.sumErrIn(BYE) << " CANi " << stats.requestsReceivedByMethod[CANCEL] << "/S" << stats.sum2xxOut(BYE) << "/F" << stats.sumErrOut(BYE) << " CANo " << stats.requestsSentByMethod[CANCEL]-stats.requestsRetransmittedByMethod[CANCEL] << "/S" << stats.sum2xxIn(CANCEL) << "/F" << stats.sumErrIn(CANCEL) << " MSGi " << stats.requestsReceivedByMethod[MESSAGE] << "/S" << stats.sum2xxOut(MESSAGE) << "/F" << stats.sumErrOut(MESSAGE) << " MSGo " << stats.requestsSentByMethod[MESSAGE]-stats.requestsRetransmittedByMethod[MESSAGE] << "/S" << stats.sum2xxIn(MESSAGE) << "/F" << stats.sumErrIn(MESSAGE) << " OPTi " << stats.requestsReceivedByMethod[OPTIONS] << "/S" << stats.sum2xxOut(OPTIONS) << "/F" << stats.sumErrOut(OPTIONS) << " OPTo " << stats.requestsSentByMethod[OPTIONS]-stats.requestsRetransmittedByMethod[OPTIONS] << "/S" << stats.sum2xxIn(OPTIONS) << "/F" << stats.sumErrIn(OPTIONS) << " REGi " << stats.requestsReceivedByMethod[REGISTER] << "/S" << stats.sum2xxOut(REGISTER) << "/F" << stats.sumErrOut(REGISTER) << " REGo " << stats.requestsSentByMethod[REGISTER]-stats.requestsRetransmittedByMethod[REGISTER] << "/S" << stats.sum2xxIn(REGISTER) << "/F" << stats.sumErrIn(REGISTER) << " PUBi " << stats.requestsReceivedByMethod[PUBLISH] << "/S" << stats.sum2xxOut(PUBLISH) << "/F" << stats.sumErrOut(PUBLISH) << " PUBo " << stats.requestsSentByMethod[PUBLISH] << "/S" << stats.sum2xxIn(PUBLISH) << "/F" << stats.sumErrIn(PUBLISH) << " SUBi " << stats.requestsReceivedByMethod[SUBSCRIBE] << "/S" << stats.sum2xxOut(SUBSCRIBE) << "/F" << stats.sumErrOut(SUBSCRIBE) << " SUBo " << stats.requestsSentByMethod[SUBSCRIBE] << "/S" << stats.sum2xxIn(SUBSCRIBE) << "/F" << stats.sumErrIn(SUBSCRIBE) << " NOTi " << stats.requestsReceivedByMethod[NOTIFY] << "/S" << stats.sum2xxOut(NOTIFY) << "/F" << stats.sumErrOut(NOTIFY) << " NOTo " << stats.requestsSentByMethod[NOTIFY] << "/S" << stats.sum2xxIn(NOTIFY) << "/F" << stats.sumErrIn(NOTIFY) << std::endl << "Retransmissions: INVx " << stats.requestsRetransmittedByMethod[INVITE] << " BYEx " << stats.requestsRetransmittedByMethod[BYE] << " CANx " << stats.requestsRetransmittedByMethod[CANCEL] << " MSGx " << stats.requestsRetransmittedByMethod[MESSAGE] << " OPTx " << stats.requestsRetransmittedByMethod[OPTIONS] << " REGx " << stats.requestsRetransmittedByMethod[REGISTER] << " finx " << retriesFinal << " nonx " << retriesNonFinal << " PUBx " << stats.requestsRetransmittedByMethod[PUBLISH] << " SUBx " << stats.requestsRetransmittedByMethod[SUBSCRIBE] << " NOTx " << stats.requestsRetransmittedByMethod[NOTIFY]);}Message*StatisticsMessage::clone() const{ return new StatisticsMessage(*this);}StatisticsMessage::Payload::Payload() : tuFifoSize(0), transportFifoSizeSum(0), transactionFifoSize(0), activeTimers(0), openTcpConnections(0), activeClientTransactions(0), activeServerTransactions(0), pendingDnsQueries(0), requestsSent(0), responsesSent(0), requestsRetransmitted(0), responsesRetransmitted(0), requestsReceived(0), responsesReceived(0){ memset(responsesByCode, 0, sizeof(responsesByCode)); memset(requestsSentByMethod, 0, sizeof(requestsSentByMethod)); memset(requestsRetransmittedByMethod, 0, sizeof(requestsRetransmittedByMethod)); memset(requestsReceivedByMethod, 0, sizeof(requestsReceivedByMethod)); memset(responsesSentByMethod, 0, sizeof(responsesSentByMethod)); memset(responsesRetransmittedByMethod, 0, sizeof(responsesRetransmittedByMethod)); memset(responsesReceivedByMethod, 0, sizeof(responsesReceivedByMethod)); memset(responsesSentByMethodByCode, 0, sizeof(responsesSentByMethodByCode)); memset(responsesRetransmittedByMethodByCode, 0, sizeof(responsesRetransmittedByMethodByCode)); memset(responsesReceivedByMethodByCode, 0, sizeof(responsesReceivedByMethodByCode));}StatisticsMessage::Payload&StatisticsMessage::Payload::operator=(const StatisticsMessage::Payload& rhs){ if (&rhs != this) { transportFifoSizeSum = rhs.transportFifoSizeSum; tuFifoSize = rhs.tuFifoSize; activeTimers = rhs.activeTimers; transactionFifoSize = rhs.transactionFifoSize; openTcpConnections = rhs.openTcpConnections; activeClientTransactions = rhs.activeClientTransactions; activeServerTransactions = rhs.activeServerTransactions; pendingDnsQueries = rhs.pendingDnsQueries; requestsSent = rhs.requestsSent; responsesSent = rhs.responsesSent; requestsRetransmitted = rhs.requestsRetransmitted; responsesRetransmitted = rhs.responsesRetransmitted; requestsReceived = rhs.requestsReceived; responsesReceived = rhs.responsesReceived; memcpy(responsesByCode, rhs.responsesByCode, sizeof(responsesByCode)); memcpy(requestsSentByMethod, rhs.requestsSentByMethod, sizeof(requestsSentByMethod)); memcpy(requestsRetransmittedByMethod, rhs.requestsRetransmittedByMethod, sizeof(requestsRetransmittedByMethod)); memcpy(requestsReceivedByMethod, rhs.requestsReceivedByMethod, sizeof(requestsReceivedByMethod)); memcpy(responsesSentByMethod, rhs.responsesSentByMethod, sizeof(responsesSentByMethod)); memcpy(responsesRetransmittedByMethod, rhs.responsesRetransmittedByMethod, sizeof(responsesRetransmittedByMethod)); memcpy(responsesReceivedByMethod, rhs.responsesReceivedByMethod, sizeof(responsesReceivedByMethod)); memcpy(responsesSentByMethodByCode, rhs.responsesSentByMethodByCode, sizeof(responsesSentByMethodByCode)); memcpy(responsesRetransmittedByMethodByCode, rhs.responsesRetransmittedByMethodByCode, sizeof(responsesRetransmittedByMethodByCode)); memcpy(responsesReceivedByMethodByCode, rhs.responsesReceivedByMethodByCode, sizeof(responsesReceivedByMethodByCode)); } return *this;}void StatisticsMessage::loadOut(Payload& payload) const{ mPayload.loadOut(payload);}StatisticsMessage::AtomicPayload::AtomicPayload(){}voidStatisticsMessage::AtomicPayload::loadIn(const Payload& payload){ Lock lock(mMutex); Payload::operator=(payload);}voidStatisticsMessage::AtomicPayload::loadOut(Payload& payload) const{ Lock lock(mMutex); payload = (*this);}/* ==================================================================== * The Vovida Software License, Version 1.0 * * Copyright (c) 2004 Vovida Networks, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The names "VOCAL", "Vovida Open Communication Application Library", * and "Vovida Open Communication Application Library (VOCAL)" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact vocal@vovida.org. * * 4. Products derived from this software may not be called "VOCAL", nor * may "VOCAL" appear in their name, without prior written * permission of Vovida Networks, Inc. * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * * ==================================================================== * * This software consists of voluntary contributions made by Vovida * Networks, Inc. and many individuals on behalf of Vovida Networks, * Inc. For more information on Vovida Networks, Inc., please see * <http://www.vovida.org/>. * */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -