From 8ee56b59c956085b6f8f88da3a80cc8c0afaed03 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 11 Sep 2015 22:33:14 +0200 Subject: [PATCH 1/2] Update AssetServer stats with units Also removed array for better layout --- assignment-client/src/assets/AssetServer.cpp | 64 ++++++----- assignment-client/src/octree/OctreeServer.cpp | 104 ++++++++---------- 2 files changed, 84 insertions(+), 84 deletions(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index 138adb4716..a8497953b9 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -173,36 +173,46 @@ void AssetServer::sendStatsPacket() { auto endTimeMs = std::chrono::duration_cast(stat.second.endTime); QDateTime date = QDateTime::fromMSecsSinceEpoch(endTimeMs.count()); + constexpr static const float USEC_PER_SEC = 1000000.0f; + constexpr 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; - connectionStats["lastHeard"] = date.toString(); - connectionStats["estimatedBandwith"] = stat.second.estimatedBandwith; - connectionStats["rtt"] = stat.second.rtt; - connectionStats["congestionWindowSize"] = stat.second.congestionWindowSize; - connectionStats["packetSendPeriod"] = stat.second.packetSendPeriod; - nodeStats["connection"] = connectionStats; + connectionStats["1. Last Heard"] = date.toString(); + connectionStats["2. Est. Max (P/s)"] = stat.second.estimatedBandwith; + connectionStats["3. RTT (ms)"] = stat.second.rtt; + connectionStats["4. CW (P)"] = stat.second.congestionWindowSize; + connectionStats["5. Period (us)"] = stat.second.packetSendPeriod; + connectionStats["6. Up (Mb/s)"] = stat.second.sentBytes * megabitsPerSecPerByte; + connectionStats["7. Down (Mb/s)"] = stat.second.receivedBytes * megabitsPerSecPerByte; + nodeStats["Connection Stats"] = connectionStats; - QJsonObject sendingStats; - sendingStats["sendRate"] = stat.second.sendRate; - 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; + using Events = udt::ConnectionStats::Stats::Event; + const auto& events = stat.second.events; - QJsonObject receivingStats; - receivingStats["receiveRate"] = stat.second.receiveRate; - receivingStats["receivedPackets"] = stat.second.receivedPackets; - receivingStats["SentACK"] = stat.second.events[udt::ConnectionStats::Stats::SentACK]; - receivingStats["SentLightACK"] = stat.second.events[udt::ConnectionStats::Stats::SentLightACK]; - receivingStats["SentNAK"] = stat.second.events[udt::ConnectionStats::Stats::SentNAK]; - receivingStats["SentTimeoutNAK"] = stat.second.events[udt::ConnectionStats::Stats::SentTimeoutNAK]; - receivingStats["ReceivedACK2"] = stat.second.events[udt::ConnectionStats::Stats::ReceivedACK2]; - receivingStats["Duplicate"] = stat.second.events[udt::ConnectionStats::Stats::Duplicate]; - nodeStats["receiving"] = receivingStats; + QJsonObject upstreamStats; + upstreamStats["1. Sent (P/s)"] = stat.second.sendRate; + upstreamStats["2. Sent Packets"] = stat.second.sentPackets; + upstreamStats["3. Recvd ACK"] = events[Events::ReceivedACK]; + upstreamStats["4. Procd ACK"] = events[Events::ProcessedACK]; + upstreamStats["5. Recvd LACK"] = events[Events::ReceivedLightACK]; + upstreamStats["6. Recvd NAK"] = events[Events::ReceivedNAK]; + upstreamStats["7. Recvd TNAK"] = events[Events::ReceivedTimeoutNAK]; + upstreamStats["8. Sent ACK2"] = events[Events::SentACK2]; + 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; auto nodelist = DependencyManager::get(); diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index e0d0f9eeac..86f9d53aa8 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -9,11 +9,10 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include -#include +#include "OctreeServer.h" + #include #include -#include #include @@ -26,7 +25,6 @@ #include "../AssignmentClient.h" -#include "OctreeServer.h" #include "OctreeServerConsts.h" OctreeServer* OctreeServer::_instance = NULL; @@ -1294,80 +1292,72 @@ QString OctreeServer::getStatusLink() { void OctreeServer::sendStatsPacket() { // Stats Array 1 - QJsonArray threadsStats; + QJsonObject threadsStats; quint64 oneSecondAgo = usecTimestampNow() - USECS_PER_SECOND; - threadsStats.push_back(QJsonObject({{"processing", (double)howManyThreadsDidProcess(oneSecondAgo)}})); - threadsStats.push_back(QJsonObject({{"packetDistributor", (double)howManyThreadsDidPacketDistributor(oneSecondAgo)}})); - threadsStats.push_back(QJsonObject({{"handlePacektSend", (double)howManyThreadsDidHandlePacketSend(oneSecondAgo)}})); - threadsStats.push_back(QJsonObject({{"writeDatagram", (double)howManyThreadsDidCallWriteDatagram(oneSecondAgo)}})); + threadsStats["1. processing"] = (double)howManyThreadsDidProcess(oneSecondAgo); + threadsStats["2. packetDistributor"] = (double)howManyThreadsDidPacketDistributor(oneSecondAgo); + threadsStats["3. handlePacektSend"] = (double)howManyThreadsDidHandlePacketSend(oneSecondAgo); + threadsStats["4. writeDatagram"] = (double)howManyThreadsDidCallWriteDatagram(oneSecondAgo); - QJsonArray statsArray1; - statsArray1.push_back(QJsonObject({{"configuration", getConfiguration()}})); - statsArray1.push_back(QJsonObject({{"detailed_stats_url", getStatusLink()}})); - statsArray1.push_back(QJsonObject({{"uptime", getUptime()}})); - statsArray1.push_back(QJsonObject({{"persistFileLoadTime", getFileLoadTime()}})); - statsArray1.push_back(QJsonObject({{"clients", getCurrentClientCount()}})); - statsArray1.push_back(QJsonObject({{"threads", threadsStats}})); + QJsonObject statsArray1; + statsArray1["1. configuration"] = getConfiguration(); + statsArray1["2. detailed_stats_url"] = getStatusLink(); + statsArray1["3. uptime"] = getUptime(); + statsArray1["4. persistFileLoadTime"] = getFileLoadTime(); + statsArray1["5. clients"] = getCurrentClientCount(); + statsArray1["6. threads"] = threadsStats; // Octree Stats - QJsonArray octreeStats; - octreeStats.push_back(QJsonObject({{"elementCount", (double)OctreeElement::getNodeCount()}})); - octreeStats.push_back(QJsonObject({{"internalElementCount", (double)OctreeElement::getInternalNodeCount()}})); - octreeStats.push_back(QJsonObject({{"leafElementCount", (double)OctreeElement::getLeafNodeCount()}})); + QJsonObject octreeStats; + octreeStats["1. elementCount"] = (double)OctreeElement::getNodeCount(); + octreeStats["2. internalElementCount"] = (double)OctreeElement::getInternalNodeCount(); + octreeStats["3. leafElementCount"] = (double)OctreeElement::getLeafNodeCount(); // Stats Object 2 QJsonObject dataObject1; - dataObject1["totalPackets"] = (double)OctreeSendThread::_totalPackets; - dataObject1["totalBytes"] = (double)OctreeSendThread::_totalBytes; - dataObject1["totalBytesWasted"] = (double)OctreeSendThread::_totalWastedBytes; - dataObject1["totalBytesOctalCodes"] = (double)OctreePacketData::getTotalBytesOfOctalCodes(); - dataObject1["totalBytesBitMasks"] = (double)OctreePacketData::getTotalBytesOfBitMasks(); - dataObject1["totalBytesBitMasks"] = (double)OctreePacketData::getTotalBytesOfColor(); + dataObject1["1. totalPackets"] = (double)OctreeSendThread::_totalPackets; + dataObject1["2. totalBytes"] = (double)OctreeSendThread::_totalBytes; + dataObject1["3. totalBytesWasted"] = (double)OctreeSendThread::_totalWastedBytes; + dataObject1["4. totalBytesOctalCodes"] = (double)OctreePacketData::getTotalBytesOfOctalCodes(); + dataObject1["5. totalBytesBitMasks"] = (double)OctreePacketData::getTotalBytesOfBitMasks(); + dataObject1["6. totalBytesBitMasks"] = (double)OctreePacketData::getTotalBytesOfColor(); - QJsonArray timingArray1; - timingArray1.push_back(QJsonObject({{"avgLoopTime", getAverageLoopTime()}})); - timingArray1.push_back(QJsonObject({{"avgInsideTime", getAverageInsideTime()}})); - timingArray1.push_back(QJsonObject({{"avgTreeLockTime", getAverageTreeWaitTime()}})); - timingArray1.push_back(QJsonObject({{"avgEncodeTime", getAverageEncodeTime()}})); - timingArray1.push_back(QJsonObject({{"avgCompressAndWriteTime", getAverageCompressAndWriteTime()}})); - timingArray1.push_back(QJsonObject({{"avgSendTime", getAveragePacketSendingTime()}})); - timingArray1.push_back(QJsonObject({{"nodeWaitTime", getAverageNodeWaitTime()}})); + QJsonObject timingArray1; + timingArray1["1. avgLoopTime"] = getAverageLoopTime(); + timingArray1["2. avgInsideTime"] = getAverageInsideTime(); + timingArray1["3. avgTreeLockTime"] = getAverageTreeWaitTime(); + timingArray1["4. avgEncodeTime"] = getAverageEncodeTime(); + timingArray1["5. avgCompressAndWriteTime"] = getAverageCompressAndWriteTime(); + timingArray1["6. avgSendTime"] = getAveragePacketSendingTime(); + timingArray1["7. nodeWaitTime"] = getAverageNodeWaitTime(); QJsonObject statsObject2; statsObject2["data"] = dataObject1; statsObject2["timing"] = timingArray1; // Stats Object 3 - QJsonArray dataArray2; - dataArray2.push_back(QJsonObject({{"packetQueue", - (double)_octreeInboundPacketProcessor->packetsToProcessCount()}})); - dataArray2.push_back(QJsonObject({{"totalPackets", - (double)_octreeInboundPacketProcessor->getTotalPacketsProcessed()}})); - dataArray2.push_back(QJsonObject({{"totalElements", - (double)_octreeInboundPacketProcessor->getTotalElementsProcessed()}})); + QJsonObject dataArray2; + dataArray2["1. packetQueue"] = (double)_octreeInboundPacketProcessor->packetsToProcessCount(); + dataArray2["2. totalPackets"] = (double)_octreeInboundPacketProcessor->getTotalPacketsProcessed(); + dataArray2["3. totalElements"] = (double)_octreeInboundPacketProcessor->getTotalElementsProcessed(); - QJsonArray timingArray2; - timingArray2.push_back(QJsonObject({{"avgTransitTimePerPacket", - (double)_octreeInboundPacketProcessor->getAverageTransitTimePerPacket()}})); - timingArray2.push_back(QJsonObject({{"avgProcessTimePerPacket", - (double)_octreeInboundPacketProcessor->getAverageProcessTimePerPacket()}})); - timingArray2.push_back(QJsonObject({{"avgLockWaitTimePerPacket", - (double)_octreeInboundPacketProcessor->getAverageLockWaitTimePerPacket()}})); - timingArray2.push_back(QJsonObject({{"avgProcessTimePerElement", - (double)_octreeInboundPacketProcessor->getAverageProcessTimePerElement()}})); - timingArray2.push_back(QJsonObject({{"avgLockWaitTimePerElement", - (double)_octreeInboundPacketProcessor->getAverageLockWaitTimePerElement()}})); + QJsonObject timingArray2; + timingArray2["1. avgTransitTimePerPacket"] = (double)_octreeInboundPacketProcessor->getAverageTransitTimePerPacket(); + timingArray2["2. avgProcessTimePerPacket"] = (double)_octreeInboundPacketProcessor->getAverageProcessTimePerPacket(); + timingArray2["3. avgLockWaitTimePerPacket"] = (double)_octreeInboundPacketProcessor->getAverageLockWaitTimePerPacket(); + timingArray2["4. avgProcessTimePerElement"] = (double)_octreeInboundPacketProcessor->getAverageProcessTimePerElement(); + timingArray2["5. avgLockWaitTimePerElement"] = (double)_octreeInboundPacketProcessor->getAverageLockWaitTimePerElement(); QJsonObject statsObject3; statsObject3["data"] = dataArray2; statsObject3["timing"] = timingArray2; // Merge everything - QJsonArray jsonArray; - jsonArray.push_back(statsArray1); - jsonArray.push_back(QJsonObject({{"octree", octreeStats}})); - jsonArray.push_back(QJsonObject({{"outbound", statsObject2}})); - jsonArray.push_back(QJsonObject({{"inbound", statsObject3}})); + QJsonObject jsonArray; + jsonArray["1. misc"] = statsArray1; + jsonArray["2. octree"] = octreeStats; + jsonArray["3. outbound"] = statsObject2; + jsonArray["4. inbound"] = statsObject3; QJsonObject statsObject; statsObject[QString(getMyServerName()) + "Server"] = jsonArray; From 1f46b90f9cbd6fcf27f914dd47b96751f4f268a2 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 14 Sep 2015 18:39:31 +0200 Subject: [PATCH 2/2] Remove constexpr for windows --- assignment-client/src/assets/AssetServer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index a8497953b9..b8cf6b2e01 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -173,8 +173,8 @@ void AssetServer::sendStatsPacket() { auto endTimeMs = std::chrono::duration_cast(stat.second.endTime); QDateTime date = QDateTime::fromMSecsSinceEpoch(endTimeMs.count()); - constexpr static const float USEC_PER_SEC = 1000000.0f; - constexpr static const float MEGABITS_PER_BYTE = 8.0f / 1000000.0f; // Bytes => Mbits + 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