Merge pull request #5785 from Atlante45/protocol

Update AssetServer stats with units
This commit is contained in:
Stephen Birarda 2015-09-14 11:18:23 -07:00
commit d189fb932f
2 changed files with 84 additions and 84 deletions

View file

@ -173,36 +173,46 @@ void AssetServer::sendStatsPacket() {
auto endTimeMs = std::chrono::duration_cast<std::chrono::milliseconds>(stat.second.endTime); auto endTimeMs = std::chrono::duration_cast<std::chrono::milliseconds>(stat.second.endTime);
QDateTime date = QDateTime::fromMSecsSinceEpoch(endTimeMs.count()); QDateTime date = QDateTime::fromMSecsSinceEpoch(endTimeMs.count());
static const float USEC_PER_SEC = 1000000.0f;
static const float MEGABITS_PER_BYTE = 8.0f / 1000000.0f; // Bytes => Mbits
float elapsed = (float)(stat.second.endTime - stat.second.startTime).count() / USEC_PER_SEC; // sec
float megabitsPerSecPerByte = MEGABITS_PER_BYTE / elapsed; // Bytes => Mb/s
QJsonObject connectionStats; QJsonObject connectionStats;
connectionStats["lastHeard"] = date.toString(); connectionStats["1. Last Heard"] = date.toString();
connectionStats["estimatedBandwith"] = stat.second.estimatedBandwith; connectionStats["2. Est. Max (P/s)"] = stat.second.estimatedBandwith;
connectionStats["rtt"] = stat.second.rtt; connectionStats["3. RTT (ms)"] = stat.second.rtt;
connectionStats["congestionWindowSize"] = stat.second.congestionWindowSize; connectionStats["4. CW (P)"] = stat.second.congestionWindowSize;
connectionStats["packetSendPeriod"] = stat.second.packetSendPeriod; connectionStats["5. Period (us)"] = stat.second.packetSendPeriod;
nodeStats["connection"] = connectionStats; connectionStats["6. Up (Mb/s)"] = stat.second.sentBytes * megabitsPerSecPerByte;
connectionStats["7. Down (Mb/s)"] = stat.second.receivedBytes * megabitsPerSecPerByte;
nodeStats["Connection Stats"] = connectionStats;
QJsonObject sendingStats; using Events = udt::ConnectionStats::Stats::Event;
sendingStats["sendRate"] = stat.second.sendRate; const auto& events = stat.second.events;
sendingStats["sentPackets"] = stat.second.sentPackets;
sendingStats["receivedACK"] = stat.second.events[udt::ConnectionStats::Stats::ReceivedACK];
sendingStats["processedACK"] = stat.second.events[udt::ConnectionStats::Stats::ProcessedACK];
sendingStats["receivedLightACK"] = stat.second.events[udt::ConnectionStats::Stats::ReceivedLightACK];
sendingStats["receivedNAK"] = stat.second.events[udt::ConnectionStats::Stats::ReceivedNAK];
sendingStats["receivedTimeoutNAK"] = stat.second.events[udt::ConnectionStats::Stats::ReceivedTimeoutNAK];
sendingStats["sentACK2"] = stat.second.events[udt::ConnectionStats::Stats::SentACK2];
sendingStats["retransmission"] = stat.second.events[udt::ConnectionStats::Stats::Retransmission];
nodeStats["sending"] = sendingStats;
QJsonObject receivingStats; QJsonObject upstreamStats;
receivingStats["receiveRate"] = stat.second.receiveRate; upstreamStats["1. Sent (P/s)"] = stat.second.sendRate;
receivingStats["receivedPackets"] = stat.second.receivedPackets; upstreamStats["2. Sent Packets"] = stat.second.sentPackets;
receivingStats["SentACK"] = stat.second.events[udt::ConnectionStats::Stats::SentACK]; upstreamStats["3. Recvd ACK"] = events[Events::ReceivedACK];
receivingStats["SentLightACK"] = stat.second.events[udt::ConnectionStats::Stats::SentLightACK]; upstreamStats["4. Procd ACK"] = events[Events::ProcessedACK];
receivingStats["SentNAK"] = stat.second.events[udt::ConnectionStats::Stats::SentNAK]; upstreamStats["5. Recvd LACK"] = events[Events::ReceivedLightACK];
receivingStats["SentTimeoutNAK"] = stat.second.events[udt::ConnectionStats::Stats::SentTimeoutNAK]; upstreamStats["6. Recvd NAK"] = events[Events::ReceivedNAK];
receivingStats["ReceivedACK2"] = stat.second.events[udt::ConnectionStats::Stats::ReceivedACK2]; upstreamStats["7. Recvd TNAK"] = events[Events::ReceivedTimeoutNAK];
receivingStats["Duplicate"] = stat.second.events[udt::ConnectionStats::Stats::Duplicate]; upstreamStats["8. Sent ACK2"] = events[Events::SentACK2];
nodeStats["receiving"] = receivingStats; upstreamStats["9. Retransmitted"] = events[Events::Retransmission];
nodeStats["Upstream Stats"] = upstreamStats;
QJsonObject downstreamStats;
downstreamStats["1. Recvd (P/s)"] = stat.second.receiveRate;
downstreamStats["2. Recvd Packets"] = stat.second.receivedPackets;
downstreamStats["3. Sent ACK"] = events[Events::SentACK];
downstreamStats["4. Sent LACK"] = events[Events::SentLightACK];
downstreamStats["5. Sent NAK"] = events[Events::SentNAK];
downstreamStats["6. Sent TNAK"] = events[Events::SentTimeoutNAK];
downstreamStats["7. Recvd ACK2"] = events[Events::ReceivedACK2];
downstreamStats["8. Duplicates"] = events[Events::Duplicate];
nodeStats["Downstream Stats"] = downstreamStats;
QString uuid; QString uuid;
auto nodelist = DependencyManager::get<NodeList>(); auto nodelist = DependencyManager::get<NodeList>();

View file

@ -9,11 +9,10 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// //
#include <QJsonArray> #include "OctreeServer.h"
#include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include <QTimer> #include <QTimer>
#include <QUuid>
#include <time.h> #include <time.h>
@ -26,7 +25,6 @@
#include "../AssignmentClient.h" #include "../AssignmentClient.h"
#include "OctreeServer.h"
#include "OctreeServerConsts.h" #include "OctreeServerConsts.h"
OctreeServer* OctreeServer::_instance = NULL; OctreeServer* OctreeServer::_instance = NULL;
@ -1293,80 +1291,72 @@ QString OctreeServer::getStatusLink() {
void OctreeServer::sendStatsPacket() { void OctreeServer::sendStatsPacket() {
// Stats Array 1 // Stats Array 1
QJsonArray threadsStats; QJsonObject threadsStats;
quint64 oneSecondAgo = usecTimestampNow() - USECS_PER_SECOND; quint64 oneSecondAgo = usecTimestampNow() - USECS_PER_SECOND;
threadsStats.push_back(QJsonObject({{"processing", (double)howManyThreadsDidProcess(oneSecondAgo)}})); threadsStats["1. processing"] = (double)howManyThreadsDidProcess(oneSecondAgo);
threadsStats.push_back(QJsonObject({{"packetDistributor", (double)howManyThreadsDidPacketDistributor(oneSecondAgo)}})); threadsStats["2. packetDistributor"] = (double)howManyThreadsDidPacketDistributor(oneSecondAgo);
threadsStats.push_back(QJsonObject({{"handlePacektSend", (double)howManyThreadsDidHandlePacketSend(oneSecondAgo)}})); threadsStats["3. handlePacektSend"] = (double)howManyThreadsDidHandlePacketSend(oneSecondAgo);
threadsStats.push_back(QJsonObject({{"writeDatagram", (double)howManyThreadsDidCallWriteDatagram(oneSecondAgo)}})); threadsStats["4. writeDatagram"] = (double)howManyThreadsDidCallWriteDatagram(oneSecondAgo);
QJsonArray statsArray1; QJsonObject statsArray1;
statsArray1.push_back(QJsonObject({{"configuration", getConfiguration()}})); statsArray1["1. configuration"] = getConfiguration();
statsArray1.push_back(QJsonObject({{"detailed_stats_url", getStatusLink()}})); statsArray1["2. detailed_stats_url"] = getStatusLink();
statsArray1.push_back(QJsonObject({{"uptime", getUptime()}})); statsArray1["3. uptime"] = getUptime();
statsArray1.push_back(QJsonObject({{"persistFileLoadTime", getFileLoadTime()}})); statsArray1["4. persistFileLoadTime"] = getFileLoadTime();
statsArray1.push_back(QJsonObject({{"clients", getCurrentClientCount()}})); statsArray1["5. clients"] = getCurrentClientCount();
statsArray1.push_back(QJsonObject({{"threads", threadsStats}})); statsArray1["6. threads"] = threadsStats;
// Octree Stats // Octree Stats
QJsonArray octreeStats; QJsonObject octreeStats;
octreeStats.push_back(QJsonObject({{"elementCount", (double)OctreeElement::getNodeCount()}})); octreeStats["1. elementCount"] = (double)OctreeElement::getNodeCount();
octreeStats.push_back(QJsonObject({{"internalElementCount", (double)OctreeElement::getInternalNodeCount()}})); octreeStats["2. internalElementCount"] = (double)OctreeElement::getInternalNodeCount();
octreeStats.push_back(QJsonObject({{"leafElementCount", (double)OctreeElement::getLeafNodeCount()}})); octreeStats["3. leafElementCount"] = (double)OctreeElement::getLeafNodeCount();
// Stats Object 2 // Stats Object 2
QJsonObject dataObject1; QJsonObject dataObject1;
dataObject1["totalPackets"] = (double)OctreeSendThread::_totalPackets; dataObject1["1. totalPackets"] = (double)OctreeSendThread::_totalPackets;
dataObject1["totalBytes"] = (double)OctreeSendThread::_totalBytes; dataObject1["2. totalBytes"] = (double)OctreeSendThread::_totalBytes;
dataObject1["totalBytesWasted"] = (double)OctreeSendThread::_totalWastedBytes; dataObject1["3. totalBytesWasted"] = (double)OctreeSendThread::_totalWastedBytes;
dataObject1["totalBytesOctalCodes"] = (double)OctreePacketData::getTotalBytesOfOctalCodes(); dataObject1["4. totalBytesOctalCodes"] = (double)OctreePacketData::getTotalBytesOfOctalCodes();
dataObject1["totalBytesBitMasks"] = (double)OctreePacketData::getTotalBytesOfBitMasks(); dataObject1["5. totalBytesBitMasks"] = (double)OctreePacketData::getTotalBytesOfBitMasks();
dataObject1["totalBytesBitMasks"] = (double)OctreePacketData::getTotalBytesOfColor(); dataObject1["6. totalBytesBitMasks"] = (double)OctreePacketData::getTotalBytesOfColor();
QJsonArray timingArray1; QJsonObject timingArray1;
timingArray1.push_back(QJsonObject({{"avgLoopTime", getAverageLoopTime()}})); timingArray1["1. avgLoopTime"] = getAverageLoopTime();
timingArray1.push_back(QJsonObject({{"avgInsideTime", getAverageInsideTime()}})); timingArray1["2. avgInsideTime"] = getAverageInsideTime();
timingArray1.push_back(QJsonObject({{"avgTreeLockTime", getAverageTreeWaitTime()}})); timingArray1["3. avgTreeLockTime"] = getAverageTreeWaitTime();
timingArray1.push_back(QJsonObject({{"avgEncodeTime", getAverageEncodeTime()}})); timingArray1["4. avgEncodeTime"] = getAverageEncodeTime();
timingArray1.push_back(QJsonObject({{"avgCompressAndWriteTime", getAverageCompressAndWriteTime()}})); timingArray1["5. avgCompressAndWriteTime"] = getAverageCompressAndWriteTime();
timingArray1.push_back(QJsonObject({{"avgSendTime", getAveragePacketSendingTime()}})); timingArray1["6. avgSendTime"] = getAveragePacketSendingTime();
timingArray1.push_back(QJsonObject({{"nodeWaitTime", getAverageNodeWaitTime()}})); timingArray1["7. nodeWaitTime"] = getAverageNodeWaitTime();
QJsonObject statsObject2; QJsonObject statsObject2;
statsObject2["data"] = dataObject1; statsObject2["data"] = dataObject1;
statsObject2["timing"] = timingArray1; statsObject2["timing"] = timingArray1;
// Stats Object 3 // Stats Object 3
QJsonArray dataArray2; QJsonObject dataArray2;
dataArray2.push_back(QJsonObject({{"packetQueue", dataArray2["1. packetQueue"] = (double)_octreeInboundPacketProcessor->packetsToProcessCount();
(double)_octreeInboundPacketProcessor->packetsToProcessCount()}})); dataArray2["2. totalPackets"] = (double)_octreeInboundPacketProcessor->getTotalPacketsProcessed();
dataArray2.push_back(QJsonObject({{"totalPackets", dataArray2["3. totalElements"] = (double)_octreeInboundPacketProcessor->getTotalElementsProcessed();
(double)_octreeInboundPacketProcessor->getTotalPacketsProcessed()}}));
dataArray2.push_back(QJsonObject({{"totalElements",
(double)_octreeInboundPacketProcessor->getTotalElementsProcessed()}}));
QJsonArray timingArray2; QJsonObject timingArray2;
timingArray2.push_back(QJsonObject({{"avgTransitTimePerPacket", timingArray2["1. avgTransitTimePerPacket"] = (double)_octreeInboundPacketProcessor->getAverageTransitTimePerPacket();
(double)_octreeInboundPacketProcessor->getAverageTransitTimePerPacket()}})); timingArray2["2. avgProcessTimePerPacket"] = (double)_octreeInboundPacketProcessor->getAverageProcessTimePerPacket();
timingArray2.push_back(QJsonObject({{"avgProcessTimePerPacket", timingArray2["3. avgLockWaitTimePerPacket"] = (double)_octreeInboundPacketProcessor->getAverageLockWaitTimePerPacket();
(double)_octreeInboundPacketProcessor->getAverageProcessTimePerPacket()}})); timingArray2["4. avgProcessTimePerElement"] = (double)_octreeInboundPacketProcessor->getAverageProcessTimePerElement();
timingArray2.push_back(QJsonObject({{"avgLockWaitTimePerPacket", timingArray2["5. avgLockWaitTimePerElement"] = (double)_octreeInboundPacketProcessor->getAverageLockWaitTimePerElement();
(double)_octreeInboundPacketProcessor->getAverageLockWaitTimePerPacket()}}));
timingArray2.push_back(QJsonObject({{"avgProcessTimePerElement",
(double)_octreeInboundPacketProcessor->getAverageProcessTimePerElement()}}));
timingArray2.push_back(QJsonObject({{"avgLockWaitTimePerElement",
(double)_octreeInboundPacketProcessor->getAverageLockWaitTimePerElement()}}));
QJsonObject statsObject3; QJsonObject statsObject3;
statsObject3["data"] = dataArray2; statsObject3["data"] = dataArray2;
statsObject3["timing"] = timingArray2; statsObject3["timing"] = timingArray2;
// Merge everything // Merge everything
QJsonArray jsonArray; QJsonObject jsonArray;
jsonArray.push_back(statsArray1); jsonArray["1. misc"] = statsArray1;
jsonArray.push_back(QJsonObject({{"octree", octreeStats}})); jsonArray["2. octree"] = octreeStats;
jsonArray.push_back(QJsonObject({{"outbound", statsObject2}})); jsonArray["3. outbound"] = statsObject2;
jsonArray.push_back(QJsonObject({{"inbound", statsObject3}})); jsonArray["4. inbound"] = statsObject3;
QJsonObject statsObject; QJsonObject statsObject;
statsObject[QString(getMyServerName()) + "Server"] = jsonArray; statsObject[QString(getMyServerName()) + "Server"] = jsonArray;