From c9f66907fc1b977a31fc5ef81280239ed8a14c15 Mon Sep 17 00:00:00 2001 From: Artem Titov Date: Wed, 21 Sep 2022 09:30:36 +0200 Subject: [PATCH] [PCLF] Add possibility to use new perf metrics api in StatsBasedNetworkQualityMetricsReporter Bug: b/246095034 Change-Id: Iaba2b0656978552482754d8170afe356f3715f6a Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/276200 Reviewed-by: Mirko Bonadei Commit-Queue: Artem Titov Cr-Commit-Position: refs/heads/main@{#38143} --- test/pc/e2e/BUILD.gn | 2 + ..._based_network_quality_metrics_reporter.cc | 177 ++++++++++++++---- ...s_based_network_quality_metrics_reporter.h | 12 +- 3 files changed, 149 insertions(+), 42 deletions(-) diff --git a/test/pc/e2e/BUILD.gn b/test/pc/e2e/BUILD.gn index 0ace4cc525..93e8800b49 100644 --- a/test/pc/e2e/BUILD.gn +++ b/test/pc/e2e/BUILD.gn @@ -849,6 +849,8 @@ if (!build_with_chromium) { "../../../api:rtc_stats_api", "../../../api:scoped_refptr", "../../../api/numerics", + "../../../api/test/metrics:metric", + "../../../api/test/metrics:metrics_logger_and_exporter", "../../../api/test/network_emulation", "../../../api/units:data_rate", "../../../api/units:data_size", diff --git a/test/pc/e2e/stats_based_network_quality_metrics_reporter.cc b/test/pc/e2e/stats_based_network_quality_metrics_reporter.cc index 5e54e0e737..a4e046e540 100644 --- a/test/pc/e2e/stats_based_network_quality_metrics_reporter.cc +++ b/test/pc/e2e/stats_based_network_quality_metrics_reporter.cc @@ -24,6 +24,7 @@ #include "api/scoped_refptr.h" #include "api/stats/rtc_stats.h" #include "api/stats/rtcstats_objects.h" +#include "api/test/metrics/metric.h" #include "api/test/network_emulation/network_emulation_interfaces.h" #include "api/test/network_emulation_manager.h" #include "api/units/data_rate.h" @@ -39,6 +40,9 @@ namespace webrtc { namespace webrtc_pc_e2e { namespace { +using ::webrtc::test::ImprovementDirection; +using ::webrtc::test::Unit; + constexpr TimeDelta kStatsWaitTimeout = TimeDelta::Seconds(1); // Field trial which controls whether to report standard-compliant bytes @@ -237,32 +241,75 @@ void StatsBasedNetworkQualityMetricsReporter::ReportStats( const NetworkLayerStats& network_layer_stats, int64_t packet_loss, const Timestamp& end_time) { - ReportResult("bytes_discarded_no_receiver", pc_label, - network_layer_stats.stats->BytesDropped().bytes(), - "sizeInBytes"); - ReportResult("packets_discarded_no_receiver", pc_label, - network_layer_stats.stats->PacketsDropped(), "unitless"); + if (metrics_logger_ == nullptr) { + ReportResult("bytes_discarded_no_receiver", pc_label, + network_layer_stats.stats->BytesDropped().bytes(), + "sizeInBytes"); + ReportResult("packets_discarded_no_receiver", pc_label, + network_layer_stats.stats->PacketsDropped(), "unitless"); - ReportResult("payload_bytes_received", pc_label, - pc_stats.payload_received.bytes(), "sizeInBytes"); - ReportResult("payload_bytes_sent", pc_label, pc_stats.payload_sent.bytes(), - "sizeInBytes"); + ReportResult("payload_bytes_received", pc_label, + pc_stats.payload_received.bytes(), "sizeInBytes"); + ReportResult("payload_bytes_sent", pc_label, pc_stats.payload_sent.bytes(), + "sizeInBytes"); - ReportResult("bytes_sent", pc_label, pc_stats.total_sent.bytes(), - "sizeInBytes"); - ReportResult("packets_sent", pc_label, pc_stats.packets_sent, "unitless"); - ReportResult("average_send_rate", pc_label, - (pc_stats.total_sent / (end_time - start_time_)).bytes_per_sec(), - "bytesPerSecond"); - ReportResult("bytes_received", pc_label, pc_stats.total_received.bytes(), - "sizeInBytes"); - ReportResult("packets_received", pc_label, pc_stats.packets_received, - "unitless"); - ReportResult( - "average_receive_rate", pc_label, - (pc_stats.total_received / (end_time - start_time_)).bytes_per_sec(), - "bytesPerSecond"); - ReportResult("sent_packets_loss", pc_label, packet_loss, "unitless"); + ReportResult("bytes_sent", pc_label, pc_stats.total_sent.bytes(), + "sizeInBytes"); + ReportResult("packets_sent", pc_label, pc_stats.packets_sent, "unitless"); + ReportResult( + "average_send_rate", pc_label, + (pc_stats.total_sent / (end_time - start_time_)).bytes_per_sec(), + "bytesPerSecond"); + ReportResult("bytes_received", pc_label, pc_stats.total_received.bytes(), + "sizeInBytes"); + ReportResult("packets_received", pc_label, pc_stats.packets_received, + "unitless"); + ReportResult( + "average_receive_rate", pc_label, + (pc_stats.total_received / (end_time - start_time_)).bytes_per_sec(), + "bytesPerSecond"); + ReportResult("sent_packets_loss", pc_label, packet_loss, "unitless"); + } else { + metrics_logger_->LogSingleValueMetric( + "bytes_discarded_no_receiver", pc_label, + network_layer_stats.stats->BytesDropped().bytes(), Unit::kBytes, + ImprovementDirection::kNeitherIsBetter); + metrics_logger_->LogSingleValueMetric( + "packets_discarded_no_receiver", pc_label, + network_layer_stats.stats->PacketsDropped(), Unit::kUnitless, + ImprovementDirection::kNeitherIsBetter); + + metrics_logger_->LogSingleValueMetric( + "payload_bytes_received", pc_label, pc_stats.payload_received.bytes(), + Unit::kBytes, ImprovementDirection::kNeitherIsBetter); + metrics_logger_->LogSingleValueMetric( + "payload_bytes_sent", pc_label, pc_stats.payload_sent.bytes(), + Unit::kBytes, ImprovementDirection::kNeitherIsBetter); + + metrics_logger_->LogSingleValueMetric( + "bytes_sent", pc_label, pc_stats.total_sent.bytes(), Unit::kBytes, + ImprovementDirection::kNeitherIsBetter); + metrics_logger_->LogSingleValueMetric( + "packets_sent", pc_label, pc_stats.packets_sent, Unit::kUnitless, + ImprovementDirection::kNeitherIsBetter); + metrics_logger_->LogSingleValueMetric( + "average_send_rate", pc_label, + (pc_stats.total_sent / (end_time - start_time_)).kbps(), + Unit::kKilobitsPerSecond, ImprovementDirection::kNeitherIsBetter); + metrics_logger_->LogSingleValueMetric( + "bytes_received", pc_label, pc_stats.total_received.bytes(), + Unit::kBytes, ImprovementDirection::kNeitherIsBetter); + metrics_logger_->LogSingleValueMetric( + "packets_received", pc_label, pc_stats.packets_received, + Unit::kUnitless, ImprovementDirection::kNeitherIsBetter); + metrics_logger_->LogSingleValueMetric( + "average_receive_rate", pc_label, + (pc_stats.total_received / (end_time - start_time_)).kbps(), + Unit::kKilobitsPerSecond, ImprovementDirection::kNeitherIsBetter); + metrics_logger_->LogSingleValueMetric( + "sent_packets_loss", pc_label, packet_loss, Unit::kUnitless, + ImprovementDirection::kNeitherIsBetter); + } } void StatsBasedNetworkQualityMetricsReporter::ReportResult( @@ -309,20 +356,47 @@ void StatsBasedNetworkQualityMetricsReporter::LogNetworkLayerStats( log << " " << local_ips[i].ToString() << "\n"; } if (!stats.stats->SentPacketsSizeCounter().IsEmpty()) { - ReportResult("sent_packets_size", peer_name, - stats.stats->SentPacketsSizeCounter(), "sizeInBytes"); + if (metrics_logger_ == nullptr) { + ReportResult("sent_packets_size", peer_name, + stats.stats->SentPacketsSizeCounter(), "sizeInBytes"); + } else { + metrics_logger_->LogMetric( + "sent_packets_size", peer_name, stats.stats->SentPacketsSizeCounter(), + Unit::kBytes, ImprovementDirection::kNeitherIsBetter); + } } if (!stats.stats->ReceivedPacketsSizeCounter().IsEmpty()) { - ReportResult("received_packets_size", peer_name, - stats.stats->ReceivedPacketsSizeCounter(), "sizeInBytes"); + if (metrics_logger_ == nullptr) { + ReportResult("received_packets_size", peer_name, + stats.stats->ReceivedPacketsSizeCounter(), "sizeInBytes"); + } else { + metrics_logger_->LogMetric("received_packets_size", peer_name, + stats.stats->ReceivedPacketsSizeCounter(), + Unit::kBytes, + ImprovementDirection::kNeitherIsBetter); + } } if (!stats.stats->DroppedPacketsSizeCounter().IsEmpty()) { - ReportResult("dropped_packets_size", peer_name, - stats.stats->DroppedPacketsSizeCounter(), "sizeInBytes"); + if (metrics_logger_ == nullptr) { + ReportResult("dropped_packets_size", peer_name, + stats.stats->DroppedPacketsSizeCounter(), "sizeInBytes"); + } else { + metrics_logger_->LogMetric("dropped_packets_size", peer_name, + stats.stats->DroppedPacketsSizeCounter(), + Unit::kBytes, + ImprovementDirection::kNeitherIsBetter); + } } if (!stats.stats->SentPacketsQueueWaitTimeUs().IsEmpty()) { - ReportResult("sent_packets_queue_wait_time_us", peer_name, - stats.stats->SentPacketsQueueWaitTimeUs(), "unitless"); + if (metrics_logger_ == nullptr) { + ReportResult("sent_packets_queue_wait_time_us", peer_name, + stats.stats->SentPacketsQueueWaitTimeUs(), "unitless"); + } else { + metrics_logger_->LogMetric("sent_packets_queue_wait_time_us", peer_name, + stats.stats->SentPacketsQueueWaitTimeUs(), + Unit::kUnitless, + ImprovementDirection::kNeitherIsBetter); + } } log << "Send statistic:\n" @@ -342,9 +416,16 @@ void StatsBasedNetworkQualityMetricsReporter::LogNetworkLayerStats( << " avg_rate (bytes/sec): " << source_average_send_rate.bytes_per_sec() << " avg_rate (bps): " << source_average_send_rate.bps() << "\n"; if (!entry.second->SentPacketsSizeCounter().IsEmpty()) { - ReportResult("sent_packets_size", - peer_name + "/" + entry.first.ToString(), - stats.stats->SentPacketsSizeCounter(), "sizeInBytes"); + if (metrics_logger_ == nullptr) { + ReportResult("sent_packets_size", + peer_name + "/" + entry.first.ToString(), + stats.stats->SentPacketsSizeCounter(), "sizeInBytes"); + } else { + metrics_logger_->LogMetric( + "sent_packets_size", peer_name + "/" + entry.first.ToString(), + stats.stats->SentPacketsSizeCounter(), Unit::kBytes, + ImprovementDirection::kNeitherIsBetter); + } } } @@ -367,14 +448,28 @@ void StatsBasedNetworkQualityMetricsReporter::LogNetworkLayerStats( << source_average_receive_rate.bytes_per_sec() << " avg_rate (bps): " << source_average_receive_rate.bps() << "\n"; if (!entry.second->ReceivedPacketsSizeCounter().IsEmpty()) { - ReportResult("received_packets_size", - peer_name + "/" + entry.first.ToString(), - stats.stats->ReceivedPacketsSizeCounter(), "sizeInBytes"); + if (metrics_logger_ == nullptr) { + ReportResult("received_packets_size", + peer_name + "/" + entry.first.ToString(), + stats.stats->ReceivedPacketsSizeCounter(), "sizeInBytes"); + } else { + metrics_logger_->LogMetric( + "received_packets_size", peer_name + "/" + entry.first.ToString(), + stats.stats->ReceivedPacketsSizeCounter(), Unit::kBytes, + ImprovementDirection::kNeitherIsBetter); + } } if (!entry.second->DroppedPacketsSizeCounter().IsEmpty()) { - ReportResult("dropped_packets_size", - peer_name + "/" + entry.first.ToString(), - stats.stats->DroppedPacketsSizeCounter(), "sizeInBytes"); + if (metrics_logger_ == nullptr) { + ReportResult("dropped_packets_size", + peer_name + "/" + entry.first.ToString(), + stats.stats->DroppedPacketsSizeCounter(), "sizeInBytes"); + } else { + metrics_logger_->LogMetric( + "dropped_packets_size", peer_name + "/" + entry.first.ToString(), + stats.stats->DroppedPacketsSizeCounter(), Unit::kBytes, + ImprovementDirection::kNeitherIsBetter); + } } } diff --git a/test/pc/e2e/stats_based_network_quality_metrics_reporter.h b/test/pc/e2e/stats_based_network_quality_metrics_reporter.h index a940d81df8..f362c7672d 100644 --- a/test/pc/e2e/stats_based_network_quality_metrics_reporter.h +++ b/test/pc/e2e/stats_based_network_quality_metrics_reporter.h @@ -21,6 +21,7 @@ #include "absl/strings/string_view.h" #include "api/numerics/samples_stats_counter.h" +#include "api/test/metrics/metrics_logger_and_exporter.h" #include "api/test/network_emulation/network_emulation_interfaces.h" #include "api/test/network_emulation_manager.h" #include "api/test/peerconnection_quality_test_fixture.h" @@ -41,8 +42,16 @@ class StatsBasedNetworkQualityMetricsReporter StatsBasedNetworkQualityMetricsReporter( std::map> peer_endpoints, NetworkEmulationManager* network_emulation) + : StatsBasedNetworkQualityMetricsReporter(std::move(peer_endpoints), + network_emulation, + /*metrics_logger=*/nullptr) {} + StatsBasedNetworkQualityMetricsReporter( + std::map> peer_endpoints, + NetworkEmulationManager* network_emulation, + test::MetricsLoggerAndExporter* metrics_logger) : collector_(std::move(peer_endpoints), network_emulation), - clock_(network_emulation->time_controller()->GetClock()) {} + clock_(network_emulation->time_controller()->GetClock()), + metrics_logger_(metrics_logger) {} ~StatsBasedNetworkQualityMetricsReporter() override = default; void AddPeer(absl::string_view peer_name, @@ -116,6 +125,7 @@ class StatsBasedNetworkQualityMetricsReporter NetworkLayerStatsCollector collector_; Clock* const clock_; + test::MetricsLoggerAndExporter* const metrics_logger_; std::string test_case_name_; Timestamp start_time_ = Timestamp::MinusInfinity();