Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@

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 java.util.Collections
import com.google.firebase.perf.v1.PerfSession as ProtoPerfSession

class FirebaseSessionsEnforcementCheck {
Expand All @@ -27,21 +29,35 @@ class FirebaseSessionsEnforcementCheck {
private var logger: AndroidLogger = AndroidLogger.getInstance()

@JvmStatic
fun checkSession(sessions: List<ProtoPerfSession>, 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<ProtoPerfSession>): List<ProtoPerfSession> {
return if (sessions.count() > 0 && sessions[0].sessionId.isLegacy()) {
val updatedSessions = sessions.toMutableList<ProtoPerfSession>()
Collections.swap(updatedSessions, 0, 1)
updatedSessions
} else {
sessions
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,13 @@ public static SessionManager getInstance() {

/** Returns the currently active PerfSession. */
public final PerfSession perfSession() {
FirebaseSessionsEnforcementCheck.checkSession(perfSession, "PerfSession.perfSession()");

return perfSession;
}

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
Expand All @@ -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();
}
Expand Down Expand Up @@ -158,16 +152,12 @@ public void unregisterForSessionUpdates(WeakReference<SessionAwareObject> 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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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));
}

/**
Expand All @@ -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));
}

/**
Expand All @@ -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));
}
Expand Down
Loading