BluetoothMetrics: Bypass counter metrics caching for profile connection failures to get timestamp
Test: atest BluetoothInstrumentationTests
Bug: 193268714
Change-Id: I0bdbf89ddda03f27acda1f7f6d3112eb40393996
diff --git a/android/app/src/com/android/bluetooth/btservice/MetricsLogger.java b/android/app/src/com/android/bluetooth/btservice/MetricsLogger.java
index 12a4f81..c3f5b65 100644
--- a/android/app/src/com/android/bluetooth/btservice/MetricsLogger.java
+++ b/android/app/src/com/android/bluetooth/btservice/MetricsLogger.java
@@ -97,7 +97,7 @@
return true;
}
- public boolean count(int key, long count) {
+ public boolean cacheCount(int key, long count) {
if (!mInitialized) {
Log.w(TAG, "MetricsLogger isn't initialized");
return false;
@@ -167,9 +167,18 @@
getDrainIntent());
}
- protected void writeCounter(int key, long count) {
+ public boolean count(int key, long count) {
+ if (!mInitialized) {
+ Log.w(TAG, "MetricsLogger isn't initialized");
+ return false;
+ }
+ if (count <= 0) {
+ Log.w(TAG, "count is not larger than 0. count: " + count + " key: " + key);
+ return false;
+ }
BluetoothStatsLog.write(
BluetoothStatsLog.BLUETOOTH_CODE_PATH_COUNTER, key, count);
+ return true;
}
protected void drainBufferedCounters() {
@@ -177,7 +186,7 @@
synchronized (mLock) {
// send mCounters to statsd
for (int key : mCounters.keySet()) {
- writeCounter(key, mCounters.get(key));
+ count(key, mCounters.get(key));
}
mCounters.clear();
}
diff --git a/android/app/tests/unit/src/com/android/bluetooth/btservice/MetricsLoggerTest.java b/android/app/tests/unit/src/com/android/bluetooth/btservice/MetricsLoggerTest.java
index 9566ef9..851e998 100644
--- a/android/app/tests/unit/src/com/android/bluetooth/btservice/MetricsLoggerTest.java
+++ b/android/app/tests/unit/src/com/android/bluetooth/btservice/MetricsLoggerTest.java
@@ -51,8 +51,9 @@
public HashMap<Integer, Long> mTestableCounters = new HashMap<>();
@Override
- protected void writeCounter(int key, long count) {
+ public boolean count(int key, long count) {
mTestableCounters.put(key, count);
+ return true;
}
@Override
@@ -141,18 +142,18 @@
@Test
public void testAddAndSendCountersNormalCases() {
mTestableMetricsLogger.init(mMockAdapterService);
- mTestableMetricsLogger.count(1, 10);
- mTestableMetricsLogger.count(1, 10);
- mTestableMetricsLogger.count(2, 5);
+ mTestableMetricsLogger.cacheCount(1, 10);
+ mTestableMetricsLogger.cacheCount(1, 10);
+ mTestableMetricsLogger.cacheCount(2, 5);
mTestableMetricsLogger.drainBufferedCounters();
Assert.assertEquals(20L, mTestableMetricsLogger.mTestableCounters.get(1).longValue());
Assert.assertEquals(5L, mTestableMetricsLogger.mTestableCounters.get(2).longValue());
- mTestableMetricsLogger.count(1, 3);
- mTestableMetricsLogger.count(2, 5);
- mTestableMetricsLogger.count(2, 5);
- mTestableMetricsLogger.count(3, 1);
+ mTestableMetricsLogger.cacheCount(1, 3);
+ mTestableMetricsLogger.cacheCount(2, 5);
+ mTestableMetricsLogger.cacheCount(2, 5);
+ mTestableMetricsLogger.cacheCount(3, 1);
mTestableMetricsLogger.drainBufferedCounters();
Assert.assertEquals(
3L, mTestableMetricsLogger.mTestableCounters.get(1).longValue());
@@ -166,10 +167,10 @@
public void testAddAndSendCountersCornerCases() {
mTestableMetricsLogger.init(mMockAdapterService);
Assert.assertTrue(mTestableMetricsLogger.isInitialized());
- mTestableMetricsLogger.count(1, -1);
- mTestableMetricsLogger.count(3, 0);
- mTestableMetricsLogger.count(2, 10);
- mTestableMetricsLogger.count(2, Long.MAX_VALUE - 8L);
+ mTestableMetricsLogger.cacheCount(1, -1);
+ mTestableMetricsLogger.cacheCount(3, 0);
+ mTestableMetricsLogger.cacheCount(2, 10);
+ mTestableMetricsLogger.cacheCount(2, Long.MAX_VALUE - 8L);
mTestableMetricsLogger.drainBufferedCounters();
Assert.assertFalse(mTestableMetricsLogger.mTestableCounters.containsKey(1));
@@ -181,9 +182,9 @@
@Test
public void testMetricsLoggerClose() {
mTestableMetricsLogger.init(mMockAdapterService);
- mTestableMetricsLogger.count(1, 1);
- mTestableMetricsLogger.count(2, 10);
- mTestableMetricsLogger.count(2, Long.MAX_VALUE);
+ mTestableMetricsLogger.cacheCount(1, 1);
+ mTestableMetricsLogger.cacheCount(2, 10);
+ mTestableMetricsLogger.cacheCount(2, Long.MAX_VALUE);
mTestableMetricsLogger.close();
Assert.assertEquals(
@@ -194,7 +195,7 @@
@Test
public void testMetricsLoggerNotInit() {
- Assert.assertFalse(mTestableMetricsLogger.count(1, 1));
+ Assert.assertFalse(mTestableMetricsLogger.cacheCount(1, 1));
mTestableMetricsLogger.drainBufferedCounters();
Assert.assertFalse(mTestableMetricsLogger.mTestableCounters.containsKey(1));
Assert.assertFalse(mTestableMetricsLogger.close());
diff --git a/system/gd/metrics/counter_metrics.cc b/system/gd/metrics/counter_metrics.cc
index 4474b39..820990e 100644
--- a/system/gd/metrics/counter_metrics.cc
+++ b/system/gd/metrics/counter_metrics.cc
@@ -49,7 +49,7 @@
LOG_INFO("Counter metrics canceled");
}
-bool CounterMetrics::Count(int32_t key, int64_t count) {
+bool CounterMetrics::CacheCount(int32_t key, int64_t count) {
if (!IsInitialized()) {
LOG_WARN("Counter metrics isn't initialized");
return false;
@@ -73,8 +73,17 @@
return true;
}
-void CounterMetrics::WriteCounter(int32_t key, int64_t count) {
+bool CounterMetrics::Count(int32_t key, int64_t count) {
+ if (!IsInitialized()) {
+ LOG_WARN("Counter metrics isn't initialized");
+ return false;
+ }
+ if (count <= 0) {
+ LOG_WARN("count is not larger than 0. count: %s, key: %d", std::to_string(count).c_str(), key);
+ return false;
+ }
os::LogMetricBluetoothCodePathCounterMetrics(key, count);
+ return true;
}
void CounterMetrics::DrainBufferedCounters() {
@@ -85,7 +94,7 @@
std::lock_guard<std::mutex> lock(mutex_);
LOG_INFO("Draining buffered counters");
for (auto const& pair : counters_) {
- WriteCounter(pair.first, pair.second);
+ Count(pair.first, pair.second);
}
counters_.clear();
}
diff --git a/system/gd/metrics/counter_metrics.h b/system/gd/metrics/counter_metrics.h
index c21e9be..8148e63e 100644
--- a/system/gd/metrics/counter_metrics.h
+++ b/system/gd/metrics/counter_metrics.h
@@ -25,7 +25,8 @@
class CounterMetrics : public bluetooth::Module {
public:
- bool Count(int32_t key, int64_t value);
+ bool CacheCount(int32_t key, int64_t value);
+ virtual bool Count(int32_t key, int64_t count);
void Stop() override;
static const ModuleFactory Factory;
@@ -36,7 +37,6 @@
return std::string("BluetoothCounterMetrics");
}
void DrainBufferedCounters();
- virtual void WriteCounter(int32_t key, int64_t count);
virtual bool IsInitialized() {
return initialized_;
}
diff --git a/system/gd/metrics/counter_metrics_unittest.cc b/system/gd/metrics/counter_metrics_unittest.cc
index d9d89a2..f09a6d9 100644
--- a/system/gd/metrics/counter_metrics_unittest.cc
+++ b/system/gd/metrics/counter_metrics_unittest.cc
@@ -33,8 +33,9 @@
}
std::unordered_map<int32_t, int64_t> test_counters_;
private:
- void WriteCounter(int32_t key, int64_t count) override {
+ bool Count(int32_t key, int64_t count) override {
test_counters_[key] = count;
+ return true;
}
bool IsInitialized() override {
return true;
@@ -44,26 +45,26 @@
};
TEST_F(CounterMetricsTest, normal_case) {
- ASSERT_TRUE(testable_counter_metrics_.Count(1, 2));
- ASSERT_TRUE(testable_counter_metrics_.Count(1, 3));
- ASSERT_TRUE(testable_counter_metrics_.Count(2, 4));
+ ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 2));
+ ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 3));
+ ASSERT_TRUE(testable_counter_metrics_.CacheCount(2, 4));
testable_counter_metrics_.DrainBuffer();
ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 5);
ASSERT_EQ(testable_counter_metrics_.test_counters_[2], 4);
}
TEST_F(CounterMetricsTest, multiple_drain) {
- ASSERT_TRUE(testable_counter_metrics_.Count(1, 2));
- ASSERT_TRUE(testable_counter_metrics_.Count(1, 3));
- ASSERT_TRUE(testable_counter_metrics_.Count(2, 4));
+ ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 2));
+ ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 3));
+ ASSERT_TRUE(testable_counter_metrics_.CacheCount(2, 4));
testable_counter_metrics_.DrainBuffer();
ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 5);
ASSERT_EQ(testable_counter_metrics_.test_counters_[2], 4);
testable_counter_metrics_.test_counters_.clear();
- ASSERT_TRUE(testable_counter_metrics_.Count(1, 20));
- ASSERT_TRUE(testable_counter_metrics_.Count(1, 30));
- ASSERT_TRUE(testable_counter_metrics_.Count(2, 40));
- ASSERT_TRUE(testable_counter_metrics_.Count(3, 100));
+ ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 20));
+ ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 30));
+ ASSERT_TRUE(testable_counter_metrics_.CacheCount(2, 40));
+ ASSERT_TRUE(testable_counter_metrics_.CacheCount(3, 100));
testable_counter_metrics_.DrainBuffer();
ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 50);
ASSERT_EQ(testable_counter_metrics_.test_counters_[2], 40);
@@ -71,17 +72,17 @@
}
TEST_F(CounterMetricsTest, overflow) {
- ASSERT_TRUE(testable_counter_metrics_.Count(1, LLONG_MAX));
- ASSERT_FALSE(testable_counter_metrics_.Count(1, 1));
- ASSERT_FALSE(testable_counter_metrics_.Count(1, 2));
+ ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, LLONG_MAX));
+ ASSERT_FALSE(testable_counter_metrics_.CacheCount(1, 1));
+ ASSERT_FALSE(testable_counter_metrics_.CacheCount(1, 2));
testable_counter_metrics_.DrainBuffer();
ASSERT_EQ(testable_counter_metrics_.test_counters_[1], LLONG_MAX);
}
TEST_F(CounterMetricsTest, non_positive) {
- ASSERT_TRUE(testable_counter_metrics_.Count(1, 5));
- ASSERT_FALSE(testable_counter_metrics_.Count(1, 0));
- ASSERT_FALSE(testable_counter_metrics_.Count(1, -1));
+ ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 5));
+ ASSERT_FALSE(testable_counter_metrics_.CacheCount(1, 0));
+ ASSERT_FALSE(testable_counter_metrics_.CacheCount(1, -1));
testable_counter_metrics_.DrainBuffer();
ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 5);
}