Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1a8c4650 authored by Chen Chen's avatar Chen Chen Committed by Automerger Merge Worker
Browse files

Merge "BluetoothMetrics: Bypass counter metrics caching for profile connection...

Merge "BluetoothMetrics: Bypass counter metrics caching for profile connection failures to get timestamp" am: 0c022038

Original change: https://android-review.googlesource.com/c/platform/packages/modules/Bluetooth/+/2212996



Change-Id: I0e662cbf96629244c2ff9753a8fc674610f89633
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents df989b75 0c022038
Loading
Loading
Loading
Loading
+12 −3
Original line number Original line Diff line number Diff line
@@ -97,7 +97,7 @@ public class MetricsLogger {
        return true;
        return true;
    }
    }


    public boolean count(int key, long count) {
    public boolean cacheCount(int key, long count) {
        if (!mInitialized) {
        if (!mInitialized) {
            Log.w(TAG, "MetricsLogger isn't initialized");
            Log.w(TAG, "MetricsLogger isn't initialized");
            return false;
            return false;
@@ -167,9 +167,18 @@ public class MetricsLogger {
                getDrainIntent());
                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.write(
                BluetoothStatsLog.BLUETOOTH_CODE_PATH_COUNTER, key, count);
                BluetoothStatsLog.BLUETOOTH_CODE_PATH_COUNTER, key, count);
        return true;
    }
    }


    protected void drainBufferedCounters() {
    protected void drainBufferedCounters() {
@@ -177,7 +186,7 @@ public class MetricsLogger {
        synchronized (mLock) {
        synchronized (mLock) {
            // send mCounters to statsd
            // send mCounters to statsd
            for (int key : mCounters.keySet()) {
            for (int key : mCounters.keySet()) {
                writeCounter(key, mCounters.get(key));
                count(key, mCounters.get(key));
            }
            }
            mCounters.clear();
            mCounters.clear();
        }
        }
+17 −16
Original line number Original line Diff line number Diff line
@@ -51,8 +51,9 @@ public class MetricsLoggerTest {
        public HashMap<Integer, Long> mTestableCounters = new HashMap<>();
        public HashMap<Integer, Long> mTestableCounters = new HashMap<>();


        @Override
        @Override
        protected void writeCounter(int key, long count) {
        public boolean count(int key, long count) {
            mTestableCounters.put(key, count);
            mTestableCounters.put(key, count);
          return true;
        }
        }


        @Override
        @Override
@@ -141,18 +142,18 @@ public class MetricsLoggerTest {
    @Test
    @Test
    public void testAddAndSendCountersNormalCases() {
    public void testAddAndSendCountersNormalCases() {
        mTestableMetricsLogger.init(mMockAdapterService);
        mTestableMetricsLogger.init(mMockAdapterService);
        mTestableMetricsLogger.count(1, 10);
        mTestableMetricsLogger.cacheCount(1, 10);
        mTestableMetricsLogger.count(1, 10);
        mTestableMetricsLogger.cacheCount(1, 10);
        mTestableMetricsLogger.count(2, 5);
        mTestableMetricsLogger.cacheCount(2, 5);
        mTestableMetricsLogger.drainBufferedCounters();
        mTestableMetricsLogger.drainBufferedCounters();


        Assert.assertEquals(20L, mTestableMetricsLogger.mTestableCounters.get(1).longValue());
        Assert.assertEquals(20L, mTestableMetricsLogger.mTestableCounters.get(1).longValue());
        Assert.assertEquals(5L, mTestableMetricsLogger.mTestableCounters.get(2).longValue());
        Assert.assertEquals(5L, mTestableMetricsLogger.mTestableCounters.get(2).longValue());


        mTestableMetricsLogger.count(1, 3);
        mTestableMetricsLogger.cacheCount(1, 3);
        mTestableMetricsLogger.count(2, 5);
        mTestableMetricsLogger.cacheCount(2, 5);
        mTestableMetricsLogger.count(2, 5);
        mTestableMetricsLogger.cacheCount(2, 5);
        mTestableMetricsLogger.count(3, 1);
        mTestableMetricsLogger.cacheCount(3, 1);
        mTestableMetricsLogger.drainBufferedCounters();
        mTestableMetricsLogger.drainBufferedCounters();
        Assert.assertEquals(
        Assert.assertEquals(
                3L, mTestableMetricsLogger.mTestableCounters.get(1).longValue());
                3L, mTestableMetricsLogger.mTestableCounters.get(1).longValue());
@@ -166,10 +167,10 @@ public class MetricsLoggerTest {
    public void testAddAndSendCountersCornerCases() {
    public void testAddAndSendCountersCornerCases() {
        mTestableMetricsLogger.init(mMockAdapterService);
        mTestableMetricsLogger.init(mMockAdapterService);
        Assert.assertTrue(mTestableMetricsLogger.isInitialized());
        Assert.assertTrue(mTestableMetricsLogger.isInitialized());
        mTestableMetricsLogger.count(1, -1);
        mTestableMetricsLogger.cacheCount(1, -1);
        mTestableMetricsLogger.count(3, 0);
        mTestableMetricsLogger.cacheCount(3, 0);
        mTestableMetricsLogger.count(2, 10);
        mTestableMetricsLogger.cacheCount(2, 10);
        mTestableMetricsLogger.count(2, Long.MAX_VALUE - 8L);
        mTestableMetricsLogger.cacheCount(2, Long.MAX_VALUE - 8L);
        mTestableMetricsLogger.drainBufferedCounters();
        mTestableMetricsLogger.drainBufferedCounters();


        Assert.assertFalse(mTestableMetricsLogger.mTestableCounters.containsKey(1));
        Assert.assertFalse(mTestableMetricsLogger.mTestableCounters.containsKey(1));
@@ -181,9 +182,9 @@ public class MetricsLoggerTest {
    @Test
    @Test
    public void testMetricsLoggerClose() {
    public void testMetricsLoggerClose() {
        mTestableMetricsLogger.init(mMockAdapterService);
        mTestableMetricsLogger.init(mMockAdapterService);
        mTestableMetricsLogger.count(1, 1);
        mTestableMetricsLogger.cacheCount(1, 1);
        mTestableMetricsLogger.count(2, 10);
        mTestableMetricsLogger.cacheCount(2, 10);
        mTestableMetricsLogger.count(2, Long.MAX_VALUE);
        mTestableMetricsLogger.cacheCount(2, Long.MAX_VALUE);
        mTestableMetricsLogger.close();
        mTestableMetricsLogger.close();


        Assert.assertEquals(
        Assert.assertEquals(
@@ -194,7 +195,7 @@ public class MetricsLoggerTest {


    @Test
    @Test
    public void testMetricsLoggerNotInit() {
    public void testMetricsLoggerNotInit() {
        Assert.assertFalse(mTestableMetricsLogger.count(1, 1));
        Assert.assertFalse(mTestableMetricsLogger.cacheCount(1, 1));
        mTestableMetricsLogger.drainBufferedCounters();
        mTestableMetricsLogger.drainBufferedCounters();
        Assert.assertFalse(mTestableMetricsLogger.mTestableCounters.containsKey(1));
        Assert.assertFalse(mTestableMetricsLogger.mTestableCounters.containsKey(1));
        Assert.assertFalse(mTestableMetricsLogger.close());
        Assert.assertFalse(mTestableMetricsLogger.close());
+12 −3
Original line number Original line Diff line number Diff line
@@ -49,7 +49,7 @@ void CounterMetrics::Stop() {
  LOG_INFO("Counter metrics canceled");
  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()) {
  if (!IsInitialized()) {
    LOG_WARN("Counter metrics isn't initialized");
    LOG_WARN("Counter metrics isn't initialized");
    return false;
    return false;
@@ -73,8 +73,17 @@ bool CounterMetrics::Count(int32_t key, int64_t count) {
  return true;
  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);
  os::LogMetricBluetoothCodePathCounterMetrics(key, count);
  return true;
}
}


void CounterMetrics::DrainBufferedCounters() {
void CounterMetrics::DrainBufferedCounters() {
@@ -85,7 +94,7 @@ void CounterMetrics::DrainBufferedCounters() {
  std::lock_guard<std::mutex> lock(mutex_);
  std::lock_guard<std::mutex> lock(mutex_);
  LOG_INFO("Draining buffered counters");
  LOG_INFO("Draining buffered counters");
  for (auto const& pair : counters_) {
  for (auto const& pair : counters_) {
    WriteCounter(pair.first, pair.second);
    Count(pair.first, pair.second);
  }
  }
  counters_.clear();
  counters_.clear();
}
}
+2 −2
Original line number Original line Diff line number Diff line
@@ -25,7 +25,8 @@ namespace metrics {


class CounterMetrics : public bluetooth::Module {
class CounterMetrics : public bluetooth::Module {
 public:
 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;
  void Stop() override;
  static const ModuleFactory Factory;
  static const ModuleFactory Factory;


@@ -36,7 +37,6 @@ class CounterMetrics : public bluetooth::Module {
    return std::string("BluetoothCounterMetrics");
    return std::string("BluetoothCounterMetrics");
  }
  }
  void DrainBufferedCounters();
  void DrainBufferedCounters();
  virtual void WriteCounter(int32_t key, int64_t count);
  virtual bool IsInitialized() {
  virtual bool IsInitialized() {
    return initialized_;
    return initialized_;
  }
  }
+18 −17
Original line number Original line Diff line number Diff line
@@ -33,8 +33,9 @@ class CounterMetricsTest : public ::testing::Test {
    }
    }
    std::unordered_map<int32_t, int64_t> test_counters_;
    std::unordered_map<int32_t, int64_t> test_counters_;
   private:
   private:
    void WriteCounter(int32_t key, int64_t count) override {
    bool Count(int32_t key, int64_t count) override {
      test_counters_[key] = count;
      test_counters_[key] = count;
      return true;
    }
    }
    bool IsInitialized() override {
    bool IsInitialized() override {
      return true;
      return true;
@@ -44,26 +45,26 @@ class CounterMetricsTest : public ::testing::Test {
};
};


TEST_F(CounterMetricsTest, normal_case) {
TEST_F(CounterMetricsTest, normal_case) {
  ASSERT_TRUE(testable_counter_metrics_.Count(1, 2));
  ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 2));
  ASSERT_TRUE(testable_counter_metrics_.Count(1, 3));
  ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 3));
  ASSERT_TRUE(testable_counter_metrics_.Count(2, 4));
  ASSERT_TRUE(testable_counter_metrics_.CacheCount(2, 4));
  testable_counter_metrics_.DrainBuffer();
  testable_counter_metrics_.DrainBuffer();
  ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 5);
  ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 5);
  ASSERT_EQ(testable_counter_metrics_.test_counters_[2], 4);
  ASSERT_EQ(testable_counter_metrics_.test_counters_[2], 4);
}
}


TEST_F(CounterMetricsTest, multiple_drain) {
TEST_F(CounterMetricsTest, multiple_drain) {
  ASSERT_TRUE(testable_counter_metrics_.Count(1, 2));
  ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 2));
  ASSERT_TRUE(testable_counter_metrics_.Count(1, 3));
  ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 3));
  ASSERT_TRUE(testable_counter_metrics_.Count(2, 4));
  ASSERT_TRUE(testable_counter_metrics_.CacheCount(2, 4));
  testable_counter_metrics_.DrainBuffer();
  testable_counter_metrics_.DrainBuffer();
  ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 5);
  ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 5);
  ASSERT_EQ(testable_counter_metrics_.test_counters_[2], 4);
  ASSERT_EQ(testable_counter_metrics_.test_counters_[2], 4);
  testable_counter_metrics_.test_counters_.clear();
  testable_counter_metrics_.test_counters_.clear();
  ASSERT_TRUE(testable_counter_metrics_.Count(1, 20));
  ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 20));
  ASSERT_TRUE(testable_counter_metrics_.Count(1, 30));
  ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 30));
  ASSERT_TRUE(testable_counter_metrics_.Count(2, 40));
  ASSERT_TRUE(testable_counter_metrics_.CacheCount(2, 40));
  ASSERT_TRUE(testable_counter_metrics_.Count(3, 100));
  ASSERT_TRUE(testable_counter_metrics_.CacheCount(3, 100));
  testable_counter_metrics_.DrainBuffer();
  testable_counter_metrics_.DrainBuffer();
  ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 50);
  ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 50);
  ASSERT_EQ(testable_counter_metrics_.test_counters_[2], 40);
  ASSERT_EQ(testable_counter_metrics_.test_counters_[2], 40);
@@ -71,17 +72,17 @@ TEST_F(CounterMetricsTest, multiple_drain) {
}
}


TEST_F(CounterMetricsTest, overflow) {
TEST_F(CounterMetricsTest, overflow) {
  ASSERT_TRUE(testable_counter_metrics_.Count(1, LLONG_MAX));
  ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, LLONG_MAX));
  ASSERT_FALSE(testable_counter_metrics_.Count(1, 1));
  ASSERT_FALSE(testable_counter_metrics_.CacheCount(1, 1));
  ASSERT_FALSE(testable_counter_metrics_.Count(1, 2));
  ASSERT_FALSE(testable_counter_metrics_.CacheCount(1, 2));
  testable_counter_metrics_.DrainBuffer();
  testable_counter_metrics_.DrainBuffer();
  ASSERT_EQ(testable_counter_metrics_.test_counters_[1], LLONG_MAX);
  ASSERT_EQ(testable_counter_metrics_.test_counters_[1], LLONG_MAX);
}
}


TEST_F(CounterMetricsTest, non_positive) {
TEST_F(CounterMetricsTest, non_positive) {
  ASSERT_TRUE(testable_counter_metrics_.Count(1, 5));
  ASSERT_TRUE(testable_counter_metrics_.CacheCount(1, 5));
  ASSERT_FALSE(testable_counter_metrics_.Count(1, 0));
  ASSERT_FALSE(testable_counter_metrics_.CacheCount(1, 0));
  ASSERT_FALSE(testable_counter_metrics_.Count(1, -1));
  ASSERT_FALSE(testable_counter_metrics_.CacheCount(1, -1));
  testable_counter_metrics_.DrainBuffer();
  testable_counter_metrics_.DrainBuffer();
  ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 5);
  ASSERT_EQ(testable_counter_metrics_.test_counters_[1], 5);
}
}