summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--system/bta/Android.bp1
-rw-r--r--system/bta/le_audio/broadcaster/broadcaster.cc3
-rw-r--r--system/bta/le_audio/metrics_collector.cc29
-rw-r--r--system/bta/le_audio/metrics_collector.h15
-rw-r--r--system/bta/le_audio/metrics_collector_linux.cc2
-rw-r--r--system/bta/le_audio/metrics_collector_test.cc17
-rw-r--r--system/common/metrics.cc7
-rw-r--r--system/common/metrics.h2
-rw-r--r--system/common/metrics_linux.cc2
-rw-r--r--system/test/mock/mock_common_metrics.cc4
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