diff --git a/test/pc/e2e/BUILD.gn b/test/pc/e2e/BUILD.gn index a44041c186..141022d267 100644 --- a/test/pc/e2e/BUILD.gn +++ b/test/pc/e2e/BUILD.gn @@ -853,6 +853,8 @@ if (!build_with_chromium) { "../../../api:peer_connection_quality_test_fixture_api", "../../../api:rtc_stats_api", "../../../api:track_id_stream_info_map", + "../../../api/test/metrics:metric", + "../../../api/test/metrics:metrics_logger_and_exporter", "../../../api/units:data_size", "../../../rtc_base:criticalsection", "../../../rtc_base:rtc_event", diff --git a/test/pc/e2e/network_quality_metrics_reporter.cc b/test/pc/e2e/network_quality_metrics_reporter.cc index d63cd09786..93d5438f0f 100644 --- a/test/pc/e2e/network_quality_metrics_reporter.cc +++ b/test/pc/e2e/network_quality_metrics_reporter.cc @@ -13,6 +13,7 @@ #include "api/stats/rtc_stats.h" #include "api/stats/rtcstats_objects.h" +#include "api/test/metrics/metric.h" #include "rtc_base/event.h" #include "system_wrappers/include/field_trial.h" #include "test/testsupport/perf_test.h" @@ -21,6 +22,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 @@ -109,35 +113,79 @@ void NetworkQualityMetricsReporter::ReportStats( const std::string& network_label, std::unique_ptr stats, int64_t packet_loss) { - ReportResult("bytes_sent", network_label, stats->BytesSent().bytes(), - "sizeInBytes"); - ReportResult("packets_sent", network_label, stats->PacketsSent(), "unitless"); - ReportResult( - "average_send_rate", network_label, - stats->PacketsSent() >= 2 ? stats->AverageSendRate().bytes_per_sec() : 0, - "bytesPerSecond"); - ReportResult("bytes_discarded_no_receiver", network_label, - stats->BytesDropped().bytes(), "sizeInBytes"); - ReportResult("packets_discarded_no_receiver", network_label, - stats->PacketsDropped(), "unitless"); - ReportResult("bytes_received", network_label, stats->BytesReceived().bytes(), - "sizeInBytes"); - ReportResult("packets_received", network_label, stats->PacketsReceived(), - "unitless"); - ReportResult("average_receive_rate", network_label, - stats->PacketsReceived() >= 2 - ? stats->AverageReceiveRate().bytes_per_sec() - : 0, - "bytesPerSecond"); - ReportResult("sent_packets_loss", network_label, packet_loss, "unitless"); + if (metrics_logger_ == nullptr) { + ReportResult("bytes_sent", network_label, stats->BytesSent().bytes(), + "sizeInBytes"); + ReportResult("packets_sent", network_label, stats->PacketsSent(), + "unitless"); + ReportResult("average_send_rate", network_label, + stats->PacketsSent() >= 2 + ? stats->AverageSendRate().bytes_per_sec() + : 0, + "bytesPerSecond"); + ReportResult("bytes_discarded_no_receiver", network_label, + stats->BytesDropped().bytes(), "sizeInBytes"); + ReportResult("packets_discarded_no_receiver", network_label, + stats->PacketsDropped(), "unitless"); + ReportResult("bytes_received", network_label, + stats->BytesReceived().bytes(), "sizeInBytes"); + ReportResult("packets_received", network_label, stats->PacketsReceived(), + "unitless"); + ReportResult("average_receive_rate", network_label, + stats->PacketsReceived() >= 2 + ? stats->AverageReceiveRate().bytes_per_sec() + : 0, + "bytesPerSecond"); + ReportResult("sent_packets_loss", network_label, packet_loss, "unitless"); + } else { + metrics_logger_->LogSingleValueMetric( + "bytes_sent", network_label, stats->BytesSent().bytes(), Unit::kBytes, + ImprovementDirection::kNeitherIsBetter); + metrics_logger_->LogSingleValueMetric( + "packets_sent", network_label, stats->PacketsSent(), Unit::kUnitless, + ImprovementDirection::kNeitherIsBetter); + metrics_logger_->LogSingleValueMetric( + "average_send_rate", network_label, + stats->PacketsSent() >= 2 ? stats->AverageSendRate().kbps() : 0, + Unit::kKilobitsPerSecond, ImprovementDirection::kNeitherIsBetter); + metrics_logger_->LogSingleValueMetric( + "bytes_discarded_no_receiver", network_label, + stats->BytesDropped().bytes(), Unit::kBytes, + ImprovementDirection::kNeitherIsBetter); + metrics_logger_->LogSingleValueMetric( + "packets_discarded_no_receiver", network_label, stats->PacketsDropped(), + Unit::kUnitless, ImprovementDirection::kNeitherIsBetter); + metrics_logger_->LogSingleValueMetric( + "bytes_received", network_label, stats->BytesReceived().bytes(), + Unit::kBytes, ImprovementDirection::kNeitherIsBetter); + metrics_logger_->LogSingleValueMetric( + "packets_received", network_label, stats->PacketsReceived(), + Unit::kUnitless, ImprovementDirection::kNeitherIsBetter); + metrics_logger_->LogSingleValueMetric( + "average_receive_rate", network_label, + stats->PacketsReceived() >= 2 ? stats->AverageReceiveRate().kbps() : 0, + Unit::kKilobitsPerSecond, ImprovementDirection::kNeitherIsBetter); + metrics_logger_->LogSingleValueMetric( + "sent_packets_loss", network_label, packet_loss, Unit::kUnitless, + ImprovementDirection::kNeitherIsBetter); + } } void NetworkQualityMetricsReporter::ReportPCStats(const std::string& pc_label, const PCStats& stats) { - ReportResult("payload_bytes_received", pc_label, - stats.payload_received.bytes(), "sizeInBytes"); - ReportResult("payload_bytes_sent", pc_label, stats.payload_sent.bytes(), - "sizeInBytes"); + if (metrics_logger_ == nullptr) { + ReportResult("payload_bytes_received", pc_label, + stats.payload_received.bytes(), "sizeInBytes"); + ReportResult("payload_bytes_sent", pc_label, stats.payload_sent.bytes(), + "sizeInBytes"); + } else { + metrics_logger_->LogSingleValueMetric( + "payload_bytes_received", pc_label, stats.payload_received.bytes(), + Unit::kBytes, ImprovementDirection::kNeitherIsBetter); + metrics_logger_->LogSingleValueMetric( + "payload_bytes_sent", pc_label, stats.payload_sent.bytes(), + Unit::kBytes, ImprovementDirection::kNeitherIsBetter); + } } void NetworkQualityMetricsReporter::ReportResult( diff --git a/test/pc/e2e/network_quality_metrics_reporter.h b/test/pc/e2e/network_quality_metrics_reporter.h index 5cedce1e7f..63b35e901c 100644 --- a/test/pc/e2e/network_quality_metrics_reporter.h +++ b/test/pc/e2e/network_quality_metrics_reporter.h @@ -15,6 +15,7 @@ #include #include "absl/strings/string_view.h" +#include "api/test/metrics/metrics_logger_and_exporter.h" #include "api/test/network_emulation_manager.h" #include "api/test/peerconnection_quality_test_fixture.h" #include "api/test/track_id_stream_info_map.h" @@ -29,7 +30,15 @@ class NetworkQualityMetricsReporter public: NetworkQualityMetricsReporter(EmulatedNetworkManagerInterface* alice_network, EmulatedNetworkManagerInterface* bob_network) - : alice_network_(alice_network), bob_network_(bob_network) {} + : NetworkQualityMetricsReporter(alice_network, + bob_network, + /*metrics_logger=*/nullptr) {} + NetworkQualityMetricsReporter(EmulatedNetworkManagerInterface* alice_network, + EmulatedNetworkManagerInterface* bob_network, + test::MetricsLoggerAndExporter* metrics_logger) + : alice_network_(alice_network), + bob_network_(bob_network), + metrics_logger_(metrics_logger) {} ~NetworkQualityMetricsReporter() override = default; // Network stats must be empty when this method will be invoked. @@ -62,8 +71,9 @@ class NetworkQualityMetricsReporter std::string test_case_name_; - EmulatedNetworkManagerInterface* alice_network_; - EmulatedNetworkManagerInterface* bob_network_; + EmulatedNetworkManagerInterface* const alice_network_; + EmulatedNetworkManagerInterface* const bob_network_; + test::MetricsLoggerAndExporter* const metrics_logger_; Mutex lock_; std::map pc_stats_ RTC_GUARDED_BY(lock_); };