diff --git a/connections/implementation/analytics/BUILD b/connections/implementation/analytics/BUILD index f3a4023e..c2dd6e15 100644 --- a/connections/implementation/analytics/BUILD +++ b/connections/implementation/analytics/BUILD @@ -20,8 +20,10 @@ cc_library( "throughput_recorder.cc", ], hdrs = [ + "advertising_metadata_params.h", "analytics_recorder.h", "connection_attempt_metadata_params.h", + "discovery_metadata_params.h", "packet_meta_data.h", "throughput_recorder.h", ], diff --git a/connections/implementation/analytics/advertising_metadata_params.h b/connections/implementation/analytics/advertising_metadata_params.h new file mode 100644 index 00000000..2b3b3372 --- /dev/null +++ b/connections/implementation/analytics/advertising_metadata_params.h @@ -0,0 +1,36 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ANALYTICS_ADVERTISING_METADATA_PARAMS_H_ +#define ANALYTICS_ADVERTISING_METADATA_PARAMS_H_ + +#include + +#include "internal/proto/analytics/connections_log.pb.h" + +namespace nearby { + +// A struct to construct AdvertisingMetadata for the analytics recorder. +struct AdvertisingMetadataParams { + bool is_extended_advertisement_supported = false; + int connected_ap_frequency = 0; + bool is_nfc_available = false; + std::vector + operation_result_with_mediums = {}; +}; + +} // namespace nearby + +#endif // ANALYTICS_ADVERTISING_METADATA_PARAMS_H_ diff --git a/connections/implementation/analytics/analytics_recorder.cc b/connections/implementation/analytics/analytics_recorder.cc index ead5f2b9..cca27aa9 100644 --- a/connections/implementation/analytics/analytics_recorder.cc +++ b/connections/implementation/analytics/analytics_recorder.cc @@ -26,7 +26,9 @@ #include "absl/container/btree_map.h" #include "absl/strings/string_view.h" #include "absl/time/time.h" +#include "connections/implementation/analytics/advertising_metadata_params.h" #include "connections/implementation/analytics/connection_attempt_metadata_params.h" +#include "connections/implementation/analytics/discovery_metadata_params.h" #include "connections/payload_type.h" #include "connections/strategy.h" #include "internal/analytics/event_logger.h" @@ -206,10 +208,7 @@ void AnalyticsRecorder::ResetClientSessionLoggingResoucesLocked() { void AnalyticsRecorder::OnStartAdvertising( connections::Strategy strategy, const std::vector &mediums, - const std::vector - &operation_result_with_mediums, - bool is_extended_advertisement_supported, int connected_ap_frequency, - bool is_nfc_available) { + AdvertisingMetadataParams *advertising_metadata_params) { MutexLock lock(&mutex_); if (!CanRecordAnalyticsLocked("OnStartAdvertising")) { return; @@ -228,16 +227,24 @@ void AnalyticsRecorder::OnStartAdvertising( std::make_unique(); absl::c_copy(mediums, RepeatedFieldBackInserter( current_advertising_phase_->mutable_medium())); - absl::c_copy(operation_result_with_mediums, - RepeatedFieldBackInserter( - current_advertising_phase_->mutable_adv_dis_result())); // Set a AdvertisingMetadata. + AdvertisingMetadataParams default_params = {}; + if (advertising_metadata_params == nullptr) { + advertising_metadata_params = &default_params; + } + if (!advertising_metadata_params->operation_result_with_mediums.empty()) { + absl::c_copy(advertising_metadata_params->operation_result_with_mediums, + RepeatedFieldBackInserter( + current_advertising_phase_->mutable_adv_dis_result())); + } auto *advertising_metadata = current_advertising_phase_->mutable_advertising_metadata(); advertising_metadata->set_supports_extended_ble_advertisements( - is_extended_advertisement_supported); - advertising_metadata->set_connected_ap_frequency(connected_ap_frequency); - advertising_metadata->set_supports_nfc_technology(is_nfc_available); + advertising_metadata_params->is_extended_advertisement_supported); + advertising_metadata->set_connected_ap_frequency( + advertising_metadata_params->connected_ap_frequency); + advertising_metadata->set_supports_nfc_technology( + advertising_metadata_params->is_nfc_available); } void AnalyticsRecorder::OnStopAdvertising() { @@ -250,10 +257,7 @@ void AnalyticsRecorder::OnStopAdvertising() { void AnalyticsRecorder::OnStartDiscovery( connections::Strategy strategy, const std::vector &mediums, - const std::vector - &operation_result_with_mediums, - bool is_extended_advertisement_supported, int connected_ap_frequency, - bool is_nfc_available) { + DiscoveryMetadataParams *discovery_metadata_params) { MutexLock lock(&mutex_); if (!CanRecordAnalyticsLocked("OnStartDiscovery")) { return; @@ -272,16 +276,24 @@ void AnalyticsRecorder::OnStartDiscovery( current_discovery_phase_ = std::make_unique(); absl::c_copy(mediums, RepeatedFieldBackInserter( current_discovery_phase_->mutable_medium())); - absl::c_copy(operation_result_with_mediums, - RepeatedFieldBackInserter( - current_discovery_phase_->mutable_adv_dis_result())); // Set a DiscoveryMetadata. + DiscoveryMetadataParams default_params = {}; + if (discovery_metadata_params == nullptr) { + discovery_metadata_params = &default_params; + } + if (!discovery_metadata_params->operation_result_with_mediums.empty()) { + absl::c_copy(discovery_metadata_params->operation_result_with_mediums, + RepeatedFieldBackInserter( + current_discovery_phase_->mutable_adv_dis_result())); + } auto *discovery_metadata = current_discovery_phase_->mutable_discovery_metadata(); discovery_metadata->set_supports_extended_ble_advertisements( - is_extended_advertisement_supported); - discovery_metadata->set_connected_ap_frequency(connected_ap_frequency); - discovery_metadata->set_supports_nfc_technology(is_nfc_available); + discovery_metadata_params->is_extended_advertisement_supported); + discovery_metadata->set_connected_ap_frequency( + discovery_metadata_params->connected_ap_frequency); + discovery_metadata->set_supports_nfc_technology( + discovery_metadata_params->is_nfc_available); } void AnalyticsRecorder::OnStopDiscovery() { @@ -902,6 +914,38 @@ void AnalyticsRecorder::LogSession() { session_was_logged_ = true; } +std::unique_ptr +AnalyticsRecorder::BuildAdvertisingMetadataParams( + bool is_extended_advertisement_supported, int connected_ap_frequency, + bool is_nfc_available, + const std::vector + &operation_result_with_mediums) { + auto params = std::make_unique(); + params->is_extended_advertisement_supported = + is_extended_advertisement_supported; + params->connected_ap_frequency = connected_ap_frequency; + params->is_nfc_available = is_nfc_available; + params->operation_result_with_mediums = + std::move(operation_result_with_mediums); + return params; +} + +std::unique_ptr +AnalyticsRecorder::BuildDiscoveryMetadataParams( + bool is_extended_advertisement_supported, int connected_ap_frequency, + bool is_nfc_available, + const std::vector + &operation_result_with_mediums) { + auto params = std::make_unique(); + params->is_extended_advertisement_supported = + is_extended_advertisement_supported; + params->connected_ap_frequency = connected_ap_frequency; + params->is_nfc_available = is_nfc_available; + params->operation_result_with_mediums = + std::move(operation_result_with_mediums); + return params; +} + std::unique_ptr AnalyticsRecorder::BuildConnectionAttemptMetadataParams( ConnectionTechnology technology, ConnectionBand band, int frequency, diff --git a/connections/implementation/analytics/analytics_recorder.h b/connections/implementation/analytics/analytics_recorder.h index ab958369..af0ad58e 100644 --- a/connections/implementation/analytics/analytics_recorder.h +++ b/connections/implementation/analytics/analytics_recorder.h @@ -25,7 +25,9 @@ #include "absl/container/btree_map.h" #include "absl/strings/string_view.h" #include "absl/time/time.h" +#include "connections/implementation/analytics/advertising_metadata_params.h" #include "connections/implementation/analytics/connection_attempt_metadata_params.h" +#include "connections/implementation/analytics/discovery_metadata_params.h" #include "connections/payload_type.h" #include "connections/strategy.h" #include "internal/analytics/event_logger.h" @@ -47,19 +49,11 @@ class AnalyticsRecorder { bool no_record_time_millis); virtual ~AnalyticsRecorder(); - // TODO(edwinwu): Implement to pass real values for AdvertisingMetadata and - // DiscoveryMetaData: is_extended_advertisement_supported, - // connected_ap_frequency, and is_nfc_available. Set as default values for - // analytics recorder. // Advertising phase void OnStartAdvertising( connections::Strategy strategy, const std::vector &mediums, - const std::vector - &operation_result_with_medium, - bool is_extended_advertisement_supported = false, - int connected_ap_frequency = 0, bool is_nfc_available = false) + AdvertisingMetadataParams *advertising_metadata_params) ABSL_LOCKS_EXCLUDED(mutex_); void OnStopAdvertising() ABSL_LOCKS_EXCLUDED(mutex_); @@ -72,11 +66,7 @@ class AnalyticsRecorder { void OnStartDiscovery( connections::Strategy strategy, const std::vector &mediums, - const std::vector - &operation_result_with_medium, - bool is_extended_advertisement_supported = false, - int connected_ap_frequency = 0, bool is_nfc_available = false) + DiscoveryMetadataParams *discovery_metadata_params) ABSL_LOCKS_EXCLUDED(mutex_); void OnStopDiscovery() ABSL_LOCKS_EXCLUDED(mutex_); void OnEndpointFound(location::nearby::proto::connections::Medium medium) @@ -120,9 +110,20 @@ class AnalyticsRecorder { absl::Duration duration, const std::string &connection_token, ConnectionAttemptMetadataParams *connection_attempt_metadata_params) ABSL_LOCKS_EXCLUDED(mutex_); - // TODO(edwinwu): Implement network operator, country code, tdls, wifi hotspot - //, max wifi tx/rx speed and channel width. Set as default values for - // analytics recorder. + static std::unique_ptr + BuildAdvertisingMetadataParams( + bool is_extended_advertisement_supported = false, + int connected_ap_frequency = 0, bool is_nfc_available = false, + const std::vector + &operation_result_with_mediums = {}); + static std::unique_ptr BuildDiscoveryMetadataParams( + bool is_extended_advertisement_supported = false, + int connected_ap_frequency = 0, bool is_nfc_available = false, + const std::vector + &operation_result_with_mediums = {}); + static std::unique_ptr BuildConnectionAttemptMetadataParams( location::nearby::proto::connections::ConnectionTechnology technology, diff --git a/connections/implementation/analytics/analytics_recorder_test.cc b/connections/implementation/analytics/analytics_recorder_test.cc index 07296199..04e5cbcb 100644 --- a/connections/implementation/analytics/analytics_recorder_test.cc +++ b/connections/implementation/analytics/analytics_recorder_test.cc @@ -173,12 +173,18 @@ TEST(AnalyticsRecorderTest, SetFieldsCorrectlyForNestedAdvertisingCalls) { operation_result.set_result_code(OperationResultCode::DETAIL_SUCCESS); operation_result.set_result_category( OperationResultCategory::CATEGORY_SUCCESS); + auto advertising_metadata_params = + analytics_recorder.BuildAdvertisingMetadataParams(); + advertising_metadata_params->operation_result_with_mediums = { + operation_result}; analytics_recorder.OnStartAdvertising(strategy, /*mediums=*/{BLE, BLUETOOTH}, - {operation_result}); + advertising_metadata_params.get()); analytics_recorder.OnStopAdvertising(); operation_result.set_medium(BLE); + advertising_metadata_params->operation_result_with_mediums = { + operation_result}; analytics_recorder.OnStartAdvertising(strategy, /*mediums=*/{BLUETOOTH}, - {operation_result}); + advertising_metadata_params.get()); analytics_recorder.LogSession(); ASSERT_TRUE(client_session_done_latch.Await(kDefaultTimeout).result()); @@ -241,18 +247,25 @@ TEST(AnalyticsRecorderTest, SetFieldsCorrectlyForNestedDiscoveryCalls) { operation_result2.set_result_code(OperationResultCode::DETAIL_SUCCESS); operation_result2.set_result_category( OperationResultCategory::CATEGORY_SUCCESS); - analytics_recorder.OnStartDiscovery( - strategy, /*mediums=*/{BLE, BLUETOOTH}, - {operation_result, operation_result2}, - /*is_extended_advertisement_supported=*/true, - /*connected_ap_frequency=*/1, /*is_nfc_available=*/false); + + auto discovery_metadata_params = + analytics_recorder.BuildDiscoveryMetadataParams( + /*is_extended_advertisement_supported*/ true, + /*connected_ap_frequency*/ 1, /*is_nfc_available=*/false, + {operation_result, operation_result2}); + analytics_recorder.OnStartDiscovery(strategy, /*mediums=*/{BLE, BLUETOOTH}, + discovery_metadata_params.get()); analytics_recorder.OnStopDiscovery(); analytics_recorder.OnEndpointFound(BLUETOOTH); analytics_recorder.OnEndpointFound(BLE); - analytics_recorder.OnStartDiscovery( - strategy, /*mediums=*/{BLUETOOTH}, {operation_result}, - /*is_extended_advertisement_supported=*/true, - /*connected_ap_frequency=*/1, /*is_nfc_available=*/false); + + auto discovery_metadata_params2 = + analytics_recorder.BuildDiscoveryMetadataParams( + /*is_extended_advertisement_supported*/ true, + /*connected_ap_frequency*/ 1, /*is_nfc_available=*/false, + {operation_result}); + analytics_recorder.OnStartDiscovery(strategy, /*mediums=*/{BLUETOOTH}, + discovery_metadata_params2.get()); analytics_recorder.LogSession(); ASSERT_TRUE(client_session_done_latch.Await(kDefaultTimeout).result()); @@ -314,16 +327,25 @@ TEST(AnalyticsRecorderTest, AnalyticsRecorder analytics_recorder(&event_logger, /*no_record_time_millis=*/true); - analytics_recorder.OnStartAdvertising(strategy, mediums, {}); - analytics_recorder.OnStartDiscovery(strategy, mediums, {}); + auto advertising_metadata_params = + analytics_recorder.BuildAdvertisingMetadataParams(); + analytics_recorder.OnStartAdvertising(strategy, mediums, + advertising_metadata_params.get()); + auto discovery_metadata_params = + analytics_recorder.BuildDiscoveryMetadataParams(); + analytics_recorder.OnStartDiscovery(strategy, mediums, + discovery_metadata_params.get()); analytics_recorder.OnStopAdvertising(); analytics_recorder.OnStopDiscovery(); - analytics_recorder.OnStartAdvertising(strategy, mediums, {}); + analytics_recorder.OnStartAdvertising(strategy, mediums, + advertising_metadata_params.get()); analytics_recorder.OnStopAdvertising(); - analytics_recorder.OnStartDiscovery(strategy, mediums, {}); + analytics_recorder.OnStartDiscovery(strategy, mediums, + discovery_metadata_params.get()); analytics_recorder.OnStopDiscovery(); analytics_recorder.OnStartDiscovery(strategy, mediums, {}); - analytics_recorder.OnStartAdvertising(strategy, mediums, {}); + analytics_recorder.OnStartAdvertising(strategy, mediums, + advertising_metadata_params.get()); analytics_recorder.OnStopDiscovery(); analytics_recorder.OnStopAdvertising(); @@ -422,9 +444,13 @@ TEST(AnalyticsRecorderTest, AdvertiserConnectionRequestsWorks) { operation_result.set_result_code(OperationResultCode::DETAIL_SUCCESS); operation_result.set_result_category( OperationResultCategory::CATEGORY_SUCCESS); + auto advertising_metadata_params = + analytics_recorder.BuildAdvertisingMetadataParams(); + advertising_metadata_params->operation_result_with_mediums = { + operation_result}; analytics_recorder.OnStartAdvertising(connections::Strategy::kP2pStar, /*mediums=*/{BLE, BLUETOOTH}, - {operation_result}); + advertising_metadata_params.get()); analytics_recorder.OnConnectionRequestReceived(endpoint_id_0); analytics_recorder.OnLocalEndpointAccepted(endpoint_id_0); analytics_recorder.OnRemoteEndpointAccepted(endpoint_id_0); @@ -502,9 +528,12 @@ TEST(AnalyticsRecorderTest, DiscoveryConnectionRequestsWorks) { operation_result.set_result_code(OperationResultCode::DETAIL_SUCCESS); operation_result.set_result_category( OperationResultCategory::CATEGORY_SUCCESS); + auto discovery_metadata_params = + analytics_recorder.BuildDiscoveryMetadataParams(); + discovery_metadata_params->operation_result_with_mediums = {operation_result}; analytics_recorder.OnStartDiscovery(connections::Strategy::kP2pStar, /*mediums=*/{BLE, BLUETOOTH}, - {operation_result}); + discovery_metadata_params.get()); analytics_recorder.OnConnectionRequestSent(endpoint_id_0); analytics_recorder.OnLocalEndpointAccepted(endpoint_id_0); @@ -583,9 +612,13 @@ TEST(AnalyticsRecorderTest, operation_result.set_result_code(OperationResultCode::DETAIL_SUCCESS); operation_result.set_result_category( OperationResultCategory::CATEGORY_SUCCESS); + auto advertising_metadata_params = + analytics_recorder.BuildAdvertisingMetadataParams(); + advertising_metadata_params->operation_result_with_mediums = { + operation_result}; analytics_recorder.OnStartAdvertising(connections::Strategy::kP2pStar, /*mediums=*/{BLE, BLUETOOTH}, - {operation_result}); + advertising_metadata_params.get()); // Ignored by local. analytics_recorder.OnConnectionRequestReceived(endpoint_id_0); analytics_recorder.OnRemoteEndpointAccepted(endpoint_id_0); @@ -654,9 +687,12 @@ TEST(AnalyticsRecorderTest, operation_result.set_result_code(OperationResultCode::DETAIL_SUCCESS); operation_result.set_result_category( OperationResultCategory::CATEGORY_SUCCESS); + auto discovery_metadata_params = + analytics_recorder.BuildDiscoveryMetadataParams(); + discovery_metadata_params->operation_result_with_mediums = {operation_result}; analytics_recorder.OnStartDiscovery(connections::Strategy::kP2pStar, /*mediums=*/{BLE, BLUETOOTH}, - {operation_result}); + discovery_metadata_params.get()); // Ignored by local. analytics_recorder.OnConnectionRequestSent(endpoint_id_0); @@ -721,9 +757,13 @@ TEST(AnalyticsRecorderTest, SuccessfulIncomingConnectionAttempt) { operation_result.set_result_code(OperationResultCode::DETAIL_SUCCESS); operation_result.set_result_category( OperationResultCategory::CATEGORY_SUCCESS); + auto advertising_metadata_params = + analytics_recorder.BuildAdvertisingMetadataParams(); + advertising_metadata_params->operation_result_with_mediums = { + operation_result}; analytics_recorder.OnStartAdvertising(connections::Strategy::kP2pStar, /*mediums=*/{BLE, BLUETOOTH}, - {operation_result}); + advertising_metadata_params.get()); auto connections_attempt_metadata_params = std::make_unique(); @@ -807,8 +847,11 @@ TEST(AnalyticsRecorderTest, /*wifi_hotspot_enabled*/ false, /*max_wifi_tx_speed*/ 0, /*max_wifi_rx_speed*/ 0, /*channel_width*/ 0, OperationResultCode::CONNECTIVITY_BT_CLIENT_SOCKET_CREATION_FAILURE); + auto discovery_metadata_params = + analytics_recorder.BuildDiscoveryMetadataParams(); analytics_recorder.OnStartDiscovery(connections::Strategy::kP2pStar, - /*mediums=*/{BLE, BLUETOOTH}, {}); + /*mediums=*/{BLE, BLUETOOTH}, + discovery_metadata_params.get()); analytics_recorder.OnConnectionRequestSent(endpoint_id); analytics_recorder.OnOutgoingConnectionAttempt( endpoint_id, INITIAL, BLUETOOTH, RESULT_ERROR, absl::Duration{}, @@ -875,8 +918,11 @@ TEST(AnalyticsRecorderTest, UnfinishedEstablishedConnectionsAddedAsUnfinished) { AnalyticsRecorder analytics_recorder(&event_logger, /*no_record_time_millis=*/true); + auto advertising_metadata_params = + analytics_recorder.BuildAdvertisingMetadataParams(); analytics_recorder.OnStartAdvertising(connections::Strategy::kP2pStar, - /*mediums=*/{BLE, BLUETOOTH}, {}); + /*mediums=*/{BLE, BLUETOOTH}, + advertising_metadata_params.get()); analytics_recorder.OnConnectionEstablished(endpoint_id, BLUETOOTH, connection_token); analytics_recorder.OnConnectionClosed( @@ -939,8 +985,11 @@ TEST(AnalyticsRecorderTest, OutgoingPayloadUpgraded) { AnalyticsRecorder analytics_recorder(&event_logger, /*no_record_time_millis=*/true); + auto advertising_metadata_params = + analytics_recorder.BuildAdvertisingMetadataParams(); analytics_recorder.OnStartAdvertising(connections::Strategy::kP2pStar, - /*mediums=*/{BLE, BLUETOOTH}, {}); + /*mediums=*/{BLE, BLUETOOTH}, + advertising_metadata_params.get()); analytics_recorder.OnConnectionEstablished(endpoint_id, BLUETOOTH, connection_token); analytics_recorder.OnOutgoingPayloadStarted( @@ -1038,8 +1087,11 @@ TEST(AnalyticsRecorderTest, UpgradeAttemptWorks) { AnalyticsRecorder analytics_recorder(&event_logger, /*no_record_time_millis=*/true); + auto advertising_metadata_params = + analytics_recorder.BuildAdvertisingMetadataParams(); analytics_recorder.OnStartAdvertising(connections::Strategy::kP2pStar, - /*mediums=*/{BLE, BLUETOOTH}, {}); + /*mediums=*/{BLE, BLUETOOTH}, + advertising_metadata_params.get()); analytics_recorder.OnBandwidthUpgradeStarted(endpoint_id, BLE, WIFI_LAN, INCOMING, connection_token); @@ -1187,8 +1239,11 @@ TEST(AnalyticsRecorderTest, SetErrorCodeFieldsCorrectly) { AnalyticsRecorder analytics_recorder(&event_logger, /*no_record_time_millis=*/true); + auto discovery_metadata_params = + analytics_recorder.BuildDiscoveryMetadataParams(); analytics_recorder.OnStartDiscovery(connections::Strategy::kP2pStar, - /*mediums=*/{WEB_RTC}, {}); + /*mediums=*/{WEB_RTC}, + discovery_metadata_params.get()); ErrorCodeParams error_code_params = ErrorCodeRecorder::BuildErrorCodeParams( WEB_RTC, DISCONNECT, DISCONNECT_NETWORK_FAILED, @@ -1215,8 +1270,11 @@ TEST(AnalyticsRecorderTest, SetErrorCodeFieldsCorrectlyForUnknownDescription) { AnalyticsRecorder analytics_recorder(&event_logger, /*no_record_time_millis=*/true); + auto discovery_metadata_params = + analytics_recorder.BuildDiscoveryMetadataParams(); analytics_recorder.OnStartDiscovery(connections::Strategy::kP2pStar, - /*mediums=*/{BLUETOOTH}, {}); + /*mediums=*/{BLUETOOTH}, + discovery_metadata_params.get()); ErrorCodeParams error_code_params; // Skip setting error_code_params.description @@ -1246,8 +1304,11 @@ TEST(AnalyticsRecorderTest, SetErrorCodeFieldsCorrectlyForCommonError) { AnalyticsRecorder analytics_recorder(&event_logger, /*no_record_time_millis=*/true); + auto discovery_metadata_params = + analytics_recorder.BuildDiscoveryMetadataParams(); analytics_recorder.OnStartDiscovery(connections::Strategy::kP2pStar, - /*mediums=*/{BLUETOOTH}, {}); + /*mediums=*/{BLUETOOTH}, + discovery_metadata_params.get()); ErrorCodeParams error_code_params = ErrorCodeRecorder::BuildErrorCodeParams( BLUETOOTH, START_DISCOVERING, INVALID_PARAMETER, @@ -1376,8 +1437,11 @@ TEST(AnalyticsRecorderTest, AnalyticsRecorder analytics_recorder(&event_logger, /*no_record_time_millis=*/true); + auto advertising_metadata_params = + analytics_recorder.BuildAdvertisingMetadataParams(); analytics_recorder.OnStartAdvertising(connections::Strategy::kP2pStar, - /*mediums=*/{BLE, BLUETOOTH}, {}); + /*mediums=*/{BLE, BLUETOOTH}, + advertising_metadata_params.get()); analytics_recorder.OnConnectionRequestReceived(endpoint_id_0); analytics_recorder.OnLocalEndpointAccepted(endpoint_id_0); analytics_recorder.OnRemoteEndpointAccepted(endpoint_id_0); @@ -1481,8 +1545,11 @@ TEST(AnalyticsRecorderTest, AnalyticsRecorder analytics_recorder(&event_logger, /*no_record_time_millis=*/true); + auto discovery_metadata_params = + analytics_recorder.BuildDiscoveryMetadataParams(); analytics_recorder.OnStartDiscovery(connections::Strategy::kP2pStar, - /*mediums=*/{BLE, BLUETOOTH}, {}); + /*mediums=*/{BLE, BLUETOOTH}, + discovery_metadata_params.get()); analytics_recorder.OnConnectionRequestSent(endpoint_id_0); analytics_recorder.OnLocalEndpointAccepted(endpoint_id_0); @@ -1589,7 +1656,10 @@ TEST(AnalyticsRecorderTest, ClearcActiveConnectionsAfterSessionWasLogged) { AnalyticsRecorder analytics_recorder(&event_logger, /*no_record_time_millis=*/true); - analytics_recorder.OnStartAdvertising(strategy, mediums, {}); + auto advertising_metadata_params = + analytics_recorder.BuildAdvertisingMetadataParams(); + analytics_recorder.OnStartAdvertising(strategy, mediums, + advertising_metadata_params.get()); analytics_recorder.OnConnectionEstablished(endpoint_id, BLUETOOTH, connection_token); @@ -1696,8 +1766,11 @@ TEST(AnalyticsRecorderTest, AnalyticsRecorder analytics_recorder(&event_logger, /*no_record_time_millis=*/true); + auto advertising_metadata_params = + analytics_recorder.BuildAdvertisingMetadataParams(); analytics_recorder.OnStartAdvertising(connections::Strategy::kP2pStar, - /*mediums=*/{BLE, BLUETOOTH}, {}); + /*mediums=*/{BLE, BLUETOOTH}, + advertising_metadata_params.get()); analytics_recorder.OnBandwidthUpgradeStarted(endpoint_id, BLE, WIFI_LAN, INCOMING, connection_token); @@ -1867,8 +1940,11 @@ TEST(AnalyticsRecorderTest, AnalyticsRecorder analytics_recorder(&event_logger, /*no_record_time_millis=*/true); + auto advertising_metadata_params = + analytics_recorder.BuildAdvertisingMetadataParams(); analytics_recorder.OnStartAdvertising(connections::Strategy::kP2pStar, - /*mediums=*/{BLUETOOTH}, {}); + /*mediums=*/{BLUETOOTH}, + advertising_metadata_params.get()); analytics_recorder.OnStopAdvertising(); // LogSession @@ -1891,7 +1967,9 @@ TEST(AnalyticsRecorderTest, // LogSession again CountDownLatch new_client_session_done_latch(1); event_logger.SetClientSessionDoneLatch(new_client_session_done_latch); - analytics_recorder.OnStartAdvertising(strategy, /*mediums=*/{BLUETOOTH}, {}); + + analytics_recorder.OnStartAdvertising(strategy, /*mediums=*/{BLUETOOTH}, + advertising_metadata_params.get()); analytics_recorder.OnStopAdvertising(); analytics_recorder.LogSession(); @@ -1912,8 +1990,11 @@ TEST(AnalyticsRecorderTest, // Via OnStartAdvertising, current_strategy_session_is set in // UpdateStrategySessionLocked. + auto advertising_metadata_params = + analytics_recorder.BuildAdvertisingMetadataParams(); analytics_recorder.OnStartAdvertising(connections::Strategy::kP2pStar, - /*mediums=*/{BLE, BLUETOOTH}, {}); + /*mediums=*/{BLE, BLUETOOTH}, + advertising_metadata_params.get()); analytics_recorder.OnStopAdvertising(); // LogSession @@ -1949,8 +2030,8 @@ TEST(AnalyticsRecorderTest, new_start_client_session_done_latch.Await(kDefaultTimeout).result()); // LogSession again - // - if current_strategy_session_ is reset, the same strategy_session_proto - // will be logged. + // - if current_strategy_session_ is reset, the same + // strategy_session_proto will be logged. CountDownLatch new_client_session_done_latch(1); event_logger.SetClientSessionDoneLatch(new_client_session_done_latch); analytics_recorder.LogSession(); @@ -1968,9 +2049,12 @@ TEST(AnalyticsRecorderTest, AnalyticsRecorder analytics_recorder(&event_logger, /*no_record_time_millis=*/true); - analytics_recorder.OnStartAdvertising(connections::Strategy::kP2pStar, - /*mediums=*/{BLUETOOTH}, - {}); // set current_advertising_phase_ + auto advertising_metadata_params = + analytics_recorder.BuildAdvertisingMetadataParams(); + analytics_recorder.OnStartAdvertising( + connections::Strategy::kP2pStar, + /*mediums=*/{BLUETOOTH}, + advertising_metadata_params.get()); // set current_advertising_phase_ analytics_recorder.OnStopAdvertising(); // LogSession @@ -2049,10 +2133,13 @@ TEST(AnalyticsRecorderTest, AnalyticsRecorder analytics_recorder(&event_logger, /*no_record_time_millis=*/true); + auto discovery_metadata_params = + analytics_recorder.BuildDiscoveryMetadataParams( + /*is_extended_advertisement_supported*/ true, + /*connected_ap_frequency*/ 1, /*is_nfc_available=*/false); analytics_recorder.OnStartDiscovery( - strategy, {BLUETOOTH}, {}, /*is_extended_advertisement_supported=*/true, - /*connected_ap_frequency=*/1, - /*is_nfc_available=*/false); // set current_discovery_phase_ + strategy, {BLUETOOTH}, + discovery_metadata_params.get()); // set current_discovery_phase_ analytics_recorder.OnStopDiscovery(); analytics_recorder.OnEndpointFound(BLUETOOTH); @@ -2136,8 +2223,11 @@ TEST(AnalyticsRecorderOnConnectionClosedTest, // via OnStartAdvertising, current_strategy_session_ is set in // UpdateStrategySessionLocked. + auto advertising_metadata_params = + analytics_recorder.BuildAdvertisingMetadataParams(); analytics_recorder.OnStartAdvertising(connections::Strategy::kP2pStar, - /*mediums=*/{BLE, BLUETOOTH}, {}); + /*mediums=*/{BLE, BLUETOOTH}, + advertising_metadata_params.get()); analytics_recorder.OnStopAdvertising(); // LogSession diff --git a/connections/implementation/analytics/discovery_metadata_params.h b/connections/implementation/analytics/discovery_metadata_params.h new file mode 100644 index 00000000..6442b03c --- /dev/null +++ b/connections/implementation/analytics/discovery_metadata_params.h @@ -0,0 +1,36 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ANALYTICS_DISCOVERY_METADATA_PARAMS_H_ +#define ANALYTICS_DISCOVERY_METADATA_PARAMS_H_ + +#include + +#include "internal/proto/analytics/connections_log.pb.h" + +namespace nearby { + +// A struct to construct DiscoveryMetadata for the analytics recorder. +struct DiscoveryMetadataParams { + bool is_extended_advertisement_supported = false; + int connected_ap_frequency = 0; + bool is_nfc_available = false; + std::vector + operation_result_with_mediums = {}; +}; + +} // namespace nearby + +#endif // ANALYTICS_DISCOVERY_METADATA_PARAMS_H_ diff --git a/connections/implementation/client_proxy.cc b/connections/implementation/client_proxy.cc index d4a29107..7f520101 100644 --- a/connections/implementation/client_proxy.cc +++ b/connections/implementation/client_proxy.cc @@ -35,7 +35,9 @@ #include "connections/advertising_options.h" #include "connections/connection_options.h" #include "connections/discovery_options.h" +#include "connections/implementation/analytics/advertising_metadata_params.h" #include "connections/implementation/analytics/analytics_recorder.h" +#include "connections/implementation/analytics/discovery_metadata_params.h" #include "connections/implementation/flags/nearby_connections_feature_flags.h" #include "connections/listeners.h" #include "connections/medium_selector.h" @@ -240,9 +242,12 @@ void ClientProxy::StartedAdvertising( const std::vector medium_vector( mediums.begin(), mediums.end()); + std::unique_ptr advertising_metadata_params; + advertising_metadata_params = + GetAnalyticsRecorder().BuildAdvertisingMetadataParams(); // TODO(edwinwu): Implement to pass real values for OperatoinResultWithMedium. - analytics_recorder_->OnStartAdvertising(strategy, medium_vector, {}, false, - 0); + analytics_recorder_->OnStartAdvertising(strategy, medium_vector, + advertising_metadata_params.get()); } void ClientProxy::StoppedAdvertising() { @@ -368,8 +373,13 @@ void ClientProxy::StartedDiscovery( const std::vector medium_vector( mediums.begin(), mediums.end()); + std::unique_ptr discovery_metadata_params; + discovery_metadata_params = + GetAnalyticsRecorder().BuildDiscoveryMetadataParams(); // TODO(edwinwu): Implement to pass real values for OperatoinResultWithMedium. - analytics_recorder_->OnStartDiscovery(strategy, medium_vector, {}, false, 0); + analytics_recorder_->OnStartDiscovery( + strategy, medium_vector, + discovery_metadata_params.get()); } void ClientProxy::StoppedDiscovery() {