mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 21:17:01 +02:00
Merge pull request #6004 from birarda/av-mixer-stats
add receive rate and inbound kbps to avatar-mixer stats
This commit is contained in:
commit
e66f6b79cc
10 changed files with 36 additions and 25 deletions
|
@ -262,14 +262,9 @@ void AvatarMixer::broadcastAvatarData() {
|
||||||
AvatarDataSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(otherNode->getUUID());
|
AvatarDataSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(otherNode->getUUID());
|
||||||
AvatarDataSequenceNumber lastSeqFromSender = otherNodeData->getLastReceivedSequenceNumber();
|
AvatarDataSequenceNumber lastSeqFromSender = otherNodeData->getLastReceivedSequenceNumber();
|
||||||
|
|
||||||
if (lastSeqToReceiver > lastSeqFromSender) {
|
if (lastSeqToReceiver > lastSeqFromSender && lastSeqToReceiver != UINT16_MAX) {
|
||||||
// Did we somehow get out of order packets from the sender?
|
// we got out out of order packets from the sender, track it
|
||||||
// We don't expect this to happen - in RELEASE we add this to a trackable stat
|
|
||||||
// and in DEBUG we crash on the assert
|
|
||||||
|
|
||||||
otherNodeData->incrementNumOutOfOrderSends();
|
otherNodeData->incrementNumOutOfOrderSends();
|
||||||
|
|
||||||
assert(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// make sure we haven't already sent this data from this sender to this receiver
|
// make sure we haven't already sent this data from this sender to this receiver
|
||||||
|
@ -485,10 +480,13 @@ void AvatarMixer::sendStatsPacket() {
|
||||||
QJsonObject avatarStats;
|
QJsonObject avatarStats;
|
||||||
|
|
||||||
const QString NODE_OUTBOUND_KBPS_STAT_KEY = "outbound_kbps";
|
const QString NODE_OUTBOUND_KBPS_STAT_KEY = "outbound_kbps";
|
||||||
|
const QString NODE_INBOUND_KBPS_STAT_KEY = "inbound_kbps";
|
||||||
|
|
||||||
// add the key to ask the domain-server for a username replacement, if it has it
|
// add the key to ask the domain-server for a username replacement, if it has it
|
||||||
avatarStats[USERNAME_UUID_REPLACEMENT_STATS_KEY] = uuidStringWithoutCurlyBraces(node->getUUID());
|
avatarStats[USERNAME_UUID_REPLACEMENT_STATS_KEY] = uuidStringWithoutCurlyBraces(node->getUUID());
|
||||||
|
|
||||||
avatarStats[NODE_OUTBOUND_KBPS_STAT_KEY] = node->getOutboundBandwidth();
|
avatarStats[NODE_OUTBOUND_KBPS_STAT_KEY] = node->getOutboundBandwidth();
|
||||||
|
avatarStats[NODE_INBOUND_KBPS_STAT_KEY] = node->getInboundBandwidth();
|
||||||
|
|
||||||
AvatarMixerClientData* clientData = static_cast<AvatarMixerClientData*>(node->getLinkedData());
|
AvatarMixerClientData* clientData = static_cast<AvatarMixerClientData*>(node->getLinkedData());
|
||||||
if (clientData) {
|
if (clientData) {
|
||||||
|
|
|
@ -40,11 +40,14 @@ uint16_t AvatarMixerClientData::getLastBroadcastSequenceNumber(const QUuid& node
|
||||||
void AvatarMixerClientData::loadJSONStats(QJsonObject& jsonObject) const {
|
void AvatarMixerClientData::loadJSONStats(QJsonObject& jsonObject) const {
|
||||||
jsonObject["display_name"] = _avatar.getDisplayName();
|
jsonObject["display_name"] = _avatar.getDisplayName();
|
||||||
jsonObject["full_rate_distance"] = _fullRateDistance;
|
jsonObject["full_rate_distance"] = _fullRateDistance;
|
||||||
jsonObject["max_avatar_distance"] = _maxAvatarDistance;
|
jsonObject["max_av_distance"] = _maxAvatarDistance;
|
||||||
jsonObject["num_avatars_sent_last_frame"] = _numAvatarsSentLastFrame;
|
jsonObject["num_avs_sent_last_frame"] = _numAvatarsSentLastFrame;
|
||||||
jsonObject["avg_other_avatar_starves_per_second"] = getAvgNumOtherAvatarStarvesPerSecond();
|
jsonObject["avg_other_av_starves_per_second"] = getAvgNumOtherAvatarStarvesPerSecond();
|
||||||
jsonObject["avg_other_avatar_skips_per_second"] = getAvgNumOtherAvatarSkipsPerSecond();
|
jsonObject["avg_other_av_skips_per_second"] = getAvgNumOtherAvatarSkipsPerSecond();
|
||||||
jsonObject["total_num_out_of_order_sends"] = _numOutOfOrderSends;
|
jsonObject["total_num_out_of_order_sends"] = _numOutOfOrderSends;
|
||||||
|
|
||||||
jsonObject[OUTBOUND_AVATAR_DATA_STATS_KEY] = getOutboundAvatarDataKbps();
|
jsonObject[OUTBOUND_AVATAR_DATA_STATS_KEY] = getOutboundAvatarDataKbps();
|
||||||
|
jsonObject[INBOUND_AVATAR_DATA_STATS_KEY] = _avatar.getAverageBytesReceivedPerSecond() / (float) BYTES_PER_KILOBIT;
|
||||||
|
|
||||||
|
jsonObject["av_data_receive_rate"] = _avatar.getReceiveRate();
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <UUIDHasher.h>
|
#include <UUIDHasher.h>
|
||||||
|
|
||||||
const QString OUTBOUND_AVATAR_DATA_STATS_KEY = "outbound_av_data_kbps";
|
const QString OUTBOUND_AVATAR_DATA_STATS_KEY = "outbound_av_data_kbps";
|
||||||
|
const QString INBOUND_AVATAR_DATA_STATS_KEY = "inbound_av_data_kbps";
|
||||||
|
|
||||||
class AvatarMixerClientData : public NodeData {
|
class AvatarMixerClientData : public NodeData {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
|
@ -274,10 +274,14 @@ void LimitedNodeList::fillPacketHeader(const NLPacket& packet, const QUuid& conn
|
||||||
|
|
||||||
qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const Node& destinationNode) {
|
qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const Node& destinationNode) {
|
||||||
Q_ASSERT(!packet.isPartOfMessage());
|
Q_ASSERT(!packet.isPartOfMessage());
|
||||||
|
|
||||||
if (!destinationNode.getActiveSocket()) {
|
if (!destinationNode.getActiveSocket()) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
emit dataSent(destinationNode.getType(), packet.getDataSize());
|
emit dataSent(destinationNode.getType(), packet.getDataSize());
|
||||||
|
destinationNode.recordBytesSent(packet.getDataSize());
|
||||||
|
|
||||||
return sendUnreliablePacket(packet, *destinationNode.getActiveSocket(), destinationNode.getConnectionSecret());
|
return sendUnreliablePacket(packet, *destinationNode.getActiveSocket(), destinationNode.getConnectionSecret());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -298,7 +302,10 @@ qint64 LimitedNodeList::sendPacket(std::unique_ptr<NLPacket> packet, const Node&
|
||||||
if (!destinationNode.getActiveSocket()) {
|
if (!destinationNode.getActiveSocket()) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
emit dataSent(destinationNode.getType(), packet->getDataSize());
|
emit dataSent(destinationNode.getType(), packet->getDataSize());
|
||||||
|
destinationNode.recordBytesSent(packet->getDataSize());
|
||||||
|
|
||||||
return sendPacket(std::move(packet), *destinationNode.getActiveSocket(), destinationNode.getConnectionSecret());
|
return sendPacket(std::move(packet), *destinationNode.getActiveSocket(), destinationNode.getConnectionSecret());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -232,22 +232,22 @@ BandwidthRecorder& getBandwidthRecorder(const QUuid & uuid) {
|
||||||
return *PEER_BANDWIDTH[uuid].data();
|
return *PEER_BANDWIDTH[uuid].data();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkPeer::recordBytesSent(int count) {
|
void NetworkPeer::recordBytesSent(int count) const {
|
||||||
auto& bw = getBandwidthRecorder(_uuid);
|
auto& bw = getBandwidthRecorder(_uuid);
|
||||||
bw.updateOutboundData(0, count);
|
bw.updateOutboundData(0, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkPeer::recordBytesReceived(int count) {
|
void NetworkPeer::recordBytesReceived(int count) const {
|
||||||
auto& bw = getBandwidthRecorder(_uuid);
|
auto& bw = getBandwidthRecorder(_uuid);
|
||||||
bw.updateInboundData(0, count);
|
bw.updateInboundData(0, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
float NetworkPeer::getOutboundBandwidth() {
|
float NetworkPeer::getOutboundBandwidth() const {
|
||||||
auto& bw = getBandwidthRecorder(_uuid);
|
auto& bw = getBandwidthRecorder(_uuid);
|
||||||
return bw.getAverageOutputKilobitsPerSecond(0);
|
return bw.getAverageOutputKilobitsPerSecond(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
float NetworkPeer::getInboundBandwidth() {
|
float NetworkPeer::getInboundBandwidth() const {
|
||||||
auto& bw = getBandwidthRecorder(_uuid);
|
auto& bw = getBandwidthRecorder(_uuid);
|
||||||
return bw.getAverageInputKilobitsPerSecond(0);
|
return bw.getAverageInputKilobitsPerSecond(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,11 +70,11 @@ public:
|
||||||
void incrementConnectionAttempts() { ++_connectionAttempts; }
|
void incrementConnectionAttempts() { ++_connectionAttempts; }
|
||||||
void resetConnectionAttempts() { _connectionAttempts = 0; }
|
void resetConnectionAttempts() { _connectionAttempts = 0; }
|
||||||
|
|
||||||
void recordBytesSent(int count);
|
void recordBytesSent(int count) const;
|
||||||
void recordBytesReceived(int count);
|
void recordBytesReceived(int count) const;
|
||||||
|
|
||||||
float getOutboundBandwidth(); // in kbps
|
float getOutboundBandwidth() const; // in kbps
|
||||||
float getInboundBandwidth(); // in kbps
|
float getInboundBandwidth() const; // in kbps
|
||||||
|
|
||||||
friend QDataStream& operator<<(QDataStream& out, const NetworkPeer& peer);
|
friend QDataStream& operator<<(QDataStream& out, const NetworkPeer& peer);
|
||||||
friend QDataStream& operator>>(QDataStream& in, NetworkPeer& peer);
|
friend QDataStream& operator>>(QDataStream& in, NetworkPeer& peer);
|
||||||
|
|
|
@ -404,6 +404,8 @@ void PacketReceiver::handleVerifiedPacket(std::unique_ptr<udt::Packet> packet) {
|
||||||
|
|
||||||
if (matchingNode) {
|
if (matchingNode) {
|
||||||
emit dataReceived(matchingNode->getType(), nlPacket->getDataSize());
|
emit dataReceived(matchingNode->getType(), nlPacket->getDataSize());
|
||||||
|
matchingNode->recordBytesReceived(nlPacket->getDataSize());
|
||||||
|
|
||||||
QMetaMethod metaMethod = listener.second;
|
QMetaMethod metaMethod = listener.second;
|
||||||
|
|
||||||
static const QByteArray QSHAREDPOINTER_NODE_NORMALIZED = QMetaObject::normalizedType("QSharedPointer<Node>");
|
static const QByteArray QSHAREDPOINTER_NODE_NORMALIZED = QMetaObject::normalizedType("QSharedPointer<Node>");
|
||||||
|
|
|
@ -126,10 +126,6 @@ BasePacket& BasePacket::operator=(BasePacket&& other) {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
qint64 BasePacket::getDataSize() const {
|
|
||||||
return (_payloadStart - _packet.get()) + _payloadSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BasePacket::setPayloadSize(qint64 payloadSize) {
|
void BasePacket::setPayloadSize(qint64 payloadSize) {
|
||||||
if (isWritable()) {
|
if (isWritable()) {
|
||||||
Q_ASSERT(payloadSize <= _payloadCapacity);
|
Q_ASSERT(payloadSize <= _payloadCapacity);
|
||||||
|
|
|
@ -48,7 +48,10 @@ public:
|
||||||
const char* getData() const { return _packet.get(); }
|
const char* getData() const { return _packet.get(); }
|
||||||
|
|
||||||
// Returns the size of the packet, including the header
|
// Returns the size of the packet, including the header
|
||||||
qint64 getDataSize() const;
|
qint64 getDataSize() const { return (_payloadStart - _packet.get()) + _payloadSize; }
|
||||||
|
|
||||||
|
// Returns the size of the packet, including the header AND the UDP/IP header
|
||||||
|
qint64 getWireSize() const { return getDataSize() + UDP_IPV4_HEADER_SIZE; }
|
||||||
|
|
||||||
// Returns the size of the payload only
|
// Returns the size of the payload only
|
||||||
qint64 getPayloadSize() const { return _payloadSize; }
|
qint64 getPayloadSize() const { return _payloadSize; }
|
||||||
|
|
|
@ -17,8 +17,9 @@
|
||||||
#include "SequenceNumber.h"
|
#include "SequenceNumber.h"
|
||||||
|
|
||||||
namespace udt {
|
namespace udt {
|
||||||
|
static const int UDP_IPV4_HEADER_SIZE = 28;
|
||||||
static const int MAX_PACKET_SIZE_WITH_UDP_HEADER = 1500;
|
static const int MAX_PACKET_SIZE_WITH_UDP_HEADER = 1500;
|
||||||
static const int MAX_PACKET_SIZE = MAX_PACKET_SIZE_WITH_UDP_HEADER - 28;
|
static const int MAX_PACKET_SIZE = MAX_PACKET_SIZE_WITH_UDP_HEADER - UDP_IPV4_HEADER_SIZE;
|
||||||
static const int MAX_PACKETS_IN_FLIGHT = 25600;
|
static const int MAX_PACKETS_IN_FLIGHT = 25600;
|
||||||
static const int CONNECTION_RECEIVE_BUFFER_SIZE_PACKETS = 8192;
|
static const int CONNECTION_RECEIVE_BUFFER_SIZE_PACKETS = 8192;
|
||||||
static const int CONNECTION_SEND_BUFFER_SIZE_PACKETS = 8192;
|
static const int CONNECTION_SEND_BUFFER_SIZE_PACKETS = 8192;
|
||||||
|
|
Loading…
Reference in a new issue