diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/CpuGaugeCollector.java b/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/CpuGaugeCollector.java index 706a82ecc58..528de2e62ae 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/CpuGaugeCollector.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/CpuGaugeCollector.java @@ -166,7 +166,7 @@ private synchronized void scheduleCpuMetricCollectionWithRate( CpuMetricReading currCpuReading = syncCollectCpuMetric(referenceTime); if (currCpuReading != null) { cpuMetricReadings.add(currCpuReading); - GaugeCounter.INSTANCE.incrementCounter(); + GaugeCounter.incrementCounter(); } }, /* initialDelay */ 0, @@ -186,7 +186,7 @@ private synchronized void scheduleCpuMetricCollectionOnce(Timer referenceTime) { CpuMetricReading currCpuReading = syncCollectCpuMetric(referenceTime); if (currCpuReading != null) { cpuMetricReadings.add(currCpuReading); - GaugeCounter.INSTANCE.incrementCounter(); + GaugeCounter.incrementCounter(); } }, /* initialDelay */ 0, diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/GaugeCounter.kt b/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/GaugeCounter.kt index 642bbf19dfe..72093922cbc 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/GaugeCounter.kt +++ b/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/GaugeCounter.kt @@ -31,6 +31,7 @@ object GaugeCounter { @set:JvmStatic var gaugeManager: GaugeManager = GaugeManager.getInstance() + @JvmStatic fun incrementCounter() { val metricsCount = counter.incrementAndGet() @@ -41,15 +42,17 @@ object GaugeCounter { logger.debug("Incremented logger to $metricsCount") } + @JvmStatic fun decrementCounter() { val curr = counter.decrementAndGet() logger.debug("Decremented logger to $curr") } @VisibleForTesting(otherwise = VisibleForTesting.NONE) + @JvmStatic fun resetCounter() { counter.set(0) } - @VisibleForTesting(otherwise = VisibleForTesting.NONE) fun count(): Int = counter.get() + @VisibleForTesting(otherwise = VisibleForTesting.NONE) @JvmStatic fun count(): Int = counter.get() } diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/GaugeManager.java b/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/GaugeManager.java index ae15f848146..ad3b19eb272 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/GaugeManager.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/GaugeManager.java @@ -250,19 +250,18 @@ private void logExistingGaugeMetrics( */ private void syncFlush(String sessionId, ApplicationProcessState appState) { GaugeMetric.Builder gaugeMetricBuilder = GaugeMetric.newBuilder(); - GaugeCounter gaugeCounter = GaugeCounter.INSTANCE; // Adding CPU metric readings. while (!cpuGaugeCollector.get().cpuMetricReadings.isEmpty()) { gaugeMetricBuilder.addCpuMetricReadings(cpuGaugeCollector.get().cpuMetricReadings.poll()); - gaugeCounter.decrementCounter(); + GaugeCounter.decrementCounter(); } // Adding Memory metric readings. while (!memoryGaugeCollector.get().memoryMetricReadings.isEmpty()) { gaugeMetricBuilder.addAndroidMemoryReadings( memoryGaugeCollector.get().memoryMetricReadings.poll()); - gaugeCounter.decrementCounter(); + GaugeCounter.decrementCounter(); } // Adding Session ID info. diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/MemoryGaugeCollector.java b/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/MemoryGaugeCollector.java index 15c3b7f0767..878353a2c5b 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/MemoryGaugeCollector.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/MemoryGaugeCollector.java @@ -129,7 +129,7 @@ private synchronized void scheduleMemoryMetricCollectionWithRate( AndroidMemoryReading memoryReading = syncCollectMemoryMetric(referenceTime); if (memoryReading != null) { memoryMetricReadings.add(memoryReading); - GaugeCounter.INSTANCE.incrementCounter(); + GaugeCounter.incrementCounter(); } }, /* initialDelay */ 0, @@ -149,7 +149,7 @@ private synchronized void scheduleMemoryMetricCollectionOnce(Timer referenceTime AndroidMemoryReading memoryReading = syncCollectMemoryMetric(referenceTime); if (memoryReading != null) { memoryMetricReadings.add(memoryReading); - GaugeCounter.INSTANCE.incrementCounter(); + GaugeCounter.incrementCounter(); } }, /* initialDelay */ 0, diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerformanceTestBase.java b/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerformanceTestBase.java index 94a455868bc..f1f258e518c 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerformanceTestBase.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerformanceTestBase.java @@ -59,7 +59,7 @@ public class FirebasePerformanceTestBase { @BeforeClass public static void setUpBeforeClass() { // TODO(b/394127311): Explore removing this. - GaugeCounter.INSTANCE.resetCounter(); + GaugeCounter.resetCounter(); } @Before diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/session/gauges/CpuGaugeCollectorTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/session/gauges/CpuGaugeCollectorTest.java index 570e72e4a76..8d155196e3f 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/session/gauges/CpuGaugeCollectorTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/session/gauges/CpuGaugeCollectorTest.java @@ -60,9 +60,11 @@ public void tearDown() { @Test public void testStartCollectingAddsCpuMetricReadingsToTheConcurrentLinkedQueue() throws Exception { + int priorGaugeCount = GaugeCounter.count(); testGaugeCollector.startCollecting(100, new Timer()); fakeScheduledExecutorService.simulateSleepExecutingAtMostOneTask(); assertThat(testGaugeCollector.cpuMetricReadings).hasSize(1); + assertThat(GaugeCounter.count()).isEqualTo(priorGaugeCount + 1); } @Test @@ -246,11 +248,17 @@ public void testCollectCpuMetricDoesntStartCollectingWithInvalidCpuMetricCollect @Test public void testCollectOnce_addOnlyOneCpuMetricReadingToQueue() { + int priorGaugeCount = GaugeCounter.count(); assertThat(testGaugeCollector.cpuMetricReadings).isEmpty(); testGaugeCollector.collectOnce(new Timer()); fakeScheduledExecutorService.simulateSleepExecutingAtMostOneTask(); + + // Simulate running an additional task. + fakeScheduledExecutorService.simulateSleepExecutingAtMostOneTask(); + assertThat(testGaugeCollector.cpuMetricReadings).hasSize(1); + assertThat(GaugeCounter.count()).isEqualTo(priorGaugeCount + 1); } @Test diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/session/gauges/GaugeManagerTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/session/gauges/GaugeManagerTest.java index 871ba9b14d4..e0e1f8d8d48 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/session/gauges/GaugeManagerTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/session/gauges/GaugeManagerTest.java @@ -331,7 +331,7 @@ public void stopCollectingGauges_invalidGaugeCollectionFrequency_appInForeground } @Test - public void testGaugeCounterStartsAJobToConsumeTheGeneratedMetrics() throws InterruptedException { + public void testGaugeCounterStartsAJobToConsumeTheGeneratedMetrics() { PerfSession fakeSession = createTestSession(1); testGaugeManager.setApplicationProcessState(ApplicationProcessState.FOREGROUND); testGaugeManager.startCollectingGauges(fakeSession); @@ -371,6 +371,36 @@ public void testGaugeCounterStartsAJobToConsumeTheGeneratedMetrics() throws Inte assertThat(recordedGaugeMetric.getSessionId()).isEqualTo(testSessionId(1)); } + @Test + public void testGaugeCounterIsDecrementedWhenLogged() { + int priorGaugeCounter = GaugeCounter.count(); + + PerfSession fakeSession = createTestSession(1); + testGaugeManager.setApplicationProcessState(ApplicationProcessState.FOREGROUND); + testGaugeManager.startCollectingGauges(fakeSession); + GaugeCounter.setGaugeManager(testGaugeManager); + + // There's no job to log the gauges. + assertThat(fakeScheduledExecutorService.isEmpty()).isTrue(); + + // Generate metrics that don't exceed the GaugeCounter.MAX_COUNT. + generateMetricsAndIncrementCounter(20); + + // There's still no job to log the gauges. + assertThat(fakeScheduledExecutorService.isEmpty()).isTrue(); + + generateMetricsAndIncrementCounter(10); + + assertThat(fakeScheduledExecutorService.isEmpty()).isFalse(); + assertThat(fakeScheduledExecutorService.getDelayToNextTask(TimeUnit.MILLISECONDS)) + .isEqualTo(TIME_TO_WAIT_BEFORE_FLUSHING_GAUGES_QUEUE_MS); + + assertThat(GaugeCounter.count()).isEqualTo(priorGaugeCounter + 30); + fakeScheduledExecutorService.simulateSleepExecutingAtMostOneTask(); + + assertThat(GaugeCounter.count()).isEqualTo(priorGaugeCounter); + } + @Test public void testUpdateAppStateHandlesMultipleAppStates() { PerfSession fakeSession = createTestSession(1); @@ -429,7 +459,7 @@ public void testGaugeManagerHandlesMultipleSessionIds() { fakeSession.setGaugeAndEventCollectionEnabled(true); testGaugeManager.setApplicationProcessState(ApplicationProcessState.BACKGROUND); testGaugeManager.startCollectingGauges(fakeSession); - GaugeCounter.INSTANCE.setGaugeManager(testGaugeManager); + GaugeCounter.setGaugeManager(testGaugeManager); // Generate metrics that don't exceed the GaugeCounter.MAX_COUNT. generateMetricsAndIncrementCounter(10); @@ -615,10 +645,10 @@ private void generateMetricsAndIncrementCounter(int count) { for (int i = 0; i < count; ++i) { if (random.nextInt(2) == 0) { fakeCpuGaugeCollector.cpuMetricReadings.add(createFakeCpuMetricReading(100, 200)); - GaugeCounter.INSTANCE.incrementCounter(); + GaugeCounter.incrementCounter(); } else { fakeMemoryGaugeCollector.memoryMetricReadings.add(createFakeAndroidMetricReading(100)); - GaugeCounter.INSTANCE.incrementCounter(); + GaugeCounter.incrementCounter(); } } } diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/session/gauges/MemoryGaugeCollectorTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/session/gauges/MemoryGaugeCollectorTest.java index a99be17bee3..0c4769e207c 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/session/gauges/MemoryGaugeCollectorTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/session/gauges/MemoryGaugeCollectorTest.java @@ -59,9 +59,11 @@ private void mockMemory() { @Test public void testStartCollecting_addsMemoryMetricReadingsToQueue() { + int priorGaugeCount = GaugeCounter.count(); testGaugeCollector.startCollecting(/* memoryMetricCollectionRateMs= */ 100, new Timer()); fakeScheduledExecutorService.simulateSleepExecutingAtMostOneTask(); assertThat(testGaugeCollector.memoryMetricReadings).hasSize(1); + assertThat(GaugeCounter.count()).isEqualTo(priorGaugeCount + 1); } @Test @@ -148,11 +150,17 @@ public void testCollectedMemoryMetric_containsApproximatelyCorrectTimestamp() { @Test public void testCollectOnce_addOnlyOneMemoryMetricReadingToQueue() { + int priorGaugeCount = GaugeCounter.count(); assertThat(testGaugeCollector.memoryMetricReadings).isEmpty(); testGaugeCollector.collectOnce(new Timer()); fakeScheduledExecutorService.simulateSleepExecutingAtMostOneTask(); + + // Simulate running an additional task. + fakeScheduledExecutorService.simulateSleepExecutingAtMostOneTask(); + assertThat(testGaugeCollector.memoryMetricReadings).hasSize(1); + assertThat(GaugeCounter.count()).isEqualTo(priorGaugeCount + 1); } @Test