Move the PeerConnection's usage pattern concept to its own file.

This makes it easier to use it from multiple other modules.

Bug: webrtc:11995
Change-Id: Id23843ae4600ebe46aed7465e873d107089fd50b
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/187347
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#32361}
This commit is contained in:
Harald Alvestrand
2020-10-09 05:43:53 +00:00
committed by Commit Bot
parent 7d214ed0ac
commit 44d0dff7a9
7 changed files with 243 additions and 239 deletions

View File

@ -230,6 +230,7 @@ rtc_library("peerconnection") {
":rtp_sender",
":rtp_transceiver",
":stats_collector_interface",
":usage_pattern",
":video_track_source",
"../api:array_view",
"../api:audio_options_api",
@ -305,6 +306,18 @@ rtc_library("peer_connection_message_handler") {
]
}
rtc_library("usage_pattern") {
sources = [
"usage_pattern.cc",
"usage_pattern.h",
]
deps = [
"../api:libjingle_peerconnection_api",
"../rtc_base:logging",
"../system_wrappers:metrics",
]
}
rtc_library("rtp_transceiver") {
sources = [
"rtp_transceiver.cc",
@ -745,6 +758,7 @@ if (rtc_include_tests) {
":rtp_receiver",
":rtp_sender",
":rtp_transceiver",
":usage_pattern",
":video_track_source",
"../api:array_view",
"../api:audio_options_api",

View File

@ -3066,33 +3066,11 @@ void PeerConnection::ReportIceCandidateCollected(
void PeerConnection::NoteUsageEvent(UsageEvent event) {
RTC_DCHECK_RUN_ON(signaling_thread());
usage_event_accumulator_ |= static_cast<int>(event);
usage_pattern_.NoteUsageEvent(event);
}
void PeerConnection::ReportUsagePattern() const {
RTC_DLOG(LS_INFO) << "Usage signature is " << usage_event_accumulator_;
RTC_HISTOGRAM_ENUMERATION_SPARSE("WebRTC.PeerConnection.UsagePattern",
usage_event_accumulator_,
static_cast<int>(UsageEvent::MAX_VALUE));
const int bad_bits =
static_cast<int>(UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED) |
static_cast<int>(UsageEvent::CANDIDATE_COLLECTED);
const int good_bits =
static_cast<int>(UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED) |
static_cast<int>(UsageEvent::REMOTE_CANDIDATE_ADDED) |
static_cast<int>(UsageEvent::ICE_STATE_CONNECTED);
if ((usage_event_accumulator_ & bad_bits) == bad_bits &&
(usage_event_accumulator_ & good_bits) == 0) {
// If called after close(), we can't report, because observer may have
// been deallocated, and therefore pointer is null. Write to log instead.
if (observer_) {
Observer()->OnInterestingUsage(usage_event_accumulator_);
} else {
RTC_LOG(LS_INFO) << "Interesting usage signature "
<< usage_event_accumulator_
<< " observed after observer shutdown";
}
}
usage_pattern_.ReportUsagePattern(observer_);
}
bool PeerConnection::SrtpRequired() const {

View File

@ -36,6 +36,7 @@
#include "pc/stats_collector.h"
#include "pc/stream_collection.h"
#include "pc/transceiver_list.h"
#include "pc/usage_pattern.h"
#include "pc/webrtc_session_description_factory.h"
#include "rtc_base/experiments/field_trial_parser.h"
#include "rtc_base/operations_chain.h"
@ -70,53 +71,6 @@ class PeerConnection : public PeerConnectionInternal,
public RtpSenderBase::SetStreamsObserver,
public sigslot::has_slots<> {
public:
// A bit in the usage pattern is registered when its defining event occurs at
// least once.
enum class UsageEvent : int {
TURN_SERVER_ADDED = 0x01,
STUN_SERVER_ADDED = 0x02,
DATA_ADDED = 0x04,
AUDIO_ADDED = 0x08,
VIDEO_ADDED = 0x10,
// |SetLocalDescription| returns successfully.
SET_LOCAL_DESCRIPTION_SUCCEEDED = 0x20,
// |SetRemoteDescription| returns successfully.
SET_REMOTE_DESCRIPTION_SUCCEEDED = 0x40,
// A local candidate (with type host, server-reflexive, or relay) is
// collected.
CANDIDATE_COLLECTED = 0x80,
// A remote candidate is successfully added via |AddIceCandidate|.
ADD_ICE_CANDIDATE_SUCCEEDED = 0x100,
ICE_STATE_CONNECTED = 0x200,
CLOSE_CALLED = 0x400,
// A local candidate with private IP is collected.
PRIVATE_CANDIDATE_COLLECTED = 0x800,
// A remote candidate with private IP is added, either via AddiceCandidate
// or from the remote description.
REMOTE_PRIVATE_CANDIDATE_ADDED = 0x1000,
// A local mDNS candidate is collected.
MDNS_CANDIDATE_COLLECTED = 0x2000,
// A remote mDNS candidate is added, either via AddIceCandidate or from the
// remote description.
REMOTE_MDNS_CANDIDATE_ADDED = 0x4000,
// A local candidate with IPv6 address is collected.
IPV6_CANDIDATE_COLLECTED = 0x8000,
// A remote candidate with IPv6 address is added, either via AddIceCandidate
// or from the remote description.
REMOTE_IPV6_CANDIDATE_ADDED = 0x10000,
// A remote candidate (with type host, server-reflexive, or relay) is
// successfully added, either via AddIceCandidate or from the remote
// description.
REMOTE_CANDIDATE_ADDED = 0x20000,
// An explicit host-host candidate pair is selected, i.e. both the local and
// the remote candidates have the host type. This does not include candidate
// pairs formed with equivalent prflx remote candidates, e.g. a host-prflx
// pair where the prflx candidate has the same base as a host candidate of
// the remote peer.
DIRECT_CONNECTION_SELECTED = 0x40000,
MAX_VALUE = 0x80000,
};
explicit PeerConnection(PeerConnectionFactory* factory,
std::unique_ptr<RtcEventLog> event_log,
std::unique_ptr<Call> call);
@ -873,7 +827,7 @@ class PeerConnection : public PeerConnectionInternal,
cricket::AudioOptions audio_options_ RTC_GUARDED_BY(signaling_thread());
cricket::VideoOptions video_options_ RTC_GUARDED_BY(signaling_thread());
int usage_event_accumulator_ RTC_GUARDED_BY(signaling_thread()) = 0;
UsagePattern usage_pattern_ RTC_GUARDED_BY(signaling_thread());
bool return_histogram_very_quickly_ RTC_GUARDED_BY(signaling_thread()) =
false;

View File

@ -32,6 +32,7 @@
#include "pc/peer_connection_wrapper.h"
#include "pc/sdp_utils.h"
#include "pc/test/mock_peer_connection_observers.h"
#include "pc/usage_pattern.h"
#include "pc/webrtc_sdp.h"
#include "rtc_base/arraysize.h"
#include "rtc_base/checks.h"
@ -61,7 +62,7 @@ static const rtc::SocketAddress kPrivateLocalAddress("10.1.1.1", 0);
static const rtc::SocketAddress kPrivateIpv6LocalAddress("fd12:3456:789a:1::1",
0);
int MakeUsageFingerprint(std::set<PeerConnection::UsageEvent> events) {
int MakeUsageFingerprint(std::set<UsageEvent> events) {
int signature = 0;
for (const auto it : events) {
signature |= static_cast<int>(it);
@ -418,16 +419,12 @@ TEST_F(PeerConnectionUsageHistogramTest, FingerprintAudioVideo) {
caller->pc()->Close();
callee->pc()->Close();
int expected_fingerprint = MakeUsageFingerprint(
{PeerConnection::UsageEvent::AUDIO_ADDED,
PeerConnection::UsageEvent::VIDEO_ADDED,
PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED,
PeerConnection::UsageEvent::ICE_STATE_CONNECTED,
PeerConnection::UsageEvent::REMOTE_CANDIDATE_ADDED,
PeerConnection::UsageEvent::DIRECT_CONNECTION_SELECTED,
PeerConnection::UsageEvent::CLOSE_CALLED});
{UsageEvent::AUDIO_ADDED, UsageEvent::VIDEO_ADDED,
UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
UsageEvent::CANDIDATE_COLLECTED, UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED,
UsageEvent::ICE_STATE_CONNECTED, UsageEvent::REMOTE_CANDIDATE_ADDED,
UsageEvent::DIRECT_CONNECTION_SELECTED, UsageEvent::CLOSE_CALLED});
// In this case, we may or may not have PRIVATE_CANDIDATE_COLLECTED,
// depending on the machine configuration.
EXPECT_METRIC_EQ(2, webrtc::metrics::NumSamples(kUsagePatternMetric));
@ -437,9 +434,7 @@ TEST_F(PeerConnectionUsageHistogramTest, FingerprintAudioVideo) {
webrtc::metrics::NumEvents(
kUsagePatternMetric,
expected_fingerprint |
static_cast<int>(
PeerConnection::UsageEvent::PRIVATE_CANDIDATE_COLLECTED)) ==
2);
static_cast<int>(UsageEvent::PRIVATE_CANDIDATE_COLLECTED)) == 2);
}
// Test getting the usage fingerprint when the caller collects an mDNS
@ -458,32 +453,24 @@ TEST_F(PeerConnectionUsageHistogramTest, FingerprintWithMdnsCaller) {
callee->pc()->Close();
int expected_fingerprint_caller = MakeUsageFingerprint(
{PeerConnection::UsageEvent::AUDIO_ADDED,
PeerConnection::UsageEvent::VIDEO_ADDED,
PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::MDNS_CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED,
PeerConnection::UsageEvent::ICE_STATE_CONNECTED,
PeerConnection::UsageEvent::REMOTE_CANDIDATE_ADDED,
PeerConnection::UsageEvent::DIRECT_CONNECTION_SELECTED,
PeerConnection::UsageEvent::CLOSE_CALLED});
{UsageEvent::AUDIO_ADDED, UsageEvent::VIDEO_ADDED,
UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
UsageEvent::CANDIDATE_COLLECTED, UsageEvent::MDNS_CANDIDATE_COLLECTED,
UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED, UsageEvent::ICE_STATE_CONNECTED,
UsageEvent::REMOTE_CANDIDATE_ADDED,
UsageEvent::DIRECT_CONNECTION_SELECTED, UsageEvent::CLOSE_CALLED});
// Without a resolver, the callee cannot resolve the received mDNS candidate
// but can still connect with the caller via a prflx candidate. As a result,
// the bit for the direct connection should not be logged.
int expected_fingerprint_callee = MakeUsageFingerprint(
{PeerConnection::UsageEvent::AUDIO_ADDED,
PeerConnection::UsageEvent::VIDEO_ADDED,
PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED,
PeerConnection::UsageEvent::REMOTE_MDNS_CANDIDATE_ADDED,
PeerConnection::UsageEvent::ICE_STATE_CONNECTED,
PeerConnection::UsageEvent::REMOTE_CANDIDATE_ADDED,
PeerConnection::UsageEvent::CLOSE_CALLED});
{UsageEvent::AUDIO_ADDED, UsageEvent::VIDEO_ADDED,
UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
UsageEvent::CANDIDATE_COLLECTED, UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED,
UsageEvent::REMOTE_MDNS_CANDIDATE_ADDED, UsageEvent::ICE_STATE_CONNECTED,
UsageEvent::REMOTE_CANDIDATE_ADDED, UsageEvent::CLOSE_CALLED});
EXPECT_METRIC_EQ(2, webrtc::metrics::NumSamples(kUsagePatternMetric));
EXPECT_METRIC_EQ(1, webrtc::metrics::NumEvents(kUsagePatternMetric,
expected_fingerprint_caller));
@ -509,29 +496,21 @@ TEST_F(PeerConnectionUsageHistogramTest, FingerprintWithMdnsCallee) {
// Similar to the test above, the caller connects with the callee via a prflx
// candidate.
int expected_fingerprint_caller = MakeUsageFingerprint(
{PeerConnection::UsageEvent::AUDIO_ADDED,
PeerConnection::UsageEvent::VIDEO_ADDED,
PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED,
PeerConnection::UsageEvent::REMOTE_MDNS_CANDIDATE_ADDED,
PeerConnection::UsageEvent::ICE_STATE_CONNECTED,
PeerConnection::UsageEvent::REMOTE_CANDIDATE_ADDED,
PeerConnection::UsageEvent::CLOSE_CALLED});
{UsageEvent::AUDIO_ADDED, UsageEvent::VIDEO_ADDED,
UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
UsageEvent::CANDIDATE_COLLECTED, UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED,
UsageEvent::REMOTE_MDNS_CANDIDATE_ADDED, UsageEvent::ICE_STATE_CONNECTED,
UsageEvent::REMOTE_CANDIDATE_ADDED, UsageEvent::CLOSE_CALLED});
int expected_fingerprint_callee = MakeUsageFingerprint(
{PeerConnection::UsageEvent::AUDIO_ADDED,
PeerConnection::UsageEvent::VIDEO_ADDED,
PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::MDNS_CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED,
PeerConnection::UsageEvent::ICE_STATE_CONNECTED,
PeerConnection::UsageEvent::REMOTE_CANDIDATE_ADDED,
PeerConnection::UsageEvent::DIRECT_CONNECTION_SELECTED,
PeerConnection::UsageEvent::CLOSE_CALLED});
{UsageEvent::AUDIO_ADDED, UsageEvent::VIDEO_ADDED,
UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
UsageEvent::CANDIDATE_COLLECTED, UsageEvent::MDNS_CANDIDATE_COLLECTED,
UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED, UsageEvent::ICE_STATE_CONNECTED,
UsageEvent::REMOTE_CANDIDATE_ADDED,
UsageEvent::DIRECT_CONNECTION_SELECTED, UsageEvent::CLOSE_CALLED});
EXPECT_METRIC_EQ(2, webrtc::metrics::NumSamples(kUsagePatternMetric));
EXPECT_METRIC_EQ(1, webrtc::metrics::NumEvents(kUsagePatternMetric,
expected_fingerprint_caller));
@ -549,15 +528,11 @@ TEST_F(PeerConnectionUsageHistogramTest, FingerprintDataOnly) {
caller->pc()->Close();
callee->pc()->Close();
int expected_fingerprint = MakeUsageFingerprint(
{PeerConnection::UsageEvent::DATA_ADDED,
PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED,
PeerConnection::UsageEvent::ICE_STATE_CONNECTED,
PeerConnection::UsageEvent::REMOTE_CANDIDATE_ADDED,
PeerConnection::UsageEvent::DIRECT_CONNECTION_SELECTED,
PeerConnection::UsageEvent::CLOSE_CALLED});
{UsageEvent::DATA_ADDED, UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
UsageEvent::CANDIDATE_COLLECTED, UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED,
UsageEvent::ICE_STATE_CONNECTED, UsageEvent::REMOTE_CANDIDATE_ADDED,
UsageEvent::DIRECT_CONNECTION_SELECTED, UsageEvent::CLOSE_CALLED});
EXPECT_METRIC_EQ(2, webrtc::metrics::NumSamples(kUsagePatternMetric));
EXPECT_METRIC_TRUE(
webrtc::metrics::NumEvents(kUsagePatternMetric, expected_fingerprint) ==
@ -565,9 +540,7 @@ TEST_F(PeerConnectionUsageHistogramTest, FingerprintDataOnly) {
webrtc::metrics::NumEvents(
kUsagePatternMetric,
expected_fingerprint |
static_cast<int>(
PeerConnection::UsageEvent::PRIVATE_CANDIDATE_COLLECTED)) ==
2);
static_cast<int>(UsageEvent::PRIVATE_CANDIDATE_COLLECTED)) == 2);
}
#endif // HAVE_SCTP
#endif // WEBRTC_ANDROID
@ -584,10 +557,9 @@ TEST_F(PeerConnectionUsageHistogramTest, FingerprintStunTurn) {
auto caller = CreatePeerConnection(configuration);
ASSERT_TRUE(caller);
caller->pc()->Close();
int expected_fingerprint =
MakeUsageFingerprint({PeerConnection::UsageEvent::STUN_SERVER_ADDED,
PeerConnection::UsageEvent::TURN_SERVER_ADDED,
PeerConnection::UsageEvent::CLOSE_CALLED});
int expected_fingerprint = MakeUsageFingerprint(
{UsageEvent::STUN_SERVER_ADDED, UsageEvent::TURN_SERVER_ADDED,
UsageEvent::CLOSE_CALLED});
EXPECT_METRIC_EQ(1, webrtc::metrics::NumSamples(kUsagePatternMetric));
EXPECT_METRIC_EQ(
1, webrtc::metrics::NumEvents(kUsagePatternMetric, expected_fingerprint));
@ -606,10 +578,9 @@ TEST_F(PeerConnectionUsageHistogramTest, FingerprintStunTurnInReconfiguration) {
ASSERT_TRUE(caller);
ASSERT_TRUE(caller->pc()->SetConfiguration(configuration).ok());
caller->pc()->Close();
int expected_fingerprint =
MakeUsageFingerprint({PeerConnection::UsageEvent::STUN_SERVER_ADDED,
PeerConnection::UsageEvent::TURN_SERVER_ADDED,
PeerConnection::UsageEvent::CLOSE_CALLED});
int expected_fingerprint = MakeUsageFingerprint(
{UsageEvent::STUN_SERVER_ADDED, UsageEvent::TURN_SERVER_ADDED,
UsageEvent::CLOSE_CALLED});
EXPECT_METRIC_EQ(1, webrtc::metrics::NumSamples(kUsagePatternMetric));
EXPECT_METRIC_EQ(
1, webrtc::metrics::NumEvents(kUsagePatternMetric, expected_fingerprint));
@ -624,28 +595,20 @@ TEST_F(PeerConnectionUsageHistogramTest, FingerprintWithPrivateIPCaller) {
callee->pc()->Close();
int expected_fingerprint_caller = MakeUsageFingerprint(
{PeerConnection::UsageEvent::AUDIO_ADDED,
PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::PRIVATE_CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED,
PeerConnection::UsageEvent::ICE_STATE_CONNECTED,
PeerConnection::UsageEvent::REMOTE_CANDIDATE_ADDED,
PeerConnection::UsageEvent::DIRECT_CONNECTION_SELECTED,
PeerConnection::UsageEvent::CLOSE_CALLED});
{UsageEvent::AUDIO_ADDED, UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
UsageEvent::CANDIDATE_COLLECTED, UsageEvent::PRIVATE_CANDIDATE_COLLECTED,
UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED, UsageEvent::ICE_STATE_CONNECTED,
UsageEvent::REMOTE_CANDIDATE_ADDED,
UsageEvent::DIRECT_CONNECTION_SELECTED, UsageEvent::CLOSE_CALLED});
int expected_fingerprint_callee = MakeUsageFingerprint(
{PeerConnection::UsageEvent::AUDIO_ADDED,
PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED,
PeerConnection::UsageEvent::REMOTE_PRIVATE_CANDIDATE_ADDED,
PeerConnection::UsageEvent::ICE_STATE_CONNECTED,
PeerConnection::UsageEvent::REMOTE_CANDIDATE_ADDED,
PeerConnection::UsageEvent::DIRECT_CONNECTION_SELECTED,
PeerConnection::UsageEvent::CLOSE_CALLED});
{UsageEvent::AUDIO_ADDED, UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
UsageEvent::CANDIDATE_COLLECTED, UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED,
UsageEvent::REMOTE_PRIVATE_CANDIDATE_ADDED,
UsageEvent::ICE_STATE_CONNECTED, UsageEvent::REMOTE_CANDIDATE_ADDED,
UsageEvent::DIRECT_CONNECTION_SELECTED, UsageEvent::CLOSE_CALLED});
EXPECT_METRIC_EQ(2, webrtc::metrics::NumSamples(kUsagePatternMetric));
EXPECT_METRIC_EQ(1, webrtc::metrics::NumEvents(kUsagePatternMetric,
expected_fingerprint_caller));
@ -662,30 +625,22 @@ TEST_F(PeerConnectionUsageHistogramTest, FingerprintWithPrivateIpv6Callee) {
callee->pc()->Close();
int expected_fingerprint_caller = MakeUsageFingerprint(
{PeerConnection::UsageEvent::AUDIO_ADDED,
PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED,
PeerConnection::UsageEvent::REMOTE_PRIVATE_CANDIDATE_ADDED,
PeerConnection::UsageEvent::ICE_STATE_CONNECTED,
PeerConnection::UsageEvent::REMOTE_CANDIDATE_ADDED,
PeerConnection::UsageEvent::REMOTE_IPV6_CANDIDATE_ADDED,
PeerConnection::UsageEvent::DIRECT_CONNECTION_SELECTED,
PeerConnection::UsageEvent::CLOSE_CALLED});
{UsageEvent::AUDIO_ADDED, UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
UsageEvent::CANDIDATE_COLLECTED, UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED,
UsageEvent::REMOTE_PRIVATE_CANDIDATE_ADDED,
UsageEvent::ICE_STATE_CONNECTED, UsageEvent::REMOTE_CANDIDATE_ADDED,
UsageEvent::REMOTE_IPV6_CANDIDATE_ADDED,
UsageEvent::DIRECT_CONNECTION_SELECTED, UsageEvent::CLOSE_CALLED});
int expected_fingerprint_callee = MakeUsageFingerprint(
{PeerConnection::UsageEvent::AUDIO_ADDED,
PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::PRIVATE_CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::IPV6_CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED,
PeerConnection::UsageEvent::REMOTE_CANDIDATE_ADDED,
PeerConnection::UsageEvent::ICE_STATE_CONNECTED,
PeerConnection::UsageEvent::DIRECT_CONNECTION_SELECTED,
PeerConnection::UsageEvent::CLOSE_CALLED});
{UsageEvent::AUDIO_ADDED, UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
UsageEvent::CANDIDATE_COLLECTED, UsageEvent::PRIVATE_CANDIDATE_COLLECTED,
UsageEvent::IPV6_CANDIDATE_COLLECTED,
UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED,
UsageEvent::REMOTE_CANDIDATE_ADDED, UsageEvent::ICE_STATE_CONNECTED,
UsageEvent::DIRECT_CONNECTION_SELECTED, UsageEvent::CLOSE_CALLED});
EXPECT_METRIC_EQ(2, webrtc::metrics::NumSamples(kUsagePatternMetric));
EXPECT_METRIC_EQ(1, webrtc::metrics::NumEvents(kUsagePatternMetric,
expected_fingerprint_caller));
@ -747,27 +702,20 @@ TEST_F(PeerConnectionUsageHistogramTest,
// with the callee via a prflx candidate and hence no direct connection bit
// should be set.
int expected_fingerprint_caller = MakeUsageFingerprint(
{PeerConnection::UsageEvent::DATA_ADDED,
PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::PRIVATE_CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::IPV6_CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::ICE_STATE_CONNECTED,
PeerConnection::UsageEvent::CLOSE_CALLED});
{UsageEvent::DATA_ADDED, UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
UsageEvent::CANDIDATE_COLLECTED, UsageEvent::PRIVATE_CANDIDATE_COLLECTED,
UsageEvent::IPV6_CANDIDATE_COLLECTED, UsageEvent::ICE_STATE_CONNECTED,
UsageEvent::CLOSE_CALLED});
int expected_fingerprint_callee = MakeUsageFingerprint(
{PeerConnection::UsageEvent::DATA_ADDED,
PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::MDNS_CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::REMOTE_CANDIDATE_ADDED,
PeerConnection::UsageEvent::REMOTE_PRIVATE_CANDIDATE_ADDED,
PeerConnection::UsageEvent::REMOTE_IPV6_CANDIDATE_ADDED,
PeerConnection::UsageEvent::ICE_STATE_CONNECTED,
PeerConnection::UsageEvent::DIRECT_CONNECTION_SELECTED,
PeerConnection::UsageEvent::CLOSE_CALLED});
{UsageEvent::DATA_ADDED, UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED,
UsageEvent::CANDIDATE_COLLECTED, UsageEvent::MDNS_CANDIDATE_COLLECTED,
UsageEvent::REMOTE_CANDIDATE_ADDED,
UsageEvent::REMOTE_PRIVATE_CANDIDATE_ADDED,
UsageEvent::REMOTE_IPV6_CANDIDATE_ADDED, UsageEvent::ICE_STATE_CONNECTED,
UsageEvent::DIRECT_CONNECTION_SELECTED, UsageEvent::CLOSE_CALLED});
EXPECT_METRIC_EQ(2, webrtc::metrics::NumSamples(kUsagePatternMetric));
EXPECT_METRIC_EQ(1, webrtc::metrics::NumEvents(kUsagePatternMetric,
expected_fingerprint_caller));
@ -781,16 +729,13 @@ TEST_F(PeerConnectionUsageHistogramTest, NotableUsageNoted) {
caller->GenerateOfferAndCollectCandidates();
caller->pc()->Close();
int expected_fingerprint = MakeUsageFingerprint(
{PeerConnection::UsageEvent::DATA_ADDED,
PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::CLOSE_CALLED});
{UsageEvent::DATA_ADDED, UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
UsageEvent::CANDIDATE_COLLECTED, UsageEvent::CLOSE_CALLED});
EXPECT_METRIC_EQ(1, webrtc::metrics::NumSamples(kUsagePatternMetric));
EXPECT_METRIC_TRUE(
expected_fingerprint == ObservedFingerprint() ||
(expected_fingerprint |
static_cast<int>(
PeerConnection::UsageEvent::PRIVATE_CANDIDATE_COLLECTED)) ==
static_cast<int>(UsageEvent::PRIVATE_CANDIDATE_COLLECTED)) ==
ObservedFingerprint());
EXPECT_METRIC_EQ(absl::make_optional(ObservedFingerprint()),
caller->observer()->interesting_usage_detected());
@ -801,9 +746,8 @@ TEST_F(PeerConnectionUsageHistogramTest, NotableUsageOnEventFiring) {
caller->CreateDataChannel("foo");
caller->GenerateOfferAndCollectCandidates();
int expected_fingerprint = MakeUsageFingerprint(
{PeerConnection::UsageEvent::DATA_ADDED,
PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::CANDIDATE_COLLECTED});
{UsageEvent::DATA_ADDED, UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
UsageEvent::CANDIDATE_COLLECTED});
EXPECT_METRIC_EQ(0, webrtc::metrics::NumSamples(kUsagePatternMetric));
caller->GetInternalPeerConnection()->RequestUsagePatternReportForTesting();
EXPECT_METRIC_EQ_WAIT(1, webrtc::metrics::NumSamples(kUsagePatternMetric),
@ -811,8 +755,7 @@ TEST_F(PeerConnectionUsageHistogramTest, NotableUsageOnEventFiring) {
EXPECT_METRIC_TRUE(
expected_fingerprint == ObservedFingerprint() ||
(expected_fingerprint |
static_cast<int>(
PeerConnection::UsageEvent::PRIVATE_CANDIDATE_COLLECTED)) ==
static_cast<int>(UsageEvent::PRIVATE_CANDIDATE_COLLECTED)) ==
ObservedFingerprint());
EXPECT_METRIC_EQ(absl::make_optional(ObservedFingerprint()),
caller->observer()->interesting_usage_detected());
@ -824,10 +767,8 @@ TEST_F(PeerConnectionUsageHistogramTest,
caller->CreateDataChannel("foo");
caller->GenerateOfferAndCollectCandidates();
int expected_fingerprint = MakeUsageFingerprint(
{PeerConnection::UsageEvent::DATA_ADDED,
PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
PeerConnection::UsageEvent::CLOSE_CALLED});
{UsageEvent::DATA_ADDED, UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED,
UsageEvent::CANDIDATE_COLLECTED, UsageEvent::CLOSE_CALLED});
EXPECT_METRIC_EQ(0, webrtc::metrics::NumSamples(kUsagePatternMetric));
caller->pc()->Close();
EXPECT_METRIC_EQ(1, webrtc::metrics::NumSamples(kUsagePatternMetric));
@ -838,8 +779,7 @@ TEST_F(PeerConnectionUsageHistogramTest,
EXPECT_METRIC_TRUE(
expected_fingerprint == ObservedFingerprint() ||
(expected_fingerprint |
static_cast<int>(
PeerConnection::UsageEvent::PRIVATE_CANDIDATE_COLLECTED)) ==
static_cast<int>(UsageEvent::PRIVATE_CANDIDATE_COLLECTED)) ==
ObservedFingerprint());
// After close, the usage-detection callback should NOT have been called.
EXPECT_METRIC_FALSE(caller->observer()->interesting_usage_detected());

View File

@ -1802,8 +1802,7 @@ void SdpOfferAnswerHandler::DoSetLocalDescription(
}
observer->OnSetLocalDescriptionComplete(RTCError::OK());
pc_->NoteUsageEvent(
PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED);
pc_->NoteUsageEvent(UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED);
// Check if negotiation is needed. We must do this after informing the
// observer that SetLocalDescription() has completed to ensure negotiation is
@ -2062,8 +2061,7 @@ void SdpOfferAnswerHandler::DoSetRemoteDescription(
}
observer->OnSetRemoteDescriptionComplete(RTCError::OK());
pc_->NoteUsageEvent(
PeerConnection::UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED);
pc_->NoteUsageEvent(UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED);
// Check if negotiation is needed. We must do this after informing the
// observer that SetRemoteDescription() has completed to ensure negotiation is
@ -2162,8 +2160,7 @@ bool SdpOfferAnswerHandler::AddIceCandidate(
if (ready) {
bool result = UseCandidate(ice_candidate);
if (result) {
pc_->NoteUsageEvent(
PeerConnection::UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED);
pc_->NoteUsageEvent(UsageEvent::ADD_ICE_CANDIDATE_SUCCEEDED);
NoteAddIceCandidateResult(kAddIceCandidateSuccess);
} else {
NoteAddIceCandidateResult(kAddIceCandidateFailNotUsable);
@ -4235,18 +4232,15 @@ bool SdpOfferAnswerHandler::ReadyToUseRemoteCandidate(
void SdpOfferAnswerHandler::ReportRemoteIceCandidateAdded(
const cricket::Candidate& candidate) {
pc_->NoteUsageEvent(PeerConnection::UsageEvent::REMOTE_CANDIDATE_ADDED);
pc_->NoteUsageEvent(UsageEvent::REMOTE_CANDIDATE_ADDED);
if (candidate.address().IsPrivateIP()) {
pc_->NoteUsageEvent(
PeerConnection::UsageEvent::REMOTE_PRIVATE_CANDIDATE_ADDED);
pc_->NoteUsageEvent(UsageEvent::REMOTE_PRIVATE_CANDIDATE_ADDED);
}
if (candidate.address().IsUnresolvedIP()) {
pc_->NoteUsageEvent(
PeerConnection::UsageEvent::REMOTE_MDNS_CANDIDATE_ADDED);
pc_->NoteUsageEvent(UsageEvent::REMOTE_MDNS_CANDIDATE_ADDED);
}
if (candidate.address().family() == AF_INET6) {
pc_->NoteUsageEvent(
PeerConnection::UsageEvent::REMOTE_IPV6_CANDIDATE_ADDED);
pc_->NoteUsageEvent(UsageEvent::REMOTE_IPV6_CANDIDATE_ADDED);
}
}

49
pc/usage_pattern.cc Normal file
View File

@ -0,0 +1,49 @@
/*
* Copyright 2020 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "pc/usage_pattern.h"
#include "api/peer_connection_interface.h"
#include "rtc_base/logging.h"
#include "system_wrappers/include/metrics.h"
namespace webrtc {
void UsagePattern::NoteUsageEvent(UsageEvent event) {
usage_event_accumulator_ |= static_cast<int>(event);
}
void UsagePattern::ReportUsagePattern(PeerConnectionObserver* observer) const {
RTC_DLOG(LS_INFO) << "Usage signature is " << usage_event_accumulator_;
RTC_HISTOGRAM_ENUMERATION_SPARSE("WebRTC.PeerConnection.UsagePattern",
usage_event_accumulator_,
static_cast<int>(UsageEvent::MAX_VALUE));
const int bad_bits =
static_cast<int>(UsageEvent::SET_LOCAL_DESCRIPTION_SUCCEEDED) |
static_cast<int>(UsageEvent::CANDIDATE_COLLECTED);
const int good_bits =
static_cast<int>(UsageEvent::SET_REMOTE_DESCRIPTION_SUCCEEDED) |
static_cast<int>(UsageEvent::REMOTE_CANDIDATE_ADDED) |
static_cast<int>(UsageEvent::ICE_STATE_CONNECTED);
if ((usage_event_accumulator_ & bad_bits) == bad_bits &&
(usage_event_accumulator_ & good_bits) == 0) {
// If called after close(), we can't report, because observer may have
// been deallocated, and therefore pointer is null. Write to log instead.
if (observer) {
observer->OnInterestingUsage(usage_event_accumulator_);
} else {
RTC_LOG(LS_INFO) << "Interesting usage signature "
<< usage_event_accumulator_
<< " observed after observer shutdown";
}
}
}
} // namespace webrtc

75
pc/usage_pattern.h Normal file
View File

@ -0,0 +1,75 @@
/*
* Copyright 2020 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef PC_USAGE_PATTERN_H_
#define PC_USAGE_PATTERN_H_
namespace webrtc {
class PeerConnectionObserver;
// A bit in the usage pattern is registered when its defining event occurs
// at least once.
enum class UsageEvent : int {
TURN_SERVER_ADDED = 0x01,
STUN_SERVER_ADDED = 0x02,
DATA_ADDED = 0x04,
AUDIO_ADDED = 0x08,
VIDEO_ADDED = 0x10,
// |SetLocalDescription| returns successfully.
SET_LOCAL_DESCRIPTION_SUCCEEDED = 0x20,
// |SetRemoteDescription| returns successfully.
SET_REMOTE_DESCRIPTION_SUCCEEDED = 0x40,
// A local candidate (with type host, server-reflexive, or relay) is
// collected.
CANDIDATE_COLLECTED = 0x80,
// A remote candidate is successfully added via |AddIceCandidate|.
ADD_ICE_CANDIDATE_SUCCEEDED = 0x100,
ICE_STATE_CONNECTED = 0x200,
CLOSE_CALLED = 0x400,
// A local candidate with private IP is collected.
PRIVATE_CANDIDATE_COLLECTED = 0x800,
// A remote candidate with private IP is added, either via AddiceCandidate
// or from the remote description.
REMOTE_PRIVATE_CANDIDATE_ADDED = 0x1000,
// A local mDNS candidate is collected.
MDNS_CANDIDATE_COLLECTED = 0x2000,
// A remote mDNS candidate is added, either via AddIceCandidate or from the
// remote description.
REMOTE_MDNS_CANDIDATE_ADDED = 0x4000,
// A local candidate with IPv6 address is collected.
IPV6_CANDIDATE_COLLECTED = 0x8000,
// A remote candidate with IPv6 address is added, either via AddIceCandidate
// or from the remote description.
REMOTE_IPV6_CANDIDATE_ADDED = 0x10000,
// A remote candidate (with type host, server-reflexive, or relay) is
// successfully added, either via AddIceCandidate or from the remote
// description.
REMOTE_CANDIDATE_ADDED = 0x20000,
// An explicit host-host candidate pair is selected, i.e. both the local and
// the remote candidates have the host type. This does not include candidate
// pairs formed with equivalent prflx remote candidates, e.g. a host-prflx
// pair where the prflx candidate has the same base as a host candidate of
// the remote peer.
DIRECT_CONNECTION_SELECTED = 0x40000,
MAX_VALUE = 0x80000,
};
class UsagePattern {
public:
void NoteUsageEvent(UsageEvent event);
void ReportUsagePattern(PeerConnectionObserver* observer) const;
private:
int usage_event_accumulator_ = 0;
};
} // namespace webrtc
#endif // PC_USAGE_PATTERN_H_