cleanup AudioMixer stats to be properly nested

This commit is contained in:
Stephen Birarda 2015-04-28 18:19:16 -07:00
parent 4e6979cac8
commit 68998f4423
5 changed files with 92 additions and 92 deletions

View file

@ -586,12 +586,41 @@ void AudioMixer::sendStatsPacket() {
_sumListeners = 0; _sumListeners = 0;
_sumMixes = 0; _sumMixes = 0;
_numStatFrames = 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<NodeList>(); auto nodeList = DependencyManager::get<NodeList>();
int clientNumber = 0; int clientNumber = 0;
@ -600,7 +629,7 @@ void AudioMixer::sendStatsPacket() {
clientNumber++; clientNumber++;
AudioMixerClientData* clientData = static_cast<AudioMixerClientData*>(node->getLinkedData()); AudioMixerClientData* clientData = static_cast<AudioMixerClientData*>(node->getLinkedData());
if (clientData) { 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(); _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) { void AudioMixer::parseSettingsObject(const QJsonObject &settingsObject) {
if (settingsObject.contains(AUDIO_BUFFER_GROUP_KEY)) { if (settingsObject.contains(AUDIO_BUFFER_GROUP_KEY)) {
QJsonObject audioBufferGroupObject = settingsObject[AUDIO_BUFFER_GROUP_KEY].toObject(); QJsonObject audioBufferGroupObject = settingsObject[AUDIO_BUFFER_GROUP_KEY].toObject();

View file

@ -65,11 +65,6 @@ private:
bool shouldMute(float quietestFrame); bool shouldMute(float quietestFrame);
QString getReadPendingDatagramsCallsPerSecondsStatsString() const;
QString getReadPendingDatagramsPacketsPerCallStatsString() const;
QString getReadPendingDatagramsTimeStatsString() const;
QString getReadPendingDatagramsHashMatchTimeStatsString() const;
void parseSettingsObject(const QJsonObject& settingsObject); void parseSettingsObject(const QJsonObject& settingsObject);
float _trailingSleepRatio; float _trailingSleepRatio;

View file

@ -196,68 +196,68 @@ void AudioMixerClientData::sendAudioStreamStatsPackets(const SharedNodePointer&
} }
} }
QString AudioMixerClientData::getAudioStreamStatsString() const { QJsonObject AudioMixerClientData::getAudioStreamStats() const {
QString result; QJsonObject result;
AudioStreamStats streamStats = _downstreamAudioStreamStats; AudioStreamStats streamStats = _downstreamAudioStreamStats;
result += "DOWNSTREAM.desired:" + QString::number(streamStats._desiredJitterBufferFrames) result["DOWNSTREAM.desired"] = streamStats._desiredJitterBufferFrames;
+ " available_avg_10s:" + QString::number(streamStats._framesAvailableAverage) result["DOWNSTREAM.available_avg_10s"] = streamStats._framesAvailableAverage;
+ " available:" + QString::number(streamStats._framesAvailable) result["DOWNSTREAM.available"] = (double) streamStats._framesAvailable;
+ " starves:" + QString::number(streamStats._starveCount) result["DOWNSTREAM.starves"] = (double) streamStats._starveCount;
+ " not_mixed:" + QString::number(streamStats._consecutiveNotMixedCount) result["DOWNSTREAM.not_mixed"] = (double) streamStats._consecutiveNotMixedCount;
+ " overflows:" + QString::number(streamStats._overflowCount) result["DOWNSTREAM.overflows"] = (double) streamStats._overflowCount;
+ " silents_dropped: ?" result["DOWNSTREAM.lost%"] = streamStats._packetStreamStats.getLostRate() * 100.0f;
+ " lost%:" + QString::number(streamStats._packetStreamStats.getLostRate() * 100.0f, 'f', 2) result["DOWNSTREAM.lost%_30s"] = streamStats._packetStreamWindowStats.getLostRate() * 100.0f;
+ " lost%_30s:" + QString::number(streamStats._packetStreamWindowStats.getLostRate() * 100.0f, 'f', 2) result["DOWNSTREAM.min_gap"] = formatUsecTime(streamStats._timeGapMin);
+ " min_gap:" + formatUsecTime(streamStats._timeGapMin) result["DOWNSTREAM.max_gap"] = formatUsecTime(streamStats._timeGapMax);
+ " max_gap:" + formatUsecTime(streamStats._timeGapMax) result["DOWNSTREAM.avg_gap"] = formatUsecTime(streamStats._timeGapAverage);
+ " avg_gap:" + formatUsecTime(streamStats._timeGapAverage) result["DOWNSTREAM.min_gap_30s"] = formatUsecTime(streamStats._timeGapWindowMin);
+ " min_gap_30s:" + formatUsecTime(streamStats._timeGapWindowMin) result["DOWNSTREAM.max_gap_30s"] = formatUsecTime(streamStats._timeGapWindowMax);
+ " max_gap_30s:" + formatUsecTime(streamStats._timeGapWindowMax) result["DOWNSTREAM.avg_gap_30s"] = formatUsecTime(streamStats._timeGapWindowAverage);
+ " avg_gap_30s:" + formatUsecTime(streamStats._timeGapWindowAverage);
AvatarAudioStream* avatarAudioStream = getAvatarAudioStream(); AvatarAudioStream* avatarAudioStream = getAvatarAudioStream();
if (avatarAudioStream) { if (avatarAudioStream) {
AudioStreamStats streamStats = avatarAudioStream->getAudioStreamStats(); AudioStreamStats streamStats = avatarAudioStream->getAudioStreamStats();
result += " UPSTREAM.mic.desired:" + QString::number(streamStats._desiredJitterBufferFrames) result["UPSTREAM.mic.desired"] = streamStats._desiredJitterBufferFrames;
+ " desired_calc:" + QString::number(avatarAudioStream->getCalculatedJitterBufferFrames()) result["UPSTREAM.desired_calc"] = avatarAudioStream->getCalculatedJitterBufferFrames();
+ " available_avg_10s:" + QString::number(streamStats._framesAvailableAverage) result["UPSTREAM.available_avg_10s"] = streamStats._framesAvailableAverage;
+ " available:" + QString::number(streamStats._framesAvailable) result["UPSTREAM.available"] = (double) streamStats._framesAvailable;
+ " starves:" + QString::number(streamStats._starveCount) result["UPSTREAM.starves"] = (double) streamStats._starveCount;
+ " not_mixed:" + QString::number(streamStats._consecutiveNotMixedCount) result["UPSTREAM.not_mixed"] = (double) streamStats._consecutiveNotMixedCount;
+ " overflows:" + QString::number(streamStats._overflowCount) result["UPSTREAM.overflows"] = (double) streamStats._overflowCount;
+ " silents_dropped:" + QString::number(streamStats._framesDropped) result["UPSTREAM.silents_dropped"] = (double) streamStats._framesDropped;
+ " lost%:" + QString::number(streamStats._packetStreamStats.getLostRate() * 100.0f, 'f', 2) result["UPSTREAM.lost%"] = streamStats._packetStreamStats.getLostRate() * 100.0f;
+ " lost%_30s:" + QString::number(streamStats._packetStreamWindowStats.getLostRate() * 100.0f, 'f', 2) result["UPSTREAM.lost%_30s"] = streamStats._packetStreamWindowStats.getLostRate() * 100.0f;
+ " min_gap:" + formatUsecTime(streamStats._timeGapMin) result["UPSTREAM.min_gap"] = formatUsecTime(streamStats._timeGapMin);
+ " max_gap:" + formatUsecTime(streamStats._timeGapMax) result["UPSTREAM.max_gap"] = formatUsecTime(streamStats._timeGapMax);
+ " avg_gap:" + formatUsecTime(streamStats._timeGapAverage) result["UPSTREAM.avg_gap"] = formatUsecTime(streamStats._timeGapAverage);
+ " min_gap_30s:" + formatUsecTime(streamStats._timeGapWindowMin) result["UPSTREAM.min_gap_30s"] = formatUsecTime(streamStats._timeGapWindowMin);
+ " max_gap_30s:" + formatUsecTime(streamStats._timeGapWindowMax) result["UPSTREAM.max_gap_30s"] = formatUsecTime(streamStats._timeGapWindowMax);
+ " avg_gap_30s:" + formatUsecTime(streamStats._timeGapWindowAverage); result["UPSTREAM.avg_gap_30s"] = formatUsecTime(streamStats._timeGapWindowAverage);
} else { } else {
result = "mic unknown"; // TOOD: How should we handle this case?
// result = "mic unknown";
} }
QHash<QUuid, PositionalAudioStream*>::ConstIterator i; QHash<QUuid, PositionalAudioStream*>::ConstIterator i;
for (i = _audioStreams.constBegin(); i != _audioStreams.constEnd(); i++) { for (i = _audioStreams.constBegin(); i != _audioStreams.constEnd(); i++) {
if (i.value()->getType() == PositionalAudioStream::Injector) { if (i.value()->getType() == PositionalAudioStream::Injector) {
AudioStreamStats streamStats = i.value()->getAudioStreamStats(); AudioStreamStats streamStats = i.value()->getAudioStreamStats();
result += " UPSTREAM.inj.desired:" + QString::number(streamStats._desiredJitterBufferFrames) result["UPSTREAM.inj.desired"] = streamStats._desiredJitterBufferFrames;
+ " desired_calc:" + QString::number(i.value()->getCalculatedJitterBufferFrames()) result["UPSTREAM.desired_calc"] = i.value()->getCalculatedJitterBufferFrames();
+ " available_avg_10s:" + QString::number(streamStats._framesAvailableAverage) result["UPSTREAM.available_avg_10s"] = streamStats._framesAvailableAverage;
+ " available:" + QString::number(streamStats._framesAvailable) result["UPSTREAM.available"] = (double) streamStats._framesAvailable;
+ " starves:" + QString::number(streamStats._starveCount) result["UPSTREAM.starves"] = (double) streamStats._starveCount;
+ " not_mixed:" + QString::number(streamStats._consecutiveNotMixedCount) result["UPSTREAM.not_mixed"] = (double) streamStats._consecutiveNotMixedCount;
+ " overflows:" + QString::number(streamStats._overflowCount) result["UPSTREAM.overflows"] = (double) streamStats._overflowCount;
+ " silents_dropped:" + QString::number(streamStats._framesDropped) result["UPSTREAM.silents_dropped"] = (double) streamStats._framesDropped;
+ " lost%:" + QString::number(streamStats._packetStreamStats.getLostRate() * 100.0f, 'f', 2) result["UPSTREAM.lost%"] = streamStats._packetStreamStats.getLostRate() * 100.0f;
+ " lost%_30s:" + QString::number(streamStats._packetStreamWindowStats.getLostRate() * 100.0f, 'f', 2) result["UPSTREAM.lost%_30s"] = streamStats._packetStreamWindowStats.getLostRate() * 100.0f;
+ " min_gap:" + formatUsecTime(streamStats._timeGapMin) result["UPSTREAM.min_gap"] = formatUsecTime(streamStats._timeGapMin);
+ " max_gap:" + formatUsecTime(streamStats._timeGapMax) result["UPSTREAM.max_gap"] = formatUsecTime(streamStats._timeGapMax);
+ " avg_gap:" + formatUsecTime(streamStats._timeGapAverage) result["UPSTREAM.avg_gap"] = formatUsecTime(streamStats._timeGapAverage);
+ " min_gap_30s:" + formatUsecTime(streamStats._timeGapWindowMin) result["UPSTREAM.min_gap_30s"] = formatUsecTime(streamStats._timeGapWindowMin);
+ " max_gap_30s:" + formatUsecTime(streamStats._timeGapWindowMax) result["max_gap_30s"] = formatUsecTime(streamStats._timeGapWindowMax);
+ " avg_gap_30s:" + formatUsecTime(streamStats._timeGapWindowAverage); result["avg_gap_30s"] = formatUsecTime(streamStats._timeGapWindowAverage);
} }
} }
return result; return result;

View file

@ -12,6 +12,8 @@
#ifndef hifi_AudioMixerClientData_h #ifndef hifi_AudioMixerClientData_h
#define hifi_AudioMixerClientData_h #define hifi_AudioMixerClientData_h
#include <QtCore/QJsonObject>
#include <AABox.h> #include <AABox.h>
#include <AudioFormat.h> // For AudioFilterHSF1s and _penumbraFilter #include <AudioFormat.h> // For AudioFilterHSF1s and _penumbraFilter
#include <AudioBuffer.h> // For AudioFilterHSF1s and _penumbraFilter #include <AudioBuffer.h> // For AudioFilterHSF1s and _penumbraFilter
@ -46,7 +48,7 @@ public:
void removeDeadInjectedStreams(); void removeDeadInjectedStreams();
QString getAudioStreamStatsString() const; QJsonObject getAudioStreamStats() const;
void sendAudioStreamStatsPackets(const SharedNodePointer& destinationNode); void sendAudioStreamStatsPackets(const SharedNodePointer& destinationNode);

View file

@ -73,8 +73,10 @@ qint64 NodeList::sendStats(const QJsonObject& statsObject, const HifiSockAddr& d
// get a QStringList using JSONBreakableMarshal // get a QStringList using JSONBreakableMarshal
QStringList statsStringList = JSONBreakableMarshal::toStringList(statsObject, ""); 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 // enumerate the resulting strings, breaking them into MTU sized packets
return 0; return 0;