From 68998f44238f87ece14408b0130ffddc48c6b561 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 28 Apr 2015 18:19:16 -0700 Subject: [PATCH] cleanup AudioMixer stats to be properly nested --- assignment-client/src/audio/AudioMixer.cpp | 69 ++++++------ assignment-client/src/audio/AudioMixer.h | 5 - .../src/audio/AudioMixerClientData.cpp | 100 +++++++++--------- .../src/audio/AudioMixerClientData.h | 4 +- libraries/networking/src/NodeList.cpp | 6 +- 5 files changed, 92 insertions(+), 92 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index e356ed9e05..8e47466caf 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -586,12 +586,41 @@ void AudioMixer::sendStatsPacket() { _sumListeners = 0; _sumMixes = 0; _numStatFrames = 0; - - statsObject["readPendingDatagram_calls_stats"] = getReadPendingDatagramsCallsPerSecondsStatsString(); - statsObject["readPendingDatagram_packets_per_call_stats"] = getReadPendingDatagramsPacketsPerCallStatsString(); - statsObject["readPendingDatagram_packets_time_per_call_stats"] = getReadPendingDatagramsTimeStatsString(); - statsObject["readPendingDatagram_hashmatch_time_per_call_stats"] = getReadPendingDatagramsHashMatchTimeStatsString(); + QJsonObject readPendingDatagramStats; + + QJsonObject rpdCallsStats; + rpdCallsStats["calls_per_sec_avg_30s"] = _readPendingCallsPerSecondStats.getWindowAverage(); + rpdCallsStats["calls_last_sec"] = _readPendingCallsPerSecondStats.getLastCompleteIntervalStats().getSum() + 0.5; + + readPendingDatagramStats["calls"] = rpdCallsStats; + + QJsonObject packetsPerCallStats; + packetsPerCallStats["avg_30s"] = _datagramsReadPerCallStats.getWindowAverage(); + packetsPerCallStats["avg_1s"] = _datagramsReadPerCallStats.getLastCompleteIntervalStats().getAverage(); + + readPendingDatagramStats["packets_per_call"] = packetsPerCallStats; + + QJsonObject packetsTimePerCallStats; + packetsTimePerCallStats["usecs_per_call_avg_30s"] = _timeSpentPerCallStats.getWindowAverage(); + packetsTimePerCallStats["usecs_per_call_avg_1s"] = _timeSpentPerCallStats.getLastCompleteIntervalStats().getAverage(); + packetsTimePerCallStats["prct_time_in_call_30s"] = + _timeSpentPerCallStats.getWindowSum() / (READ_DATAGRAMS_STATS_WINDOW_SECONDS * USECS_PER_SECOND) * 100.0; + packetsTimePerCallStats["prct_time_in_call_1s"] = + _timeSpentPerCallStats.getLastCompleteIntervalStats().getSum() / USECS_PER_SECOND * 100.0; + + readPendingDatagramStats["packets_time_per_call"] = packetsTimePerCallStats; + + QJsonObject hashMatchTimePerCallStats; + hashMatchTimePerCallStats["usecs_per_hashmatch_avg_30s"] = _timeSpentPerHashMatchCallStats.getWindowAverage(); + hashMatchTimePerCallStats["usecs_per_hashmatch_avg_1s"] + = _timeSpentPerHashMatchCallStats.getLastCompleteIntervalStats().getAverage(); + hashMatchTimePerCallStats["prct_time_in_hashmatch_30s"] + = _timeSpentPerHashMatchCallStats.getWindowSum() / (READ_DATAGRAMS_STATS_WINDOW_SECONDS*USECS_PER_SECOND) * 100.0; + hashMatchTimePerCallStats["prct_time_in_hashmatch_1s"] + = _timeSpentPerHashMatchCallStats.getLastCompleteIntervalStats().getSum() / USECS_PER_SECOND * 100.0; + readPendingDatagramStats["hashmatch_time_per_call"] = hashMatchTimePerCallStats; + auto nodeList = DependencyManager::get(); int clientNumber = 0; @@ -600,7 +629,7 @@ void AudioMixer::sendStatsPacket() { clientNumber++; AudioMixerClientData* clientData = static_cast(node->getLinkedData()); if (clientData) { - statsObject["jitterStats." + node->getUUID().toString()] = clientData->getAudioStreamStatsString(); + statsObject["jitterStats." + node->getUUID().toString()] = clientData->getAudioStreamStats(); } }); @@ -883,34 +912,6 @@ void AudioMixer::perSecondActions() { _timeSpentPerHashMatchCallStats.currentIntervalComplete(); } -QString AudioMixer::getReadPendingDatagramsCallsPerSecondsStatsString() const { - QString result = "calls_per_sec_avg_30s: " + QString::number(_readPendingCallsPerSecondStats.getWindowAverage(), 'f', 2) - + " calls_last_sec: " + QString::number(_readPendingCallsPerSecondStats.getLastCompleteIntervalStats().getSum() + 0.5, 'f', 0); - return result; -} - -QString AudioMixer::getReadPendingDatagramsPacketsPerCallStatsString() const { - QString result = "pkts_per_call_avg_30s: " + QString::number(_datagramsReadPerCallStats.getWindowAverage(), 'f', 2) - + " pkts_per_call_avg_1s: " + QString::number(_datagramsReadPerCallStats.getLastCompleteIntervalStats().getAverage(), 'f', 2); - return result; -} - -QString AudioMixer::getReadPendingDatagramsTimeStatsString() const { - QString result = "usecs_per_call_avg_30s: " + QString::number(_timeSpentPerCallStats.getWindowAverage(), 'f', 2) - + " usecs_per_call_avg_1s: " + QString::number(_timeSpentPerCallStats.getLastCompleteIntervalStats().getAverage(), 'f', 2) - + " prct_time_in_call_30s: " + QString::number(_timeSpentPerCallStats.getWindowSum() / (READ_DATAGRAMS_STATS_WINDOW_SECONDS*USECS_PER_SECOND) * 100.0, 'f', 6) + "%" - + " prct_time_in_call_1s: " + QString::number(_timeSpentPerCallStats.getLastCompleteIntervalStats().getSum() / USECS_PER_SECOND * 100.0, 'f', 6) + "%"; - return result; -} - -QString AudioMixer::getReadPendingDatagramsHashMatchTimeStatsString() const { - QString result = "usecs_per_hashmatch_avg_30s: " + QString::number(_timeSpentPerHashMatchCallStats.getWindowAverage(), 'f', 2) - + " usecs_per_hashmatch_avg_1s: " + QString::number(_timeSpentPerHashMatchCallStats.getLastCompleteIntervalStats().getAverage(), 'f', 2) - + " prct_time_in_hashmatch_30s: " + QString::number(_timeSpentPerHashMatchCallStats.getWindowSum() / (READ_DATAGRAMS_STATS_WINDOW_SECONDS*USECS_PER_SECOND) * 100.0, 'f', 6) + "%" - + " prct_time_in_hashmatch_1s: " + QString::number(_timeSpentPerHashMatchCallStats.getLastCompleteIntervalStats().getSum() / USECS_PER_SECOND * 100.0, 'f', 6) + "%"; - return result; -} - void AudioMixer::parseSettingsObject(const QJsonObject &settingsObject) { if (settingsObject.contains(AUDIO_BUFFER_GROUP_KEY)) { QJsonObject audioBufferGroupObject = settingsObject[AUDIO_BUFFER_GROUP_KEY].toObject(); diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index 6cee557ff9..b6a410d199 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -65,11 +65,6 @@ private: bool shouldMute(float quietestFrame); - QString getReadPendingDatagramsCallsPerSecondsStatsString() const; - QString getReadPendingDatagramsPacketsPerCallStatsString() const; - QString getReadPendingDatagramsTimeStatsString() const; - QString getReadPendingDatagramsHashMatchTimeStatsString() const; - void parseSettingsObject(const QJsonObject& settingsObject); float _trailingSleepRatio; diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 61f9e544e4..365ee6a8f7 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -196,68 +196,68 @@ void AudioMixerClientData::sendAudioStreamStatsPackets(const SharedNodePointer& } } -QString AudioMixerClientData::getAudioStreamStatsString() const { - QString result; +QJsonObject AudioMixerClientData::getAudioStreamStats() const { + QJsonObject result; AudioStreamStats streamStats = _downstreamAudioStreamStats; - result += "DOWNSTREAM.desired:" + QString::number(streamStats._desiredJitterBufferFrames) - + " available_avg_10s:" + QString::number(streamStats._framesAvailableAverage) - + " available:" + QString::number(streamStats._framesAvailable) - + " starves:" + QString::number(streamStats._starveCount) - + " not_mixed:" + QString::number(streamStats._consecutiveNotMixedCount) - + " overflows:" + QString::number(streamStats._overflowCount) - + " silents_dropped: ?" - + " lost%:" + QString::number(streamStats._packetStreamStats.getLostRate() * 100.0f, 'f', 2) - + " lost%_30s:" + QString::number(streamStats._packetStreamWindowStats.getLostRate() * 100.0f, 'f', 2) - + " min_gap:" + formatUsecTime(streamStats._timeGapMin) - + " max_gap:" + formatUsecTime(streamStats._timeGapMax) - + " avg_gap:" + formatUsecTime(streamStats._timeGapAverage) - + " min_gap_30s:" + formatUsecTime(streamStats._timeGapWindowMin) - + " max_gap_30s:" + formatUsecTime(streamStats._timeGapWindowMax) - + " avg_gap_30s:" + formatUsecTime(streamStats._timeGapWindowAverage); + result["DOWNSTREAM.desired"] = streamStats._desiredJitterBufferFrames; + result["DOWNSTREAM.available_avg_10s"] = streamStats._framesAvailableAverage; + result["DOWNSTREAM.available"] = (double) streamStats._framesAvailable; + result["DOWNSTREAM.starves"] = (double) streamStats._starveCount; + result["DOWNSTREAM.not_mixed"] = (double) streamStats._consecutiveNotMixedCount; + result["DOWNSTREAM.overflows"] = (double) streamStats._overflowCount; + result["DOWNSTREAM.lost%"] = streamStats._packetStreamStats.getLostRate() * 100.0f; + result["DOWNSTREAM.lost%_30s"] = streamStats._packetStreamWindowStats.getLostRate() * 100.0f; + result["DOWNSTREAM.min_gap"] = formatUsecTime(streamStats._timeGapMin); + result["DOWNSTREAM.max_gap"] = formatUsecTime(streamStats._timeGapMax); + result["DOWNSTREAM.avg_gap"] = formatUsecTime(streamStats._timeGapAverage); + result["DOWNSTREAM.min_gap_30s"] = formatUsecTime(streamStats._timeGapWindowMin); + result["DOWNSTREAM.max_gap_30s"] = formatUsecTime(streamStats._timeGapWindowMax); + result["DOWNSTREAM.avg_gap_30s"] = formatUsecTime(streamStats._timeGapWindowAverage); AvatarAudioStream* avatarAudioStream = getAvatarAudioStream(); if (avatarAudioStream) { AudioStreamStats streamStats = avatarAudioStream->getAudioStreamStats(); - result += " UPSTREAM.mic.desired:" + QString::number(streamStats._desiredJitterBufferFrames) - + " desired_calc:" + QString::number(avatarAudioStream->getCalculatedJitterBufferFrames()) - + " available_avg_10s:" + QString::number(streamStats._framesAvailableAverage) - + " available:" + QString::number(streamStats._framesAvailable) - + " starves:" + QString::number(streamStats._starveCount) - + " not_mixed:" + QString::number(streamStats._consecutiveNotMixedCount) - + " overflows:" + QString::number(streamStats._overflowCount) - + " silents_dropped:" + QString::number(streamStats._framesDropped) - + " lost%:" + QString::number(streamStats._packetStreamStats.getLostRate() * 100.0f, 'f', 2) - + " lost%_30s:" + QString::number(streamStats._packetStreamWindowStats.getLostRate() * 100.0f, 'f', 2) - + " min_gap:" + formatUsecTime(streamStats._timeGapMin) - + " max_gap:" + formatUsecTime(streamStats._timeGapMax) - + " avg_gap:" + formatUsecTime(streamStats._timeGapAverage) - + " min_gap_30s:" + formatUsecTime(streamStats._timeGapWindowMin) - + " max_gap_30s:" + formatUsecTime(streamStats._timeGapWindowMax) - + " avg_gap_30s:" + formatUsecTime(streamStats._timeGapWindowAverage); + result["UPSTREAM.mic.desired"] = streamStats._desiredJitterBufferFrames; + result["UPSTREAM.desired_calc"] = avatarAudioStream->getCalculatedJitterBufferFrames(); + result["UPSTREAM.available_avg_10s"] = streamStats._framesAvailableAverage; + result["UPSTREAM.available"] = (double) streamStats._framesAvailable; + result["UPSTREAM.starves"] = (double) streamStats._starveCount; + result["UPSTREAM.not_mixed"] = (double) streamStats._consecutiveNotMixedCount; + result["UPSTREAM.overflows"] = (double) streamStats._overflowCount; + result["UPSTREAM.silents_dropped"] = (double) streamStats._framesDropped; + result["UPSTREAM.lost%"] = streamStats._packetStreamStats.getLostRate() * 100.0f; + result["UPSTREAM.lost%_30s"] = streamStats._packetStreamWindowStats.getLostRate() * 100.0f; + result["UPSTREAM.min_gap"] = formatUsecTime(streamStats._timeGapMin); + result["UPSTREAM.max_gap"] = formatUsecTime(streamStats._timeGapMax); + result["UPSTREAM.avg_gap"] = formatUsecTime(streamStats._timeGapAverage); + result["UPSTREAM.min_gap_30s"] = formatUsecTime(streamStats._timeGapWindowMin); + result["UPSTREAM.max_gap_30s"] = formatUsecTime(streamStats._timeGapWindowMax); + result["UPSTREAM.avg_gap_30s"] = formatUsecTime(streamStats._timeGapWindowAverage); } else { - result = "mic unknown"; + // TOOD: How should we handle this case? + // result = "mic unknown"; } QHash::ConstIterator i; for (i = _audioStreams.constBegin(); i != _audioStreams.constEnd(); i++) { if (i.value()->getType() == PositionalAudioStream::Injector) { AudioStreamStats streamStats = i.value()->getAudioStreamStats(); - result += " UPSTREAM.inj.desired:" + QString::number(streamStats._desiredJitterBufferFrames) - + " desired_calc:" + QString::number(i.value()->getCalculatedJitterBufferFrames()) - + " available_avg_10s:" + QString::number(streamStats._framesAvailableAverage) - + " available:" + QString::number(streamStats._framesAvailable) - + " starves:" + QString::number(streamStats._starveCount) - + " not_mixed:" + QString::number(streamStats._consecutiveNotMixedCount) - + " overflows:" + QString::number(streamStats._overflowCount) - + " silents_dropped:" + QString::number(streamStats._framesDropped) - + " lost%:" + QString::number(streamStats._packetStreamStats.getLostRate() * 100.0f, 'f', 2) - + " lost%_30s:" + QString::number(streamStats._packetStreamWindowStats.getLostRate() * 100.0f, 'f', 2) - + " min_gap:" + formatUsecTime(streamStats._timeGapMin) - + " max_gap:" + formatUsecTime(streamStats._timeGapMax) - + " avg_gap:" + formatUsecTime(streamStats._timeGapAverage) - + " min_gap_30s:" + formatUsecTime(streamStats._timeGapWindowMin) - + " max_gap_30s:" + formatUsecTime(streamStats._timeGapWindowMax) - + " avg_gap_30s:" + formatUsecTime(streamStats._timeGapWindowAverage); + result["UPSTREAM.inj.desired"] = streamStats._desiredJitterBufferFrames; + result["UPSTREAM.desired_calc"] = i.value()->getCalculatedJitterBufferFrames(); + result["UPSTREAM.available_avg_10s"] = streamStats._framesAvailableAverage; + result["UPSTREAM.available"] = (double) streamStats._framesAvailable; + result["UPSTREAM.starves"] = (double) streamStats._starveCount; + result["UPSTREAM.not_mixed"] = (double) streamStats._consecutiveNotMixedCount; + result["UPSTREAM.overflows"] = (double) streamStats._overflowCount; + result["UPSTREAM.silents_dropped"] = (double) streamStats._framesDropped; + result["UPSTREAM.lost%"] = streamStats._packetStreamStats.getLostRate() * 100.0f; + result["UPSTREAM.lost%_30s"] = streamStats._packetStreamWindowStats.getLostRate() * 100.0f; + result["UPSTREAM.min_gap"] = formatUsecTime(streamStats._timeGapMin); + result["UPSTREAM.max_gap"] = formatUsecTime(streamStats._timeGapMax); + result["UPSTREAM.avg_gap"] = formatUsecTime(streamStats._timeGapAverage); + result["UPSTREAM.min_gap_30s"] = formatUsecTime(streamStats._timeGapWindowMin); + result["max_gap_30s"] = formatUsecTime(streamStats._timeGapWindowMax); + result["avg_gap_30s"] = formatUsecTime(streamStats._timeGapWindowAverage); } } return result; diff --git a/assignment-client/src/audio/AudioMixerClientData.h b/assignment-client/src/audio/AudioMixerClientData.h index 322c7057da..4f3f8e360d 100644 --- a/assignment-client/src/audio/AudioMixerClientData.h +++ b/assignment-client/src/audio/AudioMixerClientData.h @@ -12,6 +12,8 @@ #ifndef hifi_AudioMixerClientData_h #define hifi_AudioMixerClientData_h +#include + #include #include // For AudioFilterHSF1s and _penumbraFilter #include // For AudioFilterHSF1s and _penumbraFilter @@ -46,7 +48,7 @@ public: void removeDeadInjectedStreams(); - QString getAudioStreamStatsString() const; + QJsonObject getAudioStreamStats() const; void sendAudioStreamStatsPackets(const SharedNodePointer& destinationNode); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 0a38542b81..2aa5c87f42 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -73,8 +73,10 @@ qint64 NodeList::sendStats(const QJsonObject& statsObject, const HifiSockAddr& d // get a QStringList using JSONBreakableMarshal QStringList statsStringList = JSONBreakableMarshal::toStringList(statsObject, ""); - - qDebug() << "Stats string list is" << statsStringList; + + foreach(const QString& statsItem, statsStringList) { + qDebug() << statsItem; + } // enumerate the resulting strings, breaking them into MTU sized packets return 0;