Skip to content

Commit f2a4728

Browse files
committed
Re-introduce gauge collection for app start
1 parent 8377e8c commit f2a4728

File tree

6 files changed

+61
-19
lines changed

6 files changed

+61
-19
lines changed

firebase-perf/src/main/java/com/google/firebase/perf/logging/DebugEnforcementCheck.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,18 @@
1616

1717
package com.google.firebase.perf.logging
1818

19+
import com.google.firebase.perf.session.PerfSession
20+
import com.google.firebase.perf.session.isLegacy
21+
1922
class DebugEnforcementCheck {
2023
companion object {
2124
/** When enabled, failed preconditions will cause assertion errors for debugging. */
2225
@JvmStatic var enforcement: Boolean = false
2326
private var logger: AndroidLogger = AndroidLogger.getInstance()
2427

25-
public fun checkSession(isAqsAvailable: Boolean, failureMessage: String) {
26-
if (!isAqsAvailable) {
27-
Companion.logger.debug(failureMessage)
28+
public fun checkSession(session: PerfSession, failureMessage: String) {
29+
if (session.isLegacy()) {
30+
logger.debug("legacy session ${session.sessionId()}: $failureMessage")
2831
assert(!enforcement) { failureMessage }
2932
}
3033
}

firebase-perf/src/main/java/com/google/firebase/perf/session/FirebasePerformanceSessionSubscriber.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616

1717
package com.google.firebase.perf.session
1818

19+
import com.google.firebase.perf.logging.DebugEnforcementCheck
1920
import com.google.firebase.perf.session.gauges.GaugeManager
2021
import com.google.firebase.perf.v1.ApplicationProcessState
2122
import com.google.firebase.sessions.api.SessionSubscriber
22-
import java.util.UUID
2323

2424
class FirebasePerformanceSessionSubscriber(override val isDataCollectionEnabled: Boolean) :
2525
SessionSubscriber {
@@ -28,15 +28,21 @@ class FirebasePerformanceSessionSubscriber(override val isDataCollectionEnabled:
2828

2929
override fun onSessionChanged(sessionDetails: SessionSubscriber.SessionDetails) {
3030
val currentPerfSession = SessionManager.getInstance().perfSession()
31+
DebugEnforcementCheck.checkSession(currentPerfSession, "onSessionChanged")
3132

3233
// A [PerfSession] was created before a session was started.
33-
if (!currentPerfSession.isAQS()) {
34+
// Since these was gauge collection with app startup, it logs them to the updated session ID.
35+
if (currentPerfSession.isLegacy()) {
3436
GaugeManager.getInstance()
35-
.logGaugeMetadata(currentPerfSession.sessionId(), ApplicationProcessState.FOREGROUND)
36-
return
37+
.logGaugeMetadata(sessionDetails.sessionId, ApplicationProcessState.FOREGROUND)
38+
GaugeManager.getInstance()
39+
.stopCollectingGaugesForLegacySession(
40+
sessionDetails.sessionId,
41+
ApplicationProcessState.FOREGROUND
42+
)
3743
}
3844

39-
val updatedSession = PerfSession.createWithId(UUID.randomUUID().toString())
45+
val updatedSession = PerfSession.createWithId(sessionDetails.sessionId)
4046
SessionManager.getInstance().updatePerfSession(updatedSession)
4147
GaugeManager.getInstance()
4248
.logGaugeMetadata(updatedSession.sessionId(), ApplicationProcessState.FOREGROUND)

firebase-perf/src/main/java/com/google/firebase/perf/session/FirebaseSessionsHelper.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ package com.google.firebase.perf.session
33
import com.google.firebase.perf.util.Constants
44
import java.util.UUID
55

6-
/** Identifies whether the [PerfSession] is an AQS or not. */
7-
fun PerfSession.isAQS(): Boolean {
8-
return !this.sessionId().startsWith(Constants.UNDEFINED_AQS_ID_PREFIX)
6+
/** Identifies whether the [PerfSession] is legacy or not. */
7+
fun PerfSession.isLegacy(): Boolean {
8+
return this.sessionId().startsWith(Constants.UNDEFINED_AQS_ID_PREFIX)
99
}
1010

11+
/** Creates a valid session ID for [PerfSession] that can be predictably identified as legacy. */
1112
fun createLegacySessionId(): String {
1213
val uuid = UUID.randomUUID().toString().replace("-", "")
1314
return uuid.replaceRange(

firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import androidx.annotation.VisibleForTesting;
2121
import com.google.firebase.perf.application.AppStateMonitor;
2222
import com.google.firebase.perf.application.AppStateUpdateHandler;
23+
import com.google.firebase.perf.logging.DebugEnforcementCheck;
2324
import com.google.firebase.perf.session.gauges.GaugeManager;
2425
import com.google.firebase.perf.v1.ApplicationProcessState;
2526
import com.google.firebase.perf.v1.GaugeMetadata;
@@ -29,7 +30,6 @@
2930
import java.util.Iterator;
3031
import java.util.Objects;
3132
import java.util.Set;
32-
import java.util.UUID;
3333

3434
/** Session manager to generate sessionIDs and broadcast to the application. */
3535
@Keep // Needed because of b/117526359.
@@ -51,15 +51,13 @@ public static SessionManager getInstance() {
5151

5252
/** Returns the currently active PerfSession. */
5353
public final PerfSession perfSession() {
54+
DebugEnforcementCheck.Companion.checkSession(perfSession, "SessionManager.perfSession()");
5455
return perfSession;
5556
}
5657

5758
private SessionManager() {
5859
// Generate a new sessionID for every cold start.
59-
this(
60-
GaugeManager.getInstance(),
61-
PerfSession.createWithId(UUID.randomUUID().toString()),
62-
AppStateMonitor.getInstance());
60+
this(GaugeManager.getInstance(), PerfSession.createWithId(null), AppStateMonitor.getInstance());
6361
}
6462

6563
@VisibleForTesting

firebase-perf/src/main/java/com/google/firebase/perf/session/gauges/GaugeManager.java

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,40 @@ public void stopCollectingGauges() {
245245
TimeUnit.MILLISECONDS);
246246
}
247247

248+
/**
249+
* Stops the collection of gauges if it was currently collecting them for a legacy session.
250+
*
251+
* @note: This method is NOT thread safe - {@link this.startCollectingGauges()} and {@link
252+
* this.stopCollectingGauges()} should always be called from the same thread.
253+
*/
254+
public void stopCollectingGaugesForLegacySession(
255+
String updatedSessionId, ApplicationProcessState flushToApplicationProcessState) {
256+
final ApplicationProcessState applicationProcessStateForScheduledTask =
257+
flushToApplicationProcessState;
258+
259+
cpuGaugeCollector.get().stopCollecting();
260+
memoryGaugeCollector.get().stopCollecting();
261+
262+
if (gaugeManagerDataCollectionJob != null) {
263+
gaugeManagerDataCollectionJob.cancel(false);
264+
}
265+
266+
final String sessionIdForScheduledTask = updatedSessionId;
267+
this.session = null;
268+
269+
// Flush any data that was collected for this session one last time.
270+
@SuppressWarnings("FutureReturnValueIgnored")
271+
ScheduledFuture<?> unusedFuture =
272+
gaugeManagerExecutor
273+
.get()
274+
.schedule(
275+
() -> {
276+
syncFlush(sessionIdForScheduledTask, applicationProcessStateForScheduledTask);
277+
},
278+
TIME_TO_WAIT_BEFORE_FLUSHING_GAUGES_QUEUE_MS,
279+
TimeUnit.MILLISECONDS);
280+
}
281+
248282
/**
249283
* This method reads any pending data points from all the Gauge's queues, assembles a GaugeMetric
250284
* proto and logs it to transport.
@@ -433,7 +467,7 @@ private long getMemoryGaugeCollectionFrequencyMs(
433467

434468
private boolean isValidSessionForLogging() {
435469
if (session == null) return false;
436-
return session.isGaugeAndEventCollectionEnabled() && FirebaseSessionsHelperKt.isAQS(session);
470+
return session.isGaugeAndEventCollectionEnabled() && FirebaseSessionsHelperKt.isLegacy(session);
437471
}
438472

439473
@VisibleForTesting

firebase-perf/src/test/java/com/google/firebase/perf/session/PerfSessionTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public void instanceCreation() {
6868
assertThat(session.isVerbose()).isTrue();
6969
session.setGaugeAndEventCollectionEnabled(false);
7070
assertThat(session.isVerbose()).isFalse();
71-
assertThat(FirebaseSessionsHelperKt.isAQS(session)).isTrue();
71+
assertThat(FirebaseSessionsHelperKt.isLegacy(session)).isTrue();
7272
}
7373

7474
@Test
@@ -79,7 +79,7 @@ public void legacyInstanceCreation() {
7979
assertThat(perfSession.isVerbose()).isTrue();
8080
perfSession.setGaugeAndEventCollectionEnabled(false);
8181
assertThat(perfSession.isVerbose()).isFalse();
82-
assertThat(FirebaseSessionsHelperKt.isAQS(perfSession)).isFalse();
82+
assertThat(FirebaseSessionsHelperKt.isLegacy(perfSession)).isFalse();
8383
}
8484

8585
@Test

0 commit comments

Comments
 (0)