From 8b08c0c2872f018571a9b8ef4b433a59ca3b1383 Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Mon, 11 Aug 2025 16:27:35 -0400 Subject: [PATCH 1/7] Update legacy session enforcement and debugging logic --- .../FirebaseSessionsEnforcementCheck.kt | 26 ++++++++++++++----- .../FirebasePerformanceSessionSubscriber.kt | 4 +-- .../firebase/perf/session/SessionManager.java | 10 ------- .../perf/transport/TransportManager.java | 13 ++++------ 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt b/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt index 089611564e8..bf81bfe321b 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt +++ b/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt @@ -16,8 +16,9 @@ package com.google.firebase.perf.logging -import com.google.firebase.perf.session.PerfSession import com.google.firebase.perf.session.isLegacy +import com.google.firebase.perf.v1.NetworkRequestMetric +import com.google.firebase.perf.v1.TraceMetric import com.google.firebase.perf.v1.PerfSession as ProtoPerfSession class FirebaseSessionsEnforcementCheck { @@ -27,21 +28,34 @@ class FirebaseSessionsEnforcementCheck { private var logger: AndroidLogger = AndroidLogger.getInstance() @JvmStatic - fun checkSession(sessions: List, failureMessage: String) { - sessions.forEach { checkSession(it.sessionId, failureMessage) } + fun filterLegacySessions(trace: TraceMetric): TraceMetric { + val updatedTrace = trace.toBuilder().clearPerfSessions() + filterLegacySessions(trace.perfSessionsList).forEach { updatedTrace.addPerfSessions(it) } + return updatedTrace.build() } @JvmStatic - fun checkSession(session: PerfSession, failureMessage: String) { - checkSession(session.sessionId(), failureMessage) + fun filterLegacySessions(networkRequestMetric: NetworkRequestMetric): NetworkRequestMetric { + val updatedNetworkRequestMetric = networkRequestMetric.toBuilder().clearPerfSessions() + filterLegacySessions(networkRequestMetric.perfSessionsList).forEach { updatedNetworkRequestMetric.addPerfSessions(it) } + return updatedNetworkRequestMetric.build() } @JvmStatic fun checkSession(sessionId: String, failureMessage: String) { if (sessionId.isLegacy()) { - logger.debug("legacy session ${sessionId}: $failureMessage") + logger.verbose("legacy session ${sessionId}: $failureMessage") assert(!enforcement) { failureMessage } } } + + private fun filterLegacySessions(sessions: List): List { + val updatedSessions = sessions.filter { !it.sessionId.isLegacy() } + return if(updatedSessions.isEmpty()) { + sessions + } else { + updatedSessions + } + } } } 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 0f93f45586e..ba0e8cde002 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,7 +17,7 @@ package com.google.firebase.perf.session import com.google.firebase.perf.config.ConfigResolver -import com.google.firebase.perf.logging.FirebaseSessionsEnforcementCheck +import com.google.firebase.perf.logging.FirebaseSessionsEnforcementCheck.Companion.checkSession import com.google.firebase.sessions.api.SessionSubscriber class FirebasePerformanceSessionSubscriber(val configResolver: ConfigResolver) : SessionSubscriber { @@ -30,7 +30,7 @@ class FirebasePerformanceSessionSubscriber(val configResolver: ConfigResolver) : override fun onSessionChanged(sessionDetails: SessionSubscriber.SessionDetails) { val currentPerfSession = SessionManager.getInstance().perfSession() // TODO(b/394127311): Add logic to deal with app start gauges if necessary. - FirebaseSessionsEnforcementCheck.checkSession(currentPerfSession, "onSessionChanged") + checkSession(currentPerfSession.sessionId(), "onSessionChanged called on Legacy Session ID.") val updatedSession = PerfSession.createWithId(sessionDetails.sessionId) SessionManager.getInstance().updatePerfSession(updatedSession) 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 a5f20ec6aa4..4e5fb4da52f 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 @@ -46,8 +46,6 @@ public static SessionManager getInstance() { /** Returns the currently active PerfSession. */ public final PerfSession perfSession() { - FirebaseSessionsEnforcementCheck.checkSession(perfSession, "PerfSession.perfSession()"); - return perfSession; } @@ -55,7 +53,6 @@ private SessionManager() { // Creates a legacy session by default. This is a safety net to allow initializing // SessionManager - but the current implementation replaces it immediately. this(GaugeManager.getInstance(), PerfSession.createWithId(null)); - FirebaseSessionsEnforcementCheck.checkSession(perfSession, "SessionManager()"); } @VisibleForTesting @@ -78,9 +75,6 @@ public void setApplicationContext(final Context appContext) { * @see PerfSession#isSessionRunningTooLong() */ public void stopGaugeCollectionIfSessionRunningTooLong() { - FirebaseSessionsEnforcementCheck.checkSession( - perfSession, "SessionManager.stopGaugeCollectionIfSessionRunningTooLong"); - if (perfSession.isSessionRunningTooLong()) { gaugeManager.stopCollectingGauges(); } @@ -158,16 +152,12 @@ public void unregisterForSessionUpdates(WeakReference client } private void logGaugeMetadataIfCollectionEnabled() { - FirebaseSessionsEnforcementCheck.checkSession( - perfSession, "logGaugeMetadataIfCollectionEnabled"); if (perfSession.isVerbose()) { gaugeManager.logGaugeMetadata(perfSession.sessionId()); } } private void startOrStopCollectingGauges() { - FirebaseSessionsEnforcementCheck.checkSession(perfSession, "startOrStopCollectingGauges"); - if (perfSession.isVerbose()) { gaugeManager.startCollectingGauges(perfSession); } else { 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 d1eb5ae059c..6f057c9d20c 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 @@ -17,6 +17,8 @@ import static com.google.firebase.perf.util.AppProcessesProvider.getProcessName; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.MINUTES; +import static com.google.firebase.perf.logging.FirebaseSessionsEnforcementCheck.filterLegacySessions; +import static com.google.firebase.perf.logging.FirebaseSessionsEnforcementCheck.checkSession; import android.annotation.SuppressLint; import android.content.Context; @@ -39,7 +41,6 @@ import com.google.firebase.perf.config.ConfigResolver; import com.google.firebase.perf.logging.AndroidLogger; import com.google.firebase.perf.logging.ConsoleUrlGenerator; -import com.google.firebase.perf.logging.FirebaseSessionsEnforcementCheck; import com.google.firebase.perf.metrics.validator.PerfMetricValidator; import com.google.firebase.perf.session.SessionManager; import com.google.firebase.perf.util.Constants; @@ -300,10 +301,8 @@ public void log(final TraceMetric traceMetric) { * {@link #isAllowedToDispatch(PerfMetric)}). */ public void log(final TraceMetric traceMetric, final ApplicationProcessState appState) { - FirebaseSessionsEnforcementCheck.checkSession( - traceMetric.getPerfSessionsList(), "log TraceMetric"); executorService.execute( - () -> syncLog(PerfMetric.newBuilder().setTraceMetric(traceMetric), appState)); + () -> syncLog(PerfMetric.newBuilder().setTraceMetric(filterLegacySessions(traceMetric)), appState)); } /** @@ -330,12 +329,10 @@ public void log(final NetworkRequestMetric networkRequestMetric) { */ public void log( final NetworkRequestMetric networkRequestMetric, final ApplicationProcessState appState) { - FirebaseSessionsEnforcementCheck.checkSession( - networkRequestMetric.getPerfSessionsList(), "log NetworkRequestMetric"); executorService.execute( () -> syncLog( - PerfMetric.newBuilder().setNetworkRequestMetric(networkRequestMetric), appState)); + PerfMetric.newBuilder().setNetworkRequestMetric(filterLegacySessions(networkRequestMetric)), appState)); } /** @@ -361,7 +358,7 @@ public void log(final GaugeMetric gaugeMetric) { * {@link #isAllowedToDispatch(PerfMetric)}). */ public void log(final GaugeMetric gaugeMetric, final ApplicationProcessState appState) { - FirebaseSessionsEnforcementCheck.checkSession(gaugeMetric.getSessionId(), "log GaugeMetric"); + checkSession(gaugeMetric.getSessionId(), "Logging GaugeMetric with Legacy Session ID."); executorService.execute( () -> syncLog(PerfMetric.newBuilder().setGaugeMetric(gaugeMetric), appState)); } From cd880cb000303dffe77ce986586bbbcfbc696f81 Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Mon, 11 Aug 2025 16:29:31 -0400 Subject: [PATCH 2/7] Add an assert --- .../firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt b/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt index bf81bfe321b..2da36f64fa0 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt +++ b/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt @@ -52,6 +52,7 @@ class FirebaseSessionsEnforcementCheck { private fun filterLegacySessions(sessions: List): List { val updatedSessions = sessions.filter { !it.sessionId.isLegacy() } return if(updatedSessions.isEmpty()) { + assert(!enforcement) { "No session besides a legacy session present. "} sessions } else { updatedSessions From 83a1cfc1ba474fd7943b092ad84cb8a579d4adfd Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Mon, 11 Aug 2025 18:03:51 -0400 Subject: [PATCH 3/7] [Draft] Change to swap instead of filter legacy session --- .../perf/logging/FirebaseSessionsEnforcementCheck.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt b/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt index 2da36f64fa0..7bfe14810c2 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt +++ b/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt @@ -19,6 +19,7 @@ package com.google.firebase.perf.logging import com.google.firebase.perf.session.isLegacy import com.google.firebase.perf.v1.NetworkRequestMetric import com.google.firebase.perf.v1.TraceMetric +import java.util.Collections import com.google.firebase.perf.v1.PerfSession as ProtoPerfSession class FirebaseSessionsEnforcementCheck { @@ -50,12 +51,12 @@ class FirebaseSessionsEnforcementCheck { } private fun filterLegacySessions(sessions: List): List { - val updatedSessions = sessions.filter { !it.sessionId.isLegacy() } - return if(updatedSessions.isEmpty()) { - assert(!enforcement) { "No session besides a legacy session present. "} - sessions - } else { + return if (sessions.count() > 0 && sessions[0].sessionId.isLegacy()) { + val updatedSessions = sessions.toMutableList() + Collections.swap(updatedSessions, 0, 1) updatedSessions + } else { + sessions } } } From e0e561d299a77b4367aeff7f1fe49590e2ebe8f9 Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Tue, 12 Aug 2025 12:39:38 -0400 Subject: [PATCH 4/7] Revert some changes - and add a relevant unit test --- .../FirebaseSessionsEnforcementCheck.kt | 30 +---------- .../firebase/perf/session/SessionManager.java | 1 - .../perf/transport/TransportManager.java | 9 ++-- .../session/FirebaseSessionsTestHelper.kt | 2 + .../perf/session/PerfSessionTest.java | 53 +++++++++++++++++++ 5 files changed, 60 insertions(+), 35 deletions(-) diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt b/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt index 7bfe14810c2..0ca22aa88a0 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt +++ b/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt @@ -17,10 +17,6 @@ package com.google.firebase.perf.logging import com.google.firebase.perf.session.isLegacy -import com.google.firebase.perf.v1.NetworkRequestMetric -import com.google.firebase.perf.v1.TraceMetric -import java.util.Collections -import com.google.firebase.perf.v1.PerfSession as ProtoPerfSession class FirebaseSessionsEnforcementCheck { companion object { @@ -28,36 +24,12 @@ class FirebaseSessionsEnforcementCheck { @JvmStatic var enforcement: Boolean = false private var logger: AndroidLogger = AndroidLogger.getInstance() - @JvmStatic - fun filterLegacySessions(trace: TraceMetric): TraceMetric { - val updatedTrace = trace.toBuilder().clearPerfSessions() - filterLegacySessions(trace.perfSessionsList).forEach { updatedTrace.addPerfSessions(it) } - return updatedTrace.build() - } - - @JvmStatic - fun filterLegacySessions(networkRequestMetric: NetworkRequestMetric): NetworkRequestMetric { - val updatedNetworkRequestMetric = networkRequestMetric.toBuilder().clearPerfSessions() - filterLegacySessions(networkRequestMetric.perfSessionsList).forEach { updatedNetworkRequestMetric.addPerfSessions(it) } - return updatedNetworkRequestMetric.build() - } - @JvmStatic fun checkSession(sessionId: String, failureMessage: String) { if (sessionId.isLegacy()) { - logger.verbose("legacy session ${sessionId}: $failureMessage") + logger.verbose("Legacy Session ${sessionId}: $failureMessage") assert(!enforcement) { failureMessage } } } - - private fun filterLegacySessions(sessions: List): List { - return if (sessions.count() > 0 && sessions[0].sessionId.isLegacy()) { - val updatedSessions = sessions.toMutableList() - Collections.swap(updatedSessions, 0, 1) - updatedSessions - } else { - sessions - } - } } } 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 4e5fb4da52f..873965d7aaa 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 @@ -18,7 +18,6 @@ import android.content.Context; import androidx.annotation.Keep; import androidx.annotation.VisibleForTesting; -import com.google.firebase.perf.logging.FirebaseSessionsEnforcementCheck; import com.google.firebase.perf.session.gauges.GaugeManager; import com.google.firebase.perf.v1.GaugeMetadata; import com.google.firebase.perf.v1.GaugeMetric; 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 6f057c9d20c..12f471c659a 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 @@ -14,11 +14,10 @@ package com.google.firebase.perf.transport; +import static com.google.firebase.perf.logging.FirebaseSessionsEnforcementCheck.checkSession; import static com.google.firebase.perf.util.AppProcessesProvider.getProcessName; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.MINUTES; -import static com.google.firebase.perf.logging.FirebaseSessionsEnforcementCheck.filterLegacySessions; -import static com.google.firebase.perf.logging.FirebaseSessionsEnforcementCheck.checkSession; import android.annotation.SuppressLint; import android.content.Context; @@ -302,7 +301,7 @@ public void log(final TraceMetric traceMetric) { */ public void log(final TraceMetric traceMetric, final ApplicationProcessState appState) { executorService.execute( - () -> syncLog(PerfMetric.newBuilder().setTraceMetric(filterLegacySessions(traceMetric)), appState)); + () -> syncLog(PerfMetric.newBuilder().setTraceMetric(traceMetric), appState)); } /** @@ -332,7 +331,7 @@ public void log( executorService.execute( () -> syncLog( - PerfMetric.newBuilder().setNetworkRequestMetric(filterLegacySessions(networkRequestMetric)), appState)); + PerfMetric.newBuilder().setNetworkRequestMetric(networkRequestMetric), appState)); } /** @@ -358,7 +357,7 @@ public void log(final GaugeMetric gaugeMetric) { * {@link #isAllowedToDispatch(PerfMetric)}). */ public void log(final GaugeMetric gaugeMetric, final ApplicationProcessState appState) { - checkSession(gaugeMetric.getSessionId(), "Logging GaugeMetric with Legacy Session ID."); + checkSession(gaugeMetric.getSessionId(), "log(GaugeMetric)"); executorService.execute( () -> syncLog(PerfMetric.newBuilder().setGaugeMetric(gaugeMetric), appState)); } diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/session/FirebaseSessionsTestHelper.kt b/firebase-perf/src/test/java/com/google/firebase/perf/session/FirebaseSessionsTestHelper.kt index a617af94a58..dae8afc3db1 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/session/FirebaseSessionsTestHelper.kt +++ b/firebase-perf/src/test/java/com/google/firebase/perf/session/FirebaseSessionsTestHelper.kt @@ -25,3 +25,5 @@ fun createTestSession(suffix: Int): PerfSession { } fun testSessionId(suffix: Int): String = "abc$suffix" + +fun testLegacySessionId(suffix: Int): String = "zabc$suffix" diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/session/PerfSessionTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/session/PerfSessionTest.java index f7c8d400483..47c6d745baf 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/session/PerfSessionTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/session/PerfSessionTest.java @@ -15,7 +15,9 @@ package com.google.firebase.perf.session; import static com.google.common.truth.Truth.assertThat; +import static com.google.firebase.perf.session.FirebaseSessionsHelperKt.isLegacy; import static com.google.firebase.perf.session.FirebaseSessionsTestHelperKt.createTestSession; +import static com.google.firebase.perf.session.FirebaseSessionsTestHelperKt.testLegacySessionId; import static com.google.firebase.perf.session.FirebaseSessionsTestHelperKt.testSessionId; import static com.google.firebase.perf.util.Constants.PREFS_NAME; import static org.mockito.Mockito.mock; @@ -224,6 +226,57 @@ public void testBuildAndSortMovesTheVerboseSessionToTop() { assertThat(PerfSession.isVerbose(perfSessions[0])).isTrue(); } + @Test + public void testBuildAndSortMovesTheVerboseSessionToTop_legacySession() { + // Force all the sessions from now onwards to be non-verbose + forceNonVerboseSession(); + + // Next, create 3 non-verbose sessions, including a legacy session. + List sessions = new ArrayList<>(); + sessions.add(PerfSession.createWithId(testLegacySessionId(1))); + sessions.add(PerfSession.createWithId(testSessionId(2))); + sessions.add(PerfSession.createWithId(testSessionId(3))); + + // Force all the sessions from now onwards to be verbose + forceVerboseSession(); + + // Next, create 2 verbose sessions + sessions.add(PerfSession.createWithId(testSessionId(4))); + sessions.add(PerfSession.createWithId(testSessionId(5))); + + // Verify that the first session in the list of sessions was not verbose + assertThat(sessions.get(0).isVerbose()).isFalse(); + + com.google.firebase.perf.v1.PerfSession[] perfSessions = + PerfSession.buildAndSort(ImmutableList.copyOf(sessions)); + + // Verify that after building the proto objects for PerfSessions, the first session in the array + // of proto objects is a verbose session + assertThat(PerfSession.isVerbose(perfSessions[0])).isTrue(); + } + + @Test + public void testBuildAndSortKeepsLegacySessionAtTopWithNoVerboseSessions() { + // Force all the sessions from now onwards to be non-verbose + forceNonVerboseSession(); + + // Next, create 3 non-verbose sessions, including a legacy session. + List sessions = new ArrayList<>(); + sessions.add(PerfSession.createWithId(testLegacySessionId(1))); + sessions.add(PerfSession.createWithId(testSessionId(2))); + sessions.add(PerfSession.createWithId(testSessionId(3))); + + // Verify that the first session in the list of sessions was legacy. + assertThat(isLegacy(sessions.get(0))).isTrue(); + + com.google.firebase.perf.v1.PerfSession[] perfSessions = + PerfSession.buildAndSort(ImmutableList.copyOf(sessions)); + + // Verify that after building the proto objects for PerfSessions, the first session in the array + // of proto objects is a legacy session. + assertThat(isLegacy(perfSessions[0].getSessionId())).isTrue(); + } + @Test public void testIsExpiredReturnsFalseWhenCurrentSessionLengthIsLessThanMaxSessionLength() { Timer mockTimer = mock(Timer.class); From 70386684a9ed665cfa8175c3ab586442eaff0262 Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Tue, 12 Aug 2025 13:00:03 -0400 Subject: [PATCH 5/7] Re introduce logging with legacy traces --- .../perf/logging/FirebaseSessionsEnforcementCheck.kt | 6 ++++++ .../google/firebase/perf/transport/TransportManager.java | 2 ++ 2 files changed, 8 insertions(+) diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt b/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt index 0ca22aa88a0..1a85baf632e 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt +++ b/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt @@ -17,6 +17,7 @@ package com.google.firebase.perf.logging import com.google.firebase.perf.session.isLegacy +import com.google.firebase.perf.v1.PerfSession as ProtoPerfSession class FirebaseSessionsEnforcementCheck { companion object { @@ -24,6 +25,11 @@ class FirebaseSessionsEnforcementCheck { @JvmStatic var enforcement: Boolean = false private var logger: AndroidLogger = AndroidLogger.getInstance() + @JvmStatic + fun checkSession(sessions: List, failureMessage: String) { + sessions.forEach { checkSession(it.sessionId, failureMessage) } + } + @JvmStatic fun checkSession(sessionId: String, failureMessage: String) { if (sessionId.isLegacy()) { 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 12f471c659a..10665f14225 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 @@ -300,6 +300,7 @@ public void log(final TraceMetric traceMetric) { * {@link #isAllowedToDispatch(PerfMetric)}). */ public void log(final TraceMetric traceMetric, final ApplicationProcessState appState) { + checkSession(traceMetric.getPerfSessionsList(), "log(TraceMetric)"); executorService.execute( () -> syncLog(PerfMetric.newBuilder().setTraceMetric(traceMetric), appState)); } @@ -328,6 +329,7 @@ public void log(final NetworkRequestMetric networkRequestMetric) { */ public void log( final NetworkRequestMetric networkRequestMetric, final ApplicationProcessState appState) { + checkSession(networkRequestMetric.getPerfSessionsList(), "log(NetworkRequestMetric)"); executorService.execute( () -> syncLog( From 20f96e0ffc561e620c99408a78485070eb543825 Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Tue, 12 Aug 2025 13:02:58 -0400 Subject: [PATCH 6/7] nit --- .../firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt | 2 +- .../perf/session/FirebasePerformanceSessionSubscriber.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt b/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt index 1a85baf632e..bdc2827c6ea 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt +++ b/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt @@ -33,7 +33,7 @@ class FirebaseSessionsEnforcementCheck { @JvmStatic fun checkSession(sessionId: String, failureMessage: String) { if (sessionId.isLegacy()) { - logger.verbose("Legacy Session ${sessionId}: $failureMessage") + logger.verbose("Contains Legacy Session ${sessionId}: $failureMessage") assert(!enforcement) { failureMessage } } } 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 ba0e8cde002..f524e52ed34 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 @@ -30,7 +30,7 @@ class FirebasePerformanceSessionSubscriber(val configResolver: ConfigResolver) : override fun onSessionChanged(sessionDetails: SessionSubscriber.SessionDetails) { val currentPerfSession = SessionManager.getInstance().perfSession() // TODO(b/394127311): Add logic to deal with app start gauges if necessary. - checkSession(currentPerfSession.sessionId(), "onSessionChanged called on Legacy Session ID.") + checkSession(currentPerfSession.sessionId(), "Existing session in onSessionChanged().") val updatedSession = PerfSession.createWithId(sessionDetails.sessionId) SessionManager.getInstance().updatePerfSession(updatedSession) From a104ea45dffcf8951e5f90fbe6c5670bf660fe25 Mon Sep 17 00:00:00 2001 From: Tejas Deshpande Date: Tue, 12 Aug 2025 14:20:42 -0400 Subject: [PATCH 7/7] Update logging for sessions list --- .../perf/logging/FirebaseSessionsEnforcementCheck.kt | 6 ++++-- .../google/firebase/perf/transport/TransportManager.java | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt b/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt index bdc2827c6ea..1efa37050b7 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt +++ b/firebase-perf/src/main/java/com/google/firebase/perf/logging/FirebaseSessionsEnforcementCheck.kt @@ -26,8 +26,10 @@ class FirebaseSessionsEnforcementCheck { private var logger: AndroidLogger = AndroidLogger.getInstance() @JvmStatic - fun checkSession(sessions: List, failureMessage: String) { - sessions.forEach { checkSession(it.sessionId, failureMessage) } + fun checkSessionsList(sessions: List, failureMessage: String) { + if (sessions.count { it.sessionId.isLegacy() } == sessions.size) { + sessions.forEach { checkSession(it.sessionId, failureMessage) } + } } @JvmStatic 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 10665f14225..d53443e471c 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 @@ -15,6 +15,7 @@ package com.google.firebase.perf.transport; import static com.google.firebase.perf.logging.FirebaseSessionsEnforcementCheck.checkSession; +import static com.google.firebase.perf.logging.FirebaseSessionsEnforcementCheck.checkSessionsList; import static com.google.firebase.perf.util.AppProcessesProvider.getProcessName; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.MINUTES; @@ -300,7 +301,7 @@ public void log(final TraceMetric traceMetric) { * {@link #isAllowedToDispatch(PerfMetric)}). */ public void log(final TraceMetric traceMetric, final ApplicationProcessState appState) { - checkSession(traceMetric.getPerfSessionsList(), "log(TraceMetric)"); + checkSessionsList(traceMetric.getPerfSessionsList(), "log(TraceMetric)"); executorService.execute( () -> syncLog(PerfMetric.newBuilder().setTraceMetric(traceMetric), appState)); } @@ -329,7 +330,7 @@ public void log(final NetworkRequestMetric networkRequestMetric) { */ public void log( final NetworkRequestMetric networkRequestMetric, final ApplicationProcessState appState) { - checkSession(networkRequestMetric.getPerfSessionsList(), "log(NetworkRequestMetric)"); + checkSessionsList(networkRequestMetric.getPerfSessionsList(), "log(NetworkRequestMetric)"); executorService.execute( () -> syncLog(