From 4e5773b413388f0a834a688c1466f5a90ba41e9c Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Mon, 26 May 2025 12:15:29 -0400 Subject: [PATCH 01/12] Add gauge counter to collector tests --- .../firebase/perf/session/gauges/CpuGaugeCollector.java | 4 ++-- .../google/firebase/perf/session/gauges/GaugeCounter.kt | 5 ++++- .../google/firebase/perf/session/gauges/GaugeManager.java | 5 ++--- .../perf/session/gauges/MemoryGaugeCollector.java | 4 ++-- .../google/firebase/perf/FirebasePerformanceTestBase.java | 2 +- .../perf/session/gauges/CpuGaugeCollectorTest.java | 8 ++++++++ .../firebase/perf/session/gauges/GaugeManagerTest.java | 6 +++--- .../perf/session/gauges/MemoryGaugeCollectorTest.java | 8 ++++++++ 8 files changed, 30 insertions(+), 12 deletions(-) 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..b78893f002e 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 @@ -429,7 +429,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 +615,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 From 75929f3fc044df91ae479cb73abdb432c7710e83 Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Mon, 26 May 2025 12:55:12 -0400 Subject: [PATCH 02/12] Add test for decrement --- .../perf/session/gauges/GaugeManagerTest.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) 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 b78893f002e..e64c133bf6b 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 @@ -371,6 +371,36 @@ public void testGaugeCounterStartsAJobToConsumeTheGeneratedMetrics() throws Inte assertThat(recordedGaugeMetric.getSessionId()).isEqualTo(testSessionId(1)); } + @Test + public void testGaugeCounterIsDecrementedWhenLogged() throws InterruptedException { + 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); From 1958cedb6b458abe864fddaed8d4da0389ba013a Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Mon, 26 May 2025 13:02:46 -0400 Subject: [PATCH 03/12] remove throws InterruptedException from tests --- .../google/firebase/perf/session/gauges/GaugeManagerTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 e64c133bf6b..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); @@ -372,7 +372,7 @@ public void testGaugeCounterStartsAJobToConsumeTheGeneratedMetrics() throws Inte } @Test - public void testGaugeCounterIsDecrementedWhenLogged() throws InterruptedException { + public void testGaugeCounterIsDecrementedWhenLogged() { int priorGaugeCounter = GaugeCounter.count(); PerfSession fakeSession = createTestSession(1); From bc42d60bdbc967312010c8b2dd59c8d4ecf89925 Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Mon, 26 May 2025 14:24:05 -0400 Subject: [PATCH 04/12] Update frequency of gauge logging --- .../perf/session/gauges/GaugeCounter.kt | 2 +- .../perf/session/gauges/GaugeManagerTest.java | 26 ++++++++++--------- 2 files changed, 15 insertions(+), 13 deletions(-) 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 72093922cbc..6a65a9f141d 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 @@ -23,7 +23,7 @@ import java.util.concurrent.atomic.AtomicInteger * [MAX_METRIC_COUNT], it attempts to log the metrics to Firelog. */ object GaugeCounter { - private const val MAX_METRIC_COUNT = 25 + private const val MAX_METRIC_COUNT = 50 private val counter = AtomicInteger(0) private val logger = AndroidLogger.getInstance() 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 e0e1f8d8d48..54570d79c18 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 @@ -66,6 +66,9 @@ public final class GaugeManagerTest extends FirebasePerformanceTestBase { private static final long DEFAULT_MEMORY_GAUGE_COLLECTION_FREQUENCY_BG_MS = 120; private static final long DEFAULT_MEMORY_GAUGE_COLLECTION_FREQUENCY_FG_MS = 60; + // See [com.google.firebase.perf.session.gauges.GaugeCounter]. + private static long MAX_GAUGE_COUNTER_BEFORE_LOGGING = 50; + private GaugeManager testGaugeManager = null; private FakeScheduledExecutorService fakeScheduledExecutorService = null; private TransportManager mockTransportManager = null; @@ -340,8 +343,7 @@ public void testGaugeCounterStartsAJobToConsumeTheGeneratedMetrics() { // There's no job to log the gauges. assertThat(fakeScheduledExecutorService.isEmpty()).isTrue(); - // Generate metrics that don't exceed the GaugeCounter.MAX_COUNT. - generateMetricsAndIncrementCounter(20); + generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_BEFORE_LOGGING - 10); // There's still no job to log the gauges. assertThat(fakeScheduledExecutorService.isEmpty()).isTrue(); @@ -366,7 +368,7 @@ public void testGaugeCounterStartsAJobToConsumeTheGeneratedMetrics() { int recordedGaugeMetricsCount = recordedGaugeMetric.getAndroidMemoryReadingsCount() + recordedGaugeMetric.getCpuMetricReadingsCount(); - assertThat(recordedGaugeMetricsCount).isEqualTo(30); + assertThat(recordedGaugeMetricsCount).isEqualTo(MAX_GAUGE_COUNTER_BEFORE_LOGGING); assertThat(recordedGaugeMetric.getSessionId()).isEqualTo(testSessionId(1)); } @@ -410,7 +412,7 @@ public void testUpdateAppStateHandlesMultipleAppStates() { GaugeCounter.setGaugeManager(testGaugeManager); // Generate metrics that don't exceed the GaugeCounter.MAX_COUNT. - generateMetricsAndIncrementCounter(10); + generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_BEFORE_LOGGING - 10); // There's no job to log the gauges. assertThat(fakeScheduledExecutorService.isEmpty()).isTrue(); @@ -425,7 +427,7 @@ public void testUpdateAppStateHandlesMultipleAppStates() { shadowOf(Looper.getMainLooper()).idle(); // Generate additional metrics in the new app state. - generateMetricsAndIncrementCounter(26); + generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_BEFORE_LOGGING + 1); GaugeMetric recordedGaugeMetric = getLastRecordedGaugeMetric(ApplicationProcessState.FOREGROUND); @@ -434,7 +436,7 @@ public void testUpdateAppStateHandlesMultipleAppStates() { int recordedGaugeMetricsCount = recordedGaugeMetric.getAndroidMemoryReadingsCount() + recordedGaugeMetric.getCpuMetricReadingsCount(); - assertThat(recordedGaugeMetricsCount).isEqualTo(10); + assertThat(recordedGaugeMetricsCount).isEqualTo(MAX_GAUGE_COUNTER_BEFORE_LOGGING - 10); assertThat(recordedGaugeMetric.getSessionId()).isEqualTo(testSessionId(1)); @@ -448,7 +450,7 @@ public void testUpdateAppStateHandlesMultipleAppStates() { recordedGaugeMetricsCount = recordedGaugeMetric.getAndroidMemoryReadingsCount() + recordedGaugeMetric.getCpuMetricReadingsCount(); - assertThat(recordedGaugeMetricsCount).isEqualTo(26); + assertThat(recordedGaugeMetricsCount).isEqualTo(MAX_GAUGE_COUNTER_BEFORE_LOGGING + 1); assertThat(recordedGaugeMetric.getSessionId()).isEqualTo(testSessionId(1)); } @@ -462,7 +464,7 @@ public void testGaugeManagerHandlesMultipleSessionIds() { GaugeCounter.setGaugeManager(testGaugeManager); // Generate metrics that don't exceed the GaugeCounter.MAX_COUNT. - generateMetricsAndIncrementCounter(10); + generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_BEFORE_LOGGING - 10); PerfSession updatedPerfSession = createTestSession(2); updatedPerfSession.setGaugeAndEventCollectionEnabled(true); @@ -479,7 +481,7 @@ public void testGaugeManagerHandlesMultipleSessionIds() { shadowOf(Looper.getMainLooper()).idle(); // Generate metrics for the new session. - generateMetricsAndIncrementCounter(26); + generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_BEFORE_LOGGING + 1); GaugeMetric recordedGaugeMetric = getLastRecordedGaugeMetric(ApplicationProcessState.BACKGROUND); @@ -488,7 +490,7 @@ public void testGaugeManagerHandlesMultipleSessionIds() { int recordedGaugeMetricsCount = recordedGaugeMetric.getAndroidMemoryReadingsCount() + recordedGaugeMetric.getCpuMetricReadingsCount(); - assertThat(recordedGaugeMetricsCount).isEqualTo(10); + assertThat(recordedGaugeMetricsCount).isEqualTo(MAX_GAUGE_COUNTER_BEFORE_LOGGING - 10); assertThat(recordedGaugeMetric.getSessionId()).isEqualTo(testSessionId(1)); @@ -502,7 +504,7 @@ public void testGaugeManagerHandlesMultipleSessionIds() { recordedGaugeMetricsCount = recordedGaugeMetric.getAndroidMemoryReadingsCount() + recordedGaugeMetric.getCpuMetricReadingsCount(); - assertThat(recordedGaugeMetricsCount).isEqualTo(26); + assertThat(recordedGaugeMetricsCount).isEqualTo(MAX_GAUGE_COUNTER_BEFORE_LOGGING + 1); assertThat(recordedGaugeMetric.getSessionId()).isEqualTo(testSessionId(2)); } @@ -638,7 +640,7 @@ private long getMinimumBackgroundCollectionFrequency() { } // Simulates the behavior of Cpu and Memory Gauge collector. - private void generateMetricsAndIncrementCounter(int count) { + private void generateMetricsAndIncrementCounter(long count) { // TODO(b/394127311): Explore actually collecting metrics using the fake Cpu and Memory // metric collectors. Random random = new Random(); From 8cf5118b6d7c787d39db4ad97b55d29fa474c9be Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Mon, 26 May 2025 14:37:02 -0400 Subject: [PATCH 05/12] Refactor GaugeMetadata to be logged only when the session is verbose --- .../FirebasePerformanceSessionSubscriber.kt | 4 ---- .../firebase/perf/session/SessionManager.java | 9 +++++++++ .../perf/session/gauges/GaugeManager.java | 7 +++---- .../perf/session/gauges/GaugeManagerTest.java | 20 +++++++------------ 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/session/FirebasePerformanceSessionSubscriber.kt b/firebase-perf/src/main/java/com/google/firebase/perf/session/FirebasePerformanceSessionSubscriber.kt index d3e13c63aa9..71062422d51 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/session/FirebasePerformanceSessionSubscriber.kt +++ b/firebase-perf/src/main/java/com/google/firebase/perf/session/FirebasePerformanceSessionSubscriber.kt @@ -17,8 +17,6 @@ package com.google.firebase.perf.session import com.google.firebase.perf.logging.FirebaseSessionsEnforcementCheck -import com.google.firebase.perf.session.gauges.GaugeManager -import com.google.firebase.perf.v1.ApplicationProcessState import com.google.firebase.sessions.api.SessionSubscriber class FirebasePerformanceSessionSubscriber(override val isDataCollectionEnabled: Boolean) : @@ -33,7 +31,5 @@ class FirebasePerformanceSessionSubscriber(override val isDataCollectionEnabled: val updatedSession = PerfSession.createWithId(sessionDetails.sessionId) SessionManager.getInstance().updatePerfSession(updatedSession) - GaugeManager.getInstance() - .logGaugeMetadata(updatedSession.sessionId(), ApplicationProcessState.FOREGROUND) } } diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java b/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java index 5f01a50a032..920fed53463 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java @@ -115,6 +115,9 @@ public void updatePerfSession(PerfSession perfSession) { } } + // Log gauge metadata. + logGaugeMetadataIfCollectionEnabled(); + // Start of stop the gauge data collection. startOrStopCollectingGauges(); } @@ -153,6 +156,12 @@ public void unregisterForSessionUpdates(WeakReference client } } + private void logGaugeMetadataIfCollectionEnabled() { + if (perfSession.isVerbose()) { + gaugeManager.logGaugeMetadata(perfSession.sessionId()); + } + } + private void startOrStopCollectingGauges() { FirebaseSessionsEnforcementCheck.checkSession(perfSession, "startOrStopCollectingGauges"); 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 ad3b19eb272..2404e3aec22 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 @@ -274,18 +274,17 @@ private void syncFlush(String sessionId, ApplicationProcessState appState) { * Log the Gauge Metadata information to the transport. * * @param sessionId The {@link PerfSession#sessionId()} ()} to which the collected Gauge Metrics - * should be associated with. - * @param appState The {@link ApplicationProcessState} for which these gauges are collected. + * should be associated with. * @return true if GaugeMetadata was logged, false otherwise. */ - public boolean logGaugeMetadata(String sessionId, ApplicationProcessState appState) { + public boolean logGaugeMetadata(String sessionId) { if (gaugeMetadataManager != null) { GaugeMetric gaugeMetric = GaugeMetric.newBuilder() .setSessionId(sessionId) .setGaugeMetadata(getGaugeMetadata()) .build(); - transportManager.log(gaugeMetric, appState); + transportManager.log(gaugeMetric, ApplicationProcessState.FOREGROUND); return true; } return false; 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 54570d79c18..297b829ba8a 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 @@ -385,8 +385,7 @@ public void testGaugeCounterIsDecrementedWhenLogged() { // There's no job to log the gauges. assertThat(fakeScheduledExecutorService.isEmpty()).isTrue(); - // Generate metrics that don't exceed the GaugeCounter.MAX_COUNT. - generateMetricsAndIncrementCounter(20); + generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_BEFORE_LOGGING - 10); // There's still no job to log the gauges. assertThat(fakeScheduledExecutorService.isEmpty()).isTrue(); @@ -397,7 +396,8 @@ public void testGaugeCounterIsDecrementedWhenLogged() { assertThat(fakeScheduledExecutorService.getDelayToNextTask(TimeUnit.MILLISECONDS)) .isEqualTo(TIME_TO_WAIT_BEFORE_FLUSHING_GAUGES_QUEUE_MS); - assertThat(GaugeCounter.count()).isEqualTo(priorGaugeCounter + 30); + assertThat(GaugeCounter.count()) + .isEqualTo(priorGaugeCounter + MAX_GAUGE_COUNTER_BEFORE_LOGGING); fakeScheduledExecutorService.simulateSleepExecutingAtMostOneTask(); assertThat(GaugeCounter.count()).isEqualTo(priorGaugeCounter); @@ -561,7 +561,7 @@ public void testLogGaugeMetadataSendDataToTransport() { when(fakeGaugeMetadataManager.getMaxAppJavaHeapMemoryKb()).thenReturn(1000); when(fakeGaugeMetadataManager.getMaxEncouragedAppJavaHeapMemoryKb()).thenReturn(800); - testGaugeManager.logGaugeMetadata(testSessionId(1), ApplicationProcessState.FOREGROUND); + testGaugeManager.logGaugeMetadata(testSessionId(1)); GaugeMetric recordedGaugeMetric = getLastRecordedGaugeMetric(ApplicationProcessState.FOREGROUND); @@ -588,9 +588,7 @@ public void testLogGaugeMetadataDoesNotLogWhenGaugeMetadataManagerNotAvailable() new Lazy<>(() -> fakeCpuGaugeCollector), new Lazy<>(() -> fakeMemoryGaugeCollector)); - assertThat( - testGaugeManager.logGaugeMetadata(testSessionId(1), ApplicationProcessState.FOREGROUND)) - .isFalse(); + assertThat(testGaugeManager.logGaugeMetadata(testSessionId(1))).isFalse(); } @Test @@ -605,14 +603,10 @@ public void testLogGaugeMetadataLogsAfterApplicationContextIsSet() { new Lazy<>(() -> fakeCpuGaugeCollector), new Lazy<>(() -> fakeMemoryGaugeCollector)); - assertThat( - testGaugeManager.logGaugeMetadata(testSessionId(1), ApplicationProcessState.FOREGROUND)) - .isFalse(); + assertThat(testGaugeManager.logGaugeMetadata(testSessionId(1))).isFalse(); testGaugeManager.initializeGaugeMetadataManager(ApplicationProvider.getApplicationContext()); - assertThat( - testGaugeManager.logGaugeMetadata(testSessionId(1), ApplicationProcessState.FOREGROUND)) - .isTrue(); + assertThat(testGaugeManager.logGaugeMetadata(testSessionId(1))).isTrue(); GaugeMetric recordedGaugeMetric = getLastRecordedGaugeMetric(ApplicationProcessState.FOREGROUND); From 2de134e2c4c31329a834f5eb25096bc8b77bbe56 Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Mon, 26 May 2025 15:07:59 -0400 Subject: [PATCH 06/12] switch to unknown app state for metadata --- .../com/google/firebase/perf/session/gauges/GaugeManager.java | 2 +- .../com/google/firebase/perf/transport/TransportManager.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) 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 2404e3aec22..372c961257a 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 @@ -284,7 +284,7 @@ public boolean logGaugeMetadata(String sessionId) { .setSessionId(sessionId) .setGaugeMetadata(getGaugeMetadata()) .build(); - transportManager.log(gaugeMetric, ApplicationProcessState.FOREGROUND); + transportManager.log(gaugeMetric); return true; } return false; diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java b/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java index 54d5b0792c3..a38fb666c85 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java @@ -356,7 +356,6 @@ public void log(final GaugeMetric gaugeMetric) { * {@link #isAllowedToDispatch(PerfMetric)}). */ public void log(final GaugeMetric gaugeMetric, final ApplicationProcessState appState) { - // TODO(b/394127311): This *might* potentially be the right place to get AQS. executorService.execute( () -> syncLog(PerfMetric.newBuilder().setGaugeMetric(gaugeMetric), appState)); } From 01fa0b052e4799a4c4f639a625c3dc9fe8aacad1 Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Mon, 26 May 2025 15:43:02 -0400 Subject: [PATCH 07/12] fix tests --- .../perf/session/gauges/GaugeManagerTest.java | 54 +++++++++++++++++-- 1 file changed, 50 insertions(+), 4 deletions(-) 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 297b829ba8a..53784937c4a 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 @@ -403,6 +403,44 @@ public void testGaugeCounterIsDecrementedWhenLogged() { assertThat(GaugeCounter.count()).isEqualTo(priorGaugeCounter); } + @Test + public void testDuplicateGaugeLoggingIsAvoided() { + 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(); + + generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_BEFORE_LOGGING - 20); + + // There's still no job to log the gauges. + assertThat(fakeScheduledExecutorService.isEmpty()).isTrue(); + + generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_BEFORE_LOGGING); + + assertThat(fakeScheduledExecutorService.isEmpty()).isFalse(); + assertThat(fakeScheduledExecutorService.getDelayToNextTask(TimeUnit.MILLISECONDS)) + .isEqualTo(TIME_TO_WAIT_BEFORE_FLUSHING_GAUGES_QUEUE_MS); + + fakeScheduledExecutorService.simulateSleepExecutingAtMostOneTask(); + assertThat(fakeScheduledExecutorService.isEmpty()).isTrue(); + + GaugeMetric recordedGaugeMetric = + getLastRecordedGaugeMetric(ApplicationProcessState.FOREGROUND); + + // It flushes all the metrics in the ConcurrentLinkedQueues that were added. + int recordedGaugeMetricsCount = + recordedGaugeMetric.getAndroidMemoryReadingsCount() + + recordedGaugeMetric.getCpuMetricReadingsCount(); + assertThat(recordedGaugeMetricsCount).isEqualTo(2 * MAX_GAUGE_COUNTER_BEFORE_LOGGING - 20); + + assertThat(recordedGaugeMetric.getSessionId()).isEqualTo(testSessionId(1)); + assertThat(GaugeCounter.count()).isEqualTo(priorGaugeCounter); + } + @Test public void testUpdateAppStateHandlesMultipleAppStates() { PerfSession fakeSession = createTestSession(1); @@ -564,7 +602,7 @@ public void testLogGaugeMetadataSendDataToTransport() { testGaugeManager.logGaugeMetadata(testSessionId(1)); GaugeMetric recordedGaugeMetric = - getLastRecordedGaugeMetric(ApplicationProcessState.FOREGROUND); + getLastRecordedGaugeMetric(ApplicationProcessState.APPLICATION_PROCESS_STATE_UNKNOWN); GaugeMetadata recordedGaugeMetadata = recordedGaugeMetric.getGaugeMetadata(); assertThat(recordedGaugeMetric.getSessionId()).isEqualTo(testSessionId(1)); @@ -609,7 +647,7 @@ public void testLogGaugeMetadataLogsAfterApplicationContextIsSet() { assertThat(testGaugeManager.logGaugeMetadata(testSessionId(1))).isTrue(); GaugeMetric recordedGaugeMetric = - getLastRecordedGaugeMetric(ApplicationProcessState.FOREGROUND); + getLastRecordedGaugeMetric(ApplicationProcessState.APPLICATION_PROCESS_STATE_UNKNOWN); GaugeMetadata recordedGaugeMetadata = recordedGaugeMetric.getGaugeMetadata(); assertThat(recordedGaugeMetric.getSessionId()).isEqualTo(testSessionId(1)); @@ -675,8 +713,16 @@ private AndroidMemoryReading createFakeAndroidMetricReading(int currentUsedAppJa private GaugeMetric getLastRecordedGaugeMetric( ApplicationProcessState expectedApplicationProcessState) { ArgumentCaptor argMetric = ArgumentCaptor.forClass(GaugeMetric.class); - verify(mockTransportManager, times(1)) - .log(argMetric.capture(), eq(expectedApplicationProcessState)); + + // TODO(b/394127311): Revisit transportManager.log method which is only being called in unit + // tests. + if (expectedApplicationProcessState + == ApplicationProcessState.APPLICATION_PROCESS_STATE_UNKNOWN) { + verify(mockTransportManager, times(1)).log(argMetric.capture()); + } else { + verify(mockTransportManager, times(1)) + .log(argMetric.capture(), eq(expectedApplicationProcessState)); + } reset(mockTransportManager); // Required after resetting the mock. By default we assume that Transport is initialized. when(mockTransportManager.isInitialized()).thenReturn(true); From 6500dad77309095efafd6eee1842a19afac22628 Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Mon, 26 May 2025 15:59:26 -0400 Subject: [PATCH 08/12] Remove logging in counter --- .../google/firebase/perf/session/gauges/GaugeCounter.kt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) 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 6a65a9f141d..19b66461fe2 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 @@ -15,7 +15,6 @@ package com.google.firebase.perf.session.gauges import androidx.annotation.VisibleForTesting -import com.google.firebase.perf.logging.AndroidLogger import java.util.concurrent.atomic.AtomicInteger /** @@ -24,8 +23,8 @@ import java.util.concurrent.atomic.AtomicInteger */ object GaugeCounter { private const val MAX_METRIC_COUNT = 50 + // For debugging explore re-introducing logging. private val counter = AtomicInteger(0) - private val logger = AndroidLogger.getInstance() @set:VisibleForTesting(otherwise = VisibleForTesting.NONE) @set:JvmStatic @@ -38,14 +37,11 @@ object GaugeCounter { if (metricsCount >= MAX_METRIC_COUNT) { gaugeManager.logGaugeMetrics() } - - logger.debug("Incremented logger to $metricsCount") } @JvmStatic fun decrementCounter() { - val curr = counter.decrementAndGet() - logger.debug("Decremented logger to $curr") + counter.decrementAndGet() } @VisibleForTesting(otherwise = VisibleForTesting.NONE) From bfe389690dd029c7bd7f2c77db694002170efb07 Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Mon, 26 May 2025 16:03:58 -0400 Subject: [PATCH 09/12] Reword MAX_GAUGE_COUNTER --- .../perf/session/gauges/GaugeCounter.kt | 4 +-- .../perf/session/gauges/GaugeManagerTest.java | 33 +++++++++---------- 2 files changed, 18 insertions(+), 19 deletions(-) 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 19b66461fe2..2cabc59e07a 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 @@ -18,8 +18,8 @@ import androidx.annotation.VisibleForTesting import java.util.concurrent.atomic.AtomicInteger /** - * [GaugeCounter] is a thread-safe counter for gauge metrics. If the metrics count exceeds - * [MAX_METRIC_COUNT], it attempts to log the metrics to Firelog. + * [GaugeCounter] is a thread-safe counter for gauge metrics. If the metrics count reaches or + * exceeds [MAX_METRIC_COUNT], it attempts to log the metrics to Firelog. */ object GaugeCounter { private const val MAX_METRIC_COUNT = 50 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 53784937c4a..ffa7308f835 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 @@ -67,7 +67,7 @@ public final class GaugeManagerTest extends FirebasePerformanceTestBase { private static final long DEFAULT_MEMORY_GAUGE_COLLECTION_FREQUENCY_FG_MS = 60; // See [com.google.firebase.perf.session.gauges.GaugeCounter]. - private static long MAX_GAUGE_COUNTER_BEFORE_LOGGING = 50; + private static final long MAX_GAUGE_COUNTER_LIMIT = 50; private GaugeManager testGaugeManager = null; private FakeScheduledExecutorService fakeScheduledExecutorService = null; @@ -343,7 +343,7 @@ public void testGaugeCounterStartsAJobToConsumeTheGeneratedMetrics() { // There's no job to log the gauges. assertThat(fakeScheduledExecutorService.isEmpty()).isTrue(); - generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_BEFORE_LOGGING - 10); + generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_LIMIT - 10); // There's still no job to log the gauges. assertThat(fakeScheduledExecutorService.isEmpty()).isTrue(); @@ -368,7 +368,7 @@ public void testGaugeCounterStartsAJobToConsumeTheGeneratedMetrics() { int recordedGaugeMetricsCount = recordedGaugeMetric.getAndroidMemoryReadingsCount() + recordedGaugeMetric.getCpuMetricReadingsCount(); - assertThat(recordedGaugeMetricsCount).isEqualTo(MAX_GAUGE_COUNTER_BEFORE_LOGGING); + assertThat(recordedGaugeMetricsCount).isEqualTo(MAX_GAUGE_COUNTER_LIMIT); assertThat(recordedGaugeMetric.getSessionId()).isEqualTo(testSessionId(1)); } @@ -385,7 +385,7 @@ public void testGaugeCounterIsDecrementedWhenLogged() { // There's no job to log the gauges. assertThat(fakeScheduledExecutorService.isEmpty()).isTrue(); - generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_BEFORE_LOGGING - 10); + generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_LIMIT - 10); // There's still no job to log the gauges. assertThat(fakeScheduledExecutorService.isEmpty()).isTrue(); @@ -396,8 +396,7 @@ public void testGaugeCounterIsDecrementedWhenLogged() { assertThat(fakeScheduledExecutorService.getDelayToNextTask(TimeUnit.MILLISECONDS)) .isEqualTo(TIME_TO_WAIT_BEFORE_FLUSHING_GAUGES_QUEUE_MS); - assertThat(GaugeCounter.count()) - .isEqualTo(priorGaugeCounter + MAX_GAUGE_COUNTER_BEFORE_LOGGING); + assertThat(GaugeCounter.count()).isEqualTo(priorGaugeCounter + MAX_GAUGE_COUNTER_LIMIT); fakeScheduledExecutorService.simulateSleepExecutingAtMostOneTask(); assertThat(GaugeCounter.count()).isEqualTo(priorGaugeCounter); @@ -414,12 +413,12 @@ public void testDuplicateGaugeLoggingIsAvoided() { // There's no job to log the gauges. assertThat(fakeScheduledExecutorService.isEmpty()).isTrue(); - generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_BEFORE_LOGGING - 20); + generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_LIMIT - 20); // There's still no job to log the gauges. assertThat(fakeScheduledExecutorService.isEmpty()).isTrue(); - generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_BEFORE_LOGGING); + generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_LIMIT); assertThat(fakeScheduledExecutorService.isEmpty()).isFalse(); assertThat(fakeScheduledExecutorService.getDelayToNextTask(TimeUnit.MILLISECONDS)) @@ -435,7 +434,7 @@ public void testDuplicateGaugeLoggingIsAvoided() { int recordedGaugeMetricsCount = recordedGaugeMetric.getAndroidMemoryReadingsCount() + recordedGaugeMetric.getCpuMetricReadingsCount(); - assertThat(recordedGaugeMetricsCount).isEqualTo(2 * MAX_GAUGE_COUNTER_BEFORE_LOGGING - 20); + assertThat(recordedGaugeMetricsCount).isEqualTo(2 * MAX_GAUGE_COUNTER_LIMIT - 20); assertThat(recordedGaugeMetric.getSessionId()).isEqualTo(testSessionId(1)); assertThat(GaugeCounter.count()).isEqualTo(priorGaugeCounter); @@ -450,7 +449,7 @@ public void testUpdateAppStateHandlesMultipleAppStates() { GaugeCounter.setGaugeManager(testGaugeManager); // Generate metrics that don't exceed the GaugeCounter.MAX_COUNT. - generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_BEFORE_LOGGING - 10); + generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_LIMIT - 10); // There's no job to log the gauges. assertThat(fakeScheduledExecutorService.isEmpty()).isTrue(); @@ -465,7 +464,7 @@ public void testUpdateAppStateHandlesMultipleAppStates() { shadowOf(Looper.getMainLooper()).idle(); // Generate additional metrics in the new app state. - generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_BEFORE_LOGGING + 1); + generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_LIMIT + 1); GaugeMetric recordedGaugeMetric = getLastRecordedGaugeMetric(ApplicationProcessState.FOREGROUND); @@ -474,7 +473,7 @@ public void testUpdateAppStateHandlesMultipleAppStates() { int recordedGaugeMetricsCount = recordedGaugeMetric.getAndroidMemoryReadingsCount() + recordedGaugeMetric.getCpuMetricReadingsCount(); - assertThat(recordedGaugeMetricsCount).isEqualTo(MAX_GAUGE_COUNTER_BEFORE_LOGGING - 10); + assertThat(recordedGaugeMetricsCount).isEqualTo(MAX_GAUGE_COUNTER_LIMIT - 10); assertThat(recordedGaugeMetric.getSessionId()).isEqualTo(testSessionId(1)); @@ -488,7 +487,7 @@ public void testUpdateAppStateHandlesMultipleAppStates() { recordedGaugeMetricsCount = recordedGaugeMetric.getAndroidMemoryReadingsCount() + recordedGaugeMetric.getCpuMetricReadingsCount(); - assertThat(recordedGaugeMetricsCount).isEqualTo(MAX_GAUGE_COUNTER_BEFORE_LOGGING + 1); + assertThat(recordedGaugeMetricsCount).isEqualTo(MAX_GAUGE_COUNTER_LIMIT + 1); assertThat(recordedGaugeMetric.getSessionId()).isEqualTo(testSessionId(1)); } @@ -502,7 +501,7 @@ public void testGaugeManagerHandlesMultipleSessionIds() { GaugeCounter.setGaugeManager(testGaugeManager); // Generate metrics that don't exceed the GaugeCounter.MAX_COUNT. - generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_BEFORE_LOGGING - 10); + generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_LIMIT - 10); PerfSession updatedPerfSession = createTestSession(2); updatedPerfSession.setGaugeAndEventCollectionEnabled(true); @@ -519,7 +518,7 @@ public void testGaugeManagerHandlesMultipleSessionIds() { shadowOf(Looper.getMainLooper()).idle(); // Generate metrics for the new session. - generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_BEFORE_LOGGING + 1); + generateMetricsAndIncrementCounter(MAX_GAUGE_COUNTER_LIMIT + 1); GaugeMetric recordedGaugeMetric = getLastRecordedGaugeMetric(ApplicationProcessState.BACKGROUND); @@ -528,7 +527,7 @@ public void testGaugeManagerHandlesMultipleSessionIds() { int recordedGaugeMetricsCount = recordedGaugeMetric.getAndroidMemoryReadingsCount() + recordedGaugeMetric.getCpuMetricReadingsCount(); - assertThat(recordedGaugeMetricsCount).isEqualTo(MAX_GAUGE_COUNTER_BEFORE_LOGGING - 10); + assertThat(recordedGaugeMetricsCount).isEqualTo(MAX_GAUGE_COUNTER_LIMIT - 10); assertThat(recordedGaugeMetric.getSessionId()).isEqualTo(testSessionId(1)); @@ -542,7 +541,7 @@ public void testGaugeManagerHandlesMultipleSessionIds() { recordedGaugeMetricsCount = recordedGaugeMetric.getAndroidMemoryReadingsCount() + recordedGaugeMetric.getCpuMetricReadingsCount(); - assertThat(recordedGaugeMetricsCount).isEqualTo(MAX_GAUGE_COUNTER_BEFORE_LOGGING + 1); + assertThat(recordedGaugeMetricsCount).isEqualTo(MAX_GAUGE_COUNTER_LIMIT + 1); assertThat(recordedGaugeMetric.getSessionId()).isEqualTo(testSessionId(2)); } From c5cc8e33d053824ba1250c14f798b59c54d56999 Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Mon, 26 May 2025 16:24:50 -0400 Subject: [PATCH 10/12] Add TODO --- .../com/google/firebase/perf/session/gauges/GaugeCounter.kt | 3 +++ 1 file changed, 3 insertions(+) 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 2cabc59e07a..bb91258d73d 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 @@ -35,6 +35,9 @@ object GaugeCounter { val metricsCount = counter.incrementAndGet() if (metricsCount >= MAX_METRIC_COUNT) { + // TODO(b/394127311): There can be rare conditions where there's an attempt to log metrics + // even when it's currently logging them. While this is a no-op, it might be worth + // exploring optimizing it further to prevent additional calls to [GaugeManager]. gaugeManager.logGaugeMetrics() } } From 39a75d8a66530c9fc33be69643c9d967cf2553da Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Mon, 26 May 2025 16:46:02 -0400 Subject: [PATCH 11/12] Add legacy session logging --- .../java/com/google/firebase/perf/session/SessionManager.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java b/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java index 920fed53463..6fceb64d1e5 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java @@ -157,6 +157,8 @@ public void unregisterForSessionUpdates(WeakReference client } private void logGaugeMetadataIfCollectionEnabled() { + FirebaseSessionsEnforcementCheck.checkSession( + perfSession, "logGaugeMetadataIfCollectionEnabled"); if (perfSession.isVerbose()) { gaugeManager.logGaugeMetadata(perfSession.sessionId()); } From 68c8dcb5840dc6c2a474cef4eeac9fa930452355 Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Mon, 26 May 2025 16:58:55 -0400 Subject: [PATCH 12/12] unused variable --- .../google/firebase/perf/session/gauges/GaugeManagerTest.java | 1 - 1 file changed, 1 deletion(-) 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 ffa7308f835..c111f5fb7a2 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 @@ -60,7 +60,6 @@ public final class GaugeManagerTest extends FirebasePerformanceTestBase { // This is a guesstimate of the max amount of time to wait before any pending metrics' collection // might take. private static final long TIME_TO_WAIT_BEFORE_FLUSHING_GAUGES_QUEUE_MS = 20; - private static final long APPROX_NUMBER_OF_DATA_POINTS_PER_GAUGE_METRIC = 20; private static final long DEFAULT_CPU_GAUGE_COLLECTION_FREQUENCY_BG_MS = 100; private static final long DEFAULT_CPU_GAUGE_COLLECTION_FREQUENCY_FG_MS = 50; private static final long DEFAULT_MEMORY_GAUGE_COLLECTION_FREQUENCY_BG_MS = 120;