diff options
-rw-r--r-- | system/bta/Android.bp | 1 | ||||
-rw-r--r-- | system/bta/le_audio/broadcaster/broadcaster.cc | 3 | ||||
-rw-r--r-- | system/bta/le_audio/metrics_collector.cc | 29 | ||||
-rw-r--r-- | system/bta/le_audio/metrics_collector.h | 15 | ||||
-rw-r--r-- | system/bta/le_audio/metrics_collector_linux.cc | 2 | ||||
-rw-r--r-- | system/bta/le_audio/metrics_collector_test.cc | 17 | ||||
-rw-r--r-- | system/common/metrics.cc | 7 | ||||
-rw-r--r-- | system/common/metrics.h | 2 | ||||
-rw-r--r-- | system/common/metrics_linux.cc | 2 | ||||
-rw-r--r-- | system/test/mock/mock_common_metrics.cc | 4 |
10 files changed, 72 insertions, 10 deletions
diff --git a/system/bta/Android.bp b/system/bta/Android.bp index f9640eb173..487809e435 100644 --- a/system/bta/Android.bp +++ b/system/bta/Android.bp @@ -773,6 +773,7 @@ cc_test { "le_audio/content_control_id_keeper.cc", "le_audio/client_audio.cc", "le_audio/le_audio_types.cc", + "le_audio/metrics_collector_linux.cc", "le_audio/mock_iso_manager.cc", "test/common/mock_controller.cc", "le_audio/mock_codec_manager.cc", diff --git a/system/bta/le_audio/broadcaster/broadcaster.cc b/system/bta/le_audio/broadcaster/broadcaster.cc index 605f485aab..7a6d836433 100644 --- a/system/bta/le_audio/broadcaster/broadcaster.cc +++ b/system/bta/le_audio/broadcaster/broadcaster.cc @@ -22,6 +22,7 @@ #include "bta/le_audio/broadcaster/state_machine.h" #include "bta/le_audio/content_control_id_keeper.h" #include "bta/le_audio/le_audio_types.h" +#include "bta/le_audio/metrics_collector.h" #include "device/include/controller.h" #include "embdrv/lc3/include/lc3.h" #include "gd/common/strings.h" @@ -329,6 +330,7 @@ class LeAudioBroadcasterImpl : public LeAudioBroadcaster, public BigCallbacks { broadcasts_[broadcast_id]->ProcessMessage( BroadcastStateMachine::Message::START, nullptr); + le_audio::MetricsCollector::Get()->OnBroadcastStateChanged(true); } else { LOG_ERROR("No such broadcast_id=%d", broadcast_id); } @@ -346,6 +348,7 @@ class LeAudioBroadcasterImpl : public LeAudioBroadcaster, public BigCallbacks { broadcasts_[broadcast_id]->SetMuted(true); broadcasts_[broadcast_id]->ProcessMessage( BroadcastStateMachine::Message::STOP, nullptr); + le_audio::MetricsCollector::Get()->OnBroadcastStateChanged(false); } void DestroyAudioBroadcast(uint32_t broadcast_id) override { diff --git a/system/bta/le_audio/metrics_collector.cc b/system/bta/le_audio/metrics_collector.cc index 4a00d2da84..aed66c006e 100644 --- a/system/bta/le_audio/metrics_collector.cc +++ b/system/bta/le_audio/metrics_collector.cc @@ -16,7 +16,6 @@ #include "metrics_collector.h" -#include <chrono> #include <memory> #include <vector> @@ -24,17 +23,15 @@ namespace le_audio { -using ClockTimePoint = - std::chrono::time_point<std::chrono::high_resolution_clock>; using bluetooth::le_audio::ConnectionState; using le_audio::types::LeAudioContextType; -const static ClockTimePoint kInvalidTimePoint{}; +const static metrics::ClockTimePoint kInvalidTimePoint{}; MetricsCollector* MetricsCollector::instance = nullptr; -inline int64_t get_timedelta_nanos(const ClockTimePoint& t1, - const ClockTimePoint& t2) { +inline int64_t get_timedelta_nanos(const metrics::ClockTimePoint& t1, + const metrics::ClockTimePoint& t2) { if (t1 == kInvalidTimePoint || t2 == kInvalidTimePoint) { return -1; } @@ -79,9 +76,9 @@ inline int32_t to_atom_context_type(const LeAudioContextType stack_type) { class DeviceMetrics { public: RawAddress address_; - ClockTimePoint connecting_timepoint_ = kInvalidTimePoint; - ClockTimePoint connected_timepoint_ = kInvalidTimePoint; - ClockTimePoint disconnected_timepoint_ = kInvalidTimePoint; + metrics::ClockTimePoint connecting_timepoint_ = kInvalidTimePoint; + metrics::ClockTimePoint connected_timepoint_ = kInvalidTimePoint; + metrics::ClockTimePoint disconnected_timepoint_ = kInvalidTimePoint; int32_t connection_status_ = 0; int32_t disconnection_status_ = 0; @@ -114,7 +111,7 @@ class GroupMetricsImpl : public GroupMetrics { int32_t group_size_; std::vector<std::unique_ptr<DeviceMetrics>> device_metrics_; std::unordered_map<RawAddress, DeviceMetrics*> opened_devices_; - ClockTimePoint beginning_timepoint_; + metrics::ClockTimePoint beginning_timepoint_; std::vector<int64_t> streaming_offset_nanos_; std::vector<int64_t> streaming_duration_nanos_; std::vector<int32_t> streaming_context_type_; @@ -283,6 +280,18 @@ void MetricsCollector::OnStreamEnded(int32_t group_id) { } } +void MetricsCollector::OnBroadcastStateChanged(bool started) { + if (started) { + broadcast_beginning_timepoint_ = std::chrono::high_resolution_clock::now(); + } else { + auto broadcast_ending_timepoint_ = + std::chrono::high_resolution_clock::now(); + bluetooth::common::LogLeAudioBroadcastSessionReported(get_timedelta_nanos( + broadcast_beginning_timepoint_, broadcast_ending_timepoint_)); + broadcast_beginning_timepoint_ = kInvalidTimePoint; + } +} + void MetricsCollector::Flush() { LOG(INFO) << __func__; for (auto& p : opened_groups_) { diff --git a/system/bta/le_audio/metrics_collector.h b/system/bta/le_audio/metrics_collector.h index f988364734..1e235dfdc4 100644 --- a/system/bta/le_audio/metrics_collector.h +++ b/system/bta/le_audio/metrics_collector.h @@ -18,6 +18,7 @@ #include <hardware/bt_le_audio.h> +#include <chrono> #include <cstdint> #include <memory> #include <unordered_map> @@ -27,6 +28,11 @@ namespace le_audio { +namespace metrics { +using ClockTimePoint = + std::chrono::time_point<std::chrono::high_resolution_clock>; +} + enum ConnectionStatus : int32_t { UNKNOWN = 0, SUCCESS = 1, @@ -117,6 +123,13 @@ class MetricsCollector { void OnStreamEnded(int32_t group_id); /** + * When there is a change in Bluetooth LE Audio broadcast state + * + * @param started if broadcast streaming is started. + */ + void OnBroadcastStateChanged(bool started); + + /** * Flush all log to statsd * * @param group_id Group ID of the associated stream. @@ -131,6 +144,8 @@ class MetricsCollector { std::unordered_map<int32_t, std::unique_ptr<GroupMetrics>> opened_groups_; std::unordered_map<int32_t, int32_t> group_size_table_; + + metrics::ClockTimePoint broadcast_beginning_timepoint_; }; } // namespace le_audio diff --git a/system/bta/le_audio/metrics_collector_linux.cc b/system/bta/le_audio/metrics_collector_linux.cc index 2ac63a567b..cb36fbec2e 100644 --- a/system/bta/le_audio/metrics_collector_linux.cc +++ b/system/bta/le_audio/metrics_collector_linux.cc @@ -40,6 +40,8 @@ void MetricsCollector::OnStreamStarted( void MetricsCollector::OnStreamEnded(int32_t group_id) {} +void MetricsCollector::OnBroadcastStateChanged(bool started) {} + void MetricsCollector::Flush() {} } // namespace le_audio diff --git a/system/bta/le_audio/metrics_collector_test.cc b/system/bta/le_audio/metrics_collector_test.cc index ee295d56d7..49c13bf05d 100644 --- a/system/bta/le_audio/metrics_collector_test.cc +++ b/system/bta/le_audio/metrics_collector_test.cc @@ -44,6 +44,7 @@ int log_count = 0; int32_t last_group_size; int32_t last_group_metric_id; int64_t last_connection_duration_nanos; +int64_t last_broadcast_duration_nanos; std::vector<int64_t> last_device_connecting_offset_nanos; std::vector<int64_t> last_device_connected_offset_nanos; std::vector<int64_t> last_device_connection_duration_nanos; @@ -84,6 +85,10 @@ void LogLeAudioConnectionSessionReported( last_streaming_context_type = streaming_context_type; } +void LogLeAudioBroadcastSessionReported(int64_t duration_nanos) { + last_broadcast_duration_nanos = duration_nanos; +} + } // namespace common } // namespace bluetooth @@ -111,6 +116,7 @@ class MetricsCollectorTest : public Test { log_count = 0; last_group_size = 0; last_group_metric_id = 0; + last_broadcast_duration_nanos = 0; last_connection_duration_nanos = 0; last_device_connecting_offset_nanos = {}; last_device_connected_offset_nanos = {}; @@ -367,4 +373,15 @@ TEST_F(MetricsCollectorTest, StreamingSessions) { static_cast<int32_t>(LeAudioMetricsContextType::COMMUNICATION)); } +TEST_F(MetricsCollectorTest, BroadastSessions) { + last_broadcast_duration_nanos = 0; + collector->OnBroadcastStateChanged(true); + collector->OnBroadcastStateChanged(false); + ASSERT_GT(last_broadcast_duration_nanos, 0); + last_broadcast_duration_nanos = 0; + collector->OnBroadcastStateChanged(true); + collector->OnBroadcastStateChanged(false); + ASSERT_GT(last_broadcast_duration_nanos, 0); +} + } // namespace le_audio
\ No newline at end of file diff --git a/system/common/metrics.cc b/system/common/metrics.cc index 0664186cac..baf838b0c4 100644 --- a/system/common/metrics.cc +++ b/system/common/metrics.cc @@ -962,6 +962,13 @@ void LogLeAudioConnectionSessionReported( } } +void LogLeAudioBroadcastSessionReported(int64_t duration_nanos) { + int ret = stats_write(LE_AUDIO_BROADCAST_SESSION_REPORTED, duration_nanos); + if (ret < 0) { + LOG(WARNING) << __func__ << ": failed for duration=" << duration_nanos; + } +} + } // namespace common } // namespace bluetooth diff --git a/system/common/metrics.h b/system/common/metrics.h index 9d33e1b81f..a0a34b5945 100644 --- a/system/common/metrics.h +++ b/system/common/metrics.h @@ -518,6 +518,8 @@ void LogLeAudioConnectionSessionReported( std::vector<int64_t>& streaming_duration_nanos, std::vector<int32_t>& streaming_context_type); +void LogLeAudioBroadcastSessionReported(int64_t duration_nanos); + } // namespace common } // namespace bluetooth diff --git a/system/common/metrics_linux.cc b/system/common/metrics_linux.cc index fa8c6a0497..883a645e30 100644 --- a/system/common/metrics_linux.cc +++ b/system/common/metrics_linux.cc @@ -167,6 +167,8 @@ void LogLeAudioConnectionSessionReported( std::vector<int64_t>& streaming_duration_nanos, std::vector<int32_t>& streaming_context_type) {} +void LogLeAudioBroadcastSessionReported(int64_t duration_nanos) {} + } // namespace common } // namespace bluetooth diff --git a/system/test/mock/mock_common_metrics.cc b/system/test/mock/mock_common_metrics.cc index 766fec2747..cf71750734 100644 --- a/system/test/mock/mock_common_metrics.cc +++ b/system/test/mock/mock_common_metrics.cc @@ -219,5 +219,9 @@ void LogLeAudioConnectionSessionReported( mock_function_count_map[__func__]++; } +void LogLeAudioBroadcastSessionReported(int64_t duration_nanos) { + mock_function_count_map[__func__]++; +} + } // namespace common } // namespace bluetooth |