mirror of
https://github.com/AleziaKurdis/overte.git
synced 2025-04-12 07:23:12 +02:00
Update JSON stats building
This commit is contained in:
parent
08e0a8d705
commit
801f32295d
2 changed files with 119 additions and 104 deletions
|
@ -164,53 +164,58 @@ void AssetServer::handleAssetUpload(QSharedPointer<NLPacketList> packetList, Sha
|
|||
}
|
||||
|
||||
void AssetServer::sendStatsPacket() {
|
||||
QJsonObject statsObject;
|
||||
QJsonObject serverStats;
|
||||
|
||||
auto stats = DependencyManager::get<NodeList>()->sampleStatsForAllConnections();
|
||||
|
||||
QString baseName("AssetServer");
|
||||
|
||||
statsObject[baseName + ".num_connections"] = (int)stats.size();
|
||||
for (const auto& stat : stats) {
|
||||
QString uuid = QUuid().toString();
|
||||
if (auto node = DependencyManager::get<NodeList>()->findNodeWithAddr(stat.first)) {
|
||||
uuid = node->getUUID().toString();
|
||||
}
|
||||
|
||||
QString connKey = baseName + "." + uuid + ".connection.";
|
||||
QString sendKey = baseName + "." + uuid + ".sending.";
|
||||
QString recvKey = baseName + "." + uuid + ".receiving.";
|
||||
qDebug() << "Testing" << sendKey << recvKey;
|
||||
|
||||
QJsonObject nodeStats;
|
||||
auto endTimeMs = std::chrono::duration_cast<std::chrono::milliseconds>(stat.second.endTime);
|
||||
QDateTime date = QDateTime::fromMSecsSinceEpoch(endTimeMs.count());
|
||||
|
||||
statsObject[connKey + "lastHeard"] = date.toString();
|
||||
statsObject[connKey + "estimatedBandwith"] = stat.second.estimatedBandwith;
|
||||
statsObject[connKey + "rtt"] = stat.second.rtt;
|
||||
statsObject[connKey + "congestionWindowSize"] = stat.second.congestionWindowSize;
|
||||
statsObject[connKey + "packetSendPeriod"] = stat.second.packetSendPeriod;
|
||||
QString uuid = QUuid().toString();
|
||||
if (auto node = DependencyManager::get<NodeList>()->findNodeWithAddr(stat.first)) {
|
||||
uuid = uuidStringWithoutCurlyBraces(node->getUUID().toString());
|
||||
}
|
||||
|
||||
statsObject[sendKey + "sendRate"] = stat.second.sendRate;
|
||||
statsObject[sendKey + "sentPackets"] = stat.second.sentPackets;
|
||||
statsObject[sendKey + "receivedACK"] = stat.second.events[udt::ConnectionStats::Stats::ReceivedACK];
|
||||
statsObject[sendKey + "processedACK"] = stat.second.events[udt::ConnectionStats::Stats::ProcessedACK];
|
||||
statsObject[sendKey + "receivedLightACK"] = stat.second.events[udt::ConnectionStats::Stats::ReceivedLightACK];
|
||||
statsObject[sendKey + "receivedNAK"] = stat.second.events[udt::ConnectionStats::Stats::ReceivedNAK];
|
||||
statsObject[sendKey + "receivedTimeoutNAK"] = stat.second.events[udt::ConnectionStats::Stats::ReceivedTimeoutNAK];
|
||||
statsObject[sendKey + "sentACK2"] = stat.second.events[udt::ConnectionStats::Stats::SentACK2];
|
||||
statsObject[sendKey + "retransmission"] = stat.second.events[udt::ConnectionStats::Stats::Retransmission];
|
||||
nodeStats[USERNAME_UUID_REPLACEMENT_STATS_KEY] = uuid;
|
||||
|
||||
statsObject[recvKey + "receiveRate"] = stat.second.receiveRate;
|
||||
statsObject[recvKey + "receivedPackets"] = stat.second.receivedPackets;
|
||||
statsObject[recvKey + "SentACK"] = stat.second.events[udt::ConnectionStats::Stats::SentACK];
|
||||
statsObject[recvKey + "SentLightACK"] = stat.second.events[udt::ConnectionStats::Stats::SentLightACK];
|
||||
statsObject[recvKey + "SentNAK"] = stat.second.events[udt::ConnectionStats::Stats::SentNAK];
|
||||
statsObject[recvKey + "SentTimeoutNAK"] = stat.second.events[udt::ConnectionStats::Stats::SentTimeoutNAK];
|
||||
statsObject[recvKey + "ReceivedACK2"] = stat.second.events[udt::ConnectionStats::Stats::ReceivedACK2];
|
||||
statsObject[recvKey + "Duplicate"] = stat.second.events[udt::ConnectionStats::Stats::Duplicate];
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
serverStats[uuid] = nodeStats;
|
||||
}
|
||||
|
||||
// send off the stats packets
|
||||
QJsonObject statsObject;
|
||||
statsObject["AssetServer"] = serverStats;
|
||||
ThreadedAssignment::addPacketStatsAndSendStatsPacket(statsObject);
|
||||
}
|
||||
|
|
|
@ -1298,76 +1298,86 @@ void OctreeServer::sendStatsPacket() {
|
|||
// the following features:
|
||||
// 1) remember last state sent
|
||||
// 2) only send new data
|
||||
// 3) automatically break up into multiple packets
|
||||
static QJsonObject statsObject1;
|
||||
|
||||
QString baseName = getMyServerName() + QString("Server");
|
||||
|
||||
statsObject1[baseName + QString(".0.1.configuration")] = getConfiguration();
|
||||
|
||||
statsObject1[baseName + QString(".0.2.detailed_stats_url")] = getStatusLink();
|
||||
|
||||
statsObject1[baseName + QString(".0.3.uptime")] = getUptime();
|
||||
statsObject1[baseName + QString(".0.4.persistFileLoadTime")] = getFileLoadTime();
|
||||
statsObject1[baseName + QString(".0.5.clients")] = getCurrentClientCount();
|
||||
|
||||
|
||||
// Stats Array 1
|
||||
QJsonArray 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)}}));
|
||||
|
||||
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}}));
|
||||
|
||||
// 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()}}));
|
||||
|
||||
// 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();
|
||||
|
||||
statsObject1[baseName + QString(".0.6.threads.1.processing")] = (double)howManyThreadsDidProcess(oneSecondAgo);
|
||||
statsObject1[baseName + QString(".0.6.threads.2.packetDistributor")] =
|
||||
(double)howManyThreadsDidPacketDistributor(oneSecondAgo);
|
||||
statsObject1[baseName + QString(".0.6.threads.3.handlePacektSend")] =
|
||||
(double)howManyThreadsDidHandlePacketSend(oneSecondAgo);
|
||||
statsObject1[baseName + QString(".0.6.threads.4.writeDatagram")] =
|
||||
(double)howManyThreadsDidCallWriteDatagram(oneSecondAgo);
|
||||
|
||||
statsObject1[baseName + QString(".1.1.octree.elementCount")] = (double)OctreeElement::getNodeCount();
|
||||
statsObject1[baseName + QString(".1.2.octree.internalElementCount")] = (double)OctreeElement::getInternalNodeCount();
|
||||
statsObject1[baseName + QString(".1.3.octree.leafElementCount")] = (double)OctreeElement::getLeafNodeCount();
|
||||
|
||||
ThreadedAssignment::addPacketStatsAndSendStatsPacket(statsObject1);
|
||||
|
||||
static QJsonObject statsObject2;
|
||||
|
||||
statsObject2[baseName + QString(".2.outbound.data.totalPackets")] = (double)OctreeSendThread::_totalPackets;
|
||||
statsObject2[baseName + QString(".2.outbound.data.totalBytes")] = (double)OctreeSendThread::_totalBytes;
|
||||
statsObject2[baseName + QString(".2.outbound.data.totalBytesWasted")] = (double)OctreeSendThread::_totalWastedBytes;
|
||||
statsObject2[baseName + QString(".2.outbound.data.totalBytesOctalCodes")] =
|
||||
(double)OctreePacketData::getTotalBytesOfOctalCodes();
|
||||
statsObject2[baseName + QString(".2.outbound.data.totalBytesBitMasks")] =
|
||||
(double)OctreePacketData::getTotalBytesOfBitMasks();
|
||||
statsObject2[baseName + QString(".2.outbound.data.totalBytesBitMasks")] = (double)OctreePacketData::getTotalBytesOfColor();
|
||||
|
||||
statsObject2[baseName + QString(".2.outbound.timing.1.avgLoopTime")] = getAverageLoopTime();
|
||||
statsObject2[baseName + QString(".2.outbound.timing.2.avgInsideTime")] = getAverageInsideTime();
|
||||
statsObject2[baseName + QString(".2.outbound.timing.3.avgTreeLockTime")] = getAverageTreeWaitTime();
|
||||
statsObject2[baseName + QString(".2.outbound.timing.4.avgEncodeTime")] = getAverageEncodeTime();
|
||||
statsObject2[baseName + QString(".2.outbound.timing.5.avgCompressAndWriteTime")] = getAverageCompressAndWriteTime();
|
||||
statsObject2[baseName + QString(".2.outbound.timing.5.avgSendTime")] = getAveragePacketSendingTime();
|
||||
statsObject2[baseName + QString(".2.outbound.timing.5.nodeWaitTime")] = getAverageNodeWaitTime();
|
||||
|
||||
DependencyManager::get<NodeList>()->sendStatsToDomainServer(statsObject2);
|
||||
|
||||
static QJsonObject statsObject3;
|
||||
|
||||
statsObject3[baseName + QString(".3.inbound.data.1.packetQueue")] =
|
||||
(double)_octreeInboundPacketProcessor->packetsToProcessCount();
|
||||
statsObject3[baseName + QString(".3.inbound.data.1.totalPackets")] =
|
||||
(double)_octreeInboundPacketProcessor->getTotalPacketsProcessed();
|
||||
statsObject3[baseName + QString(".3.inbound.data.2.totalElements")] =
|
||||
(double)_octreeInboundPacketProcessor->getTotalElementsProcessed();
|
||||
statsObject3[baseName + QString(".3.inbound.timing.1.avgTransitTimePerPacket")] =
|
||||
(double)_octreeInboundPacketProcessor->getAverageTransitTimePerPacket();
|
||||
statsObject3[baseName + QString(".3.inbound.timing.2.avgProcessTimePerPacket")] =
|
||||
(double)_octreeInboundPacketProcessor->getAverageProcessTimePerPacket();
|
||||
statsObject3[baseName + QString(".3.inbound.timing.3.avgLockWaitTimePerPacket")] =
|
||||
(double)_octreeInboundPacketProcessor->getAverageLockWaitTimePerPacket();
|
||||
statsObject3[baseName + QString(".3.inbound.timing.4.avgProcessTimePerElement")] =
|
||||
(double)_octreeInboundPacketProcessor->getAverageProcessTimePerElement();
|
||||
statsObject3[baseName + QString(".3.inbound.timing.5.avgLockWaitTimePerElement")] =
|
||||
(double)_octreeInboundPacketProcessor->getAverageLockWaitTimePerElement();
|
||||
|
||||
DependencyManager::get<NodeList>()->sendStatsToDomainServer(statsObject3);
|
||||
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 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()}}));
|
||||
|
||||
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 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 statsObject;
|
||||
statsObject[QString(getMyServerName()) + "Server"] = jsonArray;
|
||||
addPacketStatsAndSendStatsPacket(statsObject);
|
||||
}
|
||||
|
||||
QMap<OctreeSendThread*, quint64> OctreeServer::_threadsDidProcess;
|
||||
|
|
Loading…
Reference in a new issue