Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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 @@ -22,6 +22,7 @@
import com.google.firebase.perf.config.ConfigResolver;
import com.google.firebase.perf.metrics.AppStartTrace;
import com.google.firebase.perf.session.FirebasePerformanceSessionSubscriber;
import com.google.firebase.perf.session.SessionManager;
import com.google.firebase.sessions.api.FirebaseSessionsDependencies;
import java.util.concurrent.Executor;

Expand All @@ -35,7 +36,7 @@
public class FirebasePerfEarly {

public FirebasePerfEarly(
FirebaseApp app, @Nullable StartupTime startupTime, Executor uiExecutor) {
FirebaseApp app, @Nullable StartupTime startupTime, Executor uiExecutor, SessionManager sessionManager) {
Context context = app.getApplicationContext();

// Initialize ConfigResolver early for accessing device caching layer.
Expand All @@ -44,14 +45,14 @@ public FirebasePerfEarly(

// Register FirebasePerformance as a subscriber ASAP - which will start collecting gauges if the
// FirebaseSession is verbose.
FirebaseSessionsDependencies.register(new FirebasePerformanceSessionSubscriber(configResolver));
FirebaseSessionsDependencies.register(new FirebasePerformanceSessionSubscriber(configResolver, sessionManager));

AppStateMonitor appStateMonitor = AppStateMonitor.getInstance();
appStateMonitor.registerActivityLifecycleCallbacks(context);
appStateMonitor.registerForAppColdStart(new FirebasePerformanceInitializer());

if (startupTime != null) {
AppStartTrace appStartTrace = AppStartTrace.getInstance();
AppStartTrace appStartTrace = AppStartTrace.getInstance(sessionManager);
appStartTrace.registerActivityLifecycleCallbacks(context);
uiExecutor.execute(new AppStartTrace.StartFromBackgroundRunnable(appStartTrace));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@
import com.google.firebase.perf.injection.components.DaggerFirebasePerformanceComponent;
import com.google.firebase.perf.injection.components.FirebasePerformanceComponent;
import com.google.firebase.perf.injection.modules.FirebasePerformanceModule;
import com.google.firebase.perf.session.PerfSession;
import com.google.firebase.perf.session.SessionManager;
import com.google.firebase.perf.session.gauges.GaugeManager;
import com.google.firebase.platforminfo.LibraryVersionComponent;
import com.google.firebase.remoteconfig.RemoteConfigComponent;
import com.google.firebase.sessions.api.FirebaseSessionsDependencies;
Expand Down Expand Up @@ -66,20 +69,26 @@ public List<Component<?>> getComponents() {
.add(Dependency.required(FirebaseInstallationsApi.class))
.add(Dependency.requiredProvider(TransportFactory.class))
.add(Dependency.required(FirebasePerfEarly.class))
.add(Dependency.required(SessionManager.class))
.factory(FirebasePerfRegistrar::providesFirebasePerformance)
.build(),
Component.builder(FirebasePerfEarly.class)
.name(EARLY_LIBRARY_NAME)
.add(Dependency.required(FirebaseApp.class))
.add(Dependency.optionalProvider(StartupTime.class))
.add(Dependency.required(uiExecutor))
.add(Dependency.required(SessionManager.class))
.eagerInDefaultApp()
.factory(
container ->
new FirebasePerfEarly(
container.get(FirebaseApp.class),
container.getProvider(StartupTime.class).get(),
container.get(uiExecutor)))
container.get(uiExecutor),
container.get(SessionManager.class)))
.build(),
Component.builder(SessionManager.class)
.factory(container -> SessionManager.getInstance())
.build(),
/**
* Fireperf SDK is lazily by {@link FirebasePerformanceInitializer} during {@link
Expand All @@ -101,7 +110,8 @@ private static FirebasePerformance providesFirebasePerformance(ComponentContaine
container.get(FirebaseApp.class),
container.get(FirebaseInstallationsApi.class),
container.getProvider(RemoteConfigComponent.class),
container.getProvider(TransportFactory.class)))
container.getProvider(TransportFactory.class),
container.get(SessionManager.class)))
.build();

return component.getFirebasePerformance();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ public static FirebasePerformance getInstance() {
FirebaseSessionsEnforcementCheck.setEnforcement(BuildConfig.ENFORCE_LEGACY_SESSIONS);

TransportManager.getInstance()
.initialize(firebaseApp, firebaseInstallationsApi, transportFactoryProvider);
.initialize(firebaseApp, firebaseInstallationsApi, transportFactoryProvider, sessionManager);

Context appContext = firebaseApp.getApplicationContext();
mMetadataBundle = extractMetadata(appContext);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ public class AppStateMonitor implements ActivityLifecycleCallbacks {
private final TransportManager transportManager;
private final ConfigResolver configResolver;
private final Clock clock;
private final SessionManager sessionManager;
private final boolean screenPerformanceRecordingSupported;

private Timer resumeTime; // The time app comes to foreground
Expand All @@ -84,18 +85,19 @@ public static AppStateMonitor getInstance() {
if (instance == null) {
synchronized (AppStateMonitor.class) {
if (instance == null) {
instance = new AppStateMonitor(TransportManager.getInstance(), new Clock());
instance = new AppStateMonitor(TransportManager.getInstance(), new Clock(), SessionManager.getInstance());
}
}
}
return instance;
}

AppStateMonitor(TransportManager transportManager, Clock clock) {
AppStateMonitor(TransportManager transportManager, Clock clock, SessionManager sessionManager) {
this(
transportManager,
clock,
ConfigResolver.getInstance(),
sessionManager,
isScreenPerformanceRecordingSupported());
}

Expand All @@ -104,10 +106,12 @@ public static AppStateMonitor getInstance() {
TransportManager transportManager,
Clock clock,
ConfigResolver configResolver,
SessionManager sessionManager,
boolean screenPerformanceRecordingSupported) {
this.transportManager = transportManager;
this.clock = clock;
this.configResolver = configResolver;
this.sessionManager = sessionManager;
this.screenPerformanceRecordingSupported = screenPerformanceRecordingSupported;
}

Expand Down Expand Up @@ -379,7 +383,7 @@ private void sendSessionLog(String name, Timer startTime, Timer endTime) {
.setName(name)
.setClientStartTimeUs(startTime.getMicros())
.setDurationUs(startTime.getDurationMicros(endTime))
.addPerfSessions(SessionManager.getInstance().perfSession().build());
.addPerfSessions(sessionManager.perfSession().build());
// Atomically get mTsnsCount and set it to zero.
int tsnsCount = this.tsnsCount.getAndSet(0);
synchronized (metricToCountMap) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,19 @@ public class FirebasePerformanceModule {
private final FirebaseInstallationsApi firebaseInstallations;
private final Provider<RemoteConfigComponent> remoteConfigComponentProvider;
private final Provider<TransportFactory> transportFactoryProvider;
private final SessionManager sessionManager;

public FirebasePerformanceModule(
@NonNull FirebaseApp firebaseApp,
@NonNull FirebaseInstallationsApi firebaseInstallations,
@NonNull Provider<RemoteConfigComponent> remoteConfigComponentProvider,
@NonNull Provider<TransportFactory> transportFactoryProvider) {
@NonNull Provider<TransportFactory> transportFactoryProvider,
@NonNull SessionManager sessionManager) {
this.firebaseApp = firebaseApp;
this.firebaseInstallations = firebaseInstallations;
this.remoteConfigComponentProvider = remoteConfigComponentProvider;
this.transportFactoryProvider = transportFactoryProvider;
this.sessionManager = sessionManager;
}

@Provides
Expand Down Expand Up @@ -78,6 +81,6 @@ ConfigResolver providesConfigResolver() {

@Provides
SessionManager providesSessionManager() {
return SessionManager.getInstance();
return sessionManager;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ public class AppStartTrace implements ActivityLifecycleCallbacks, LifecycleObser
private final TransportManager transportManager;
private final Clock clock;
private final ConfigResolver configResolver;
private final SessionManager sessionManager;
private final TraceMetric.Builder experimentTtid;
private Context appContext;

Expand Down Expand Up @@ -166,13 +167,13 @@ public static void setLauncherActivityOnResumeTime(String activity) {
// no-op, for backward compatibility with old version plugin.
}

public static AppStartTrace getInstance() {
return instance != null ? instance : getInstance(TransportManager.getInstance(), new Clock());
public static AppStartTrace getInstance(SessionManager sessionManager) {
return instance != null ? instance : getInstance(TransportManager.getInstance(), new Clock(), sessionManager);
}

// TODO(b/258263016): Migrate to go/firebase-android-executors
@SuppressLint("ThreadPoolCreation")
static AppStartTrace getInstance(TransportManager transportManager, Clock clock) {
static AppStartTrace getInstance(TransportManager transportManager, Clock clock, SessionManager sessionManager) {
if (instance == null) {
synchronized (AppStartTrace.class) {
if (instance == null) {
Expand All @@ -181,6 +182,7 @@ static AppStartTrace getInstance(TransportManager transportManager, Clock clock)
transportManager,
clock,
ConfigResolver.getInstance(),
sessionManager,
new ThreadPoolExecutor(
CORE_POOL_SIZE,
MAX_POOL_SIZE,
Expand All @@ -198,10 +200,12 @@ static AppStartTrace getInstance(TransportManager transportManager, Clock clock)
@NonNull TransportManager transportManager,
@NonNull Clock clock,
@NonNull ConfigResolver configResolver,
@NonNull SessionManager sessionManager,
@NonNull ExecutorService executorService) {
this.transportManager = transportManager;
this.clock = clock;
this.configResolver = configResolver;
this.sessionManager = sessionManager;
this.executorService = executorService;
this.experimentTtid = TraceMetric.newBuilder().setName("_experiment_app_start_ttid");
// Set the timestamp for process-start (beginning of BIND_APPLICATION), if available
Expand Down Expand Up @@ -415,7 +419,7 @@ public synchronized void onActivityResumed(Activity activity) {
appStartActivity = new WeakReference<Activity>(activity);

onResumeTime = clock.getTime();
this.startSession = SessionManager.getInstance().perfSession();
this.startSession = sessionManager.perfSession();
AndroidLogger.getInstance()
.debug(
"onResume(): "
Expand Down Expand Up @@ -560,11 +564,11 @@ public static boolean isAnyAppProcessInForeground(Context appContext) {
if (appProcess.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
continue;
}
if (appProcess.processName.equals(appProcessName)
|| appProcess.processName.startsWith(allowedAppProcessNamePrefix)) {
// Returns true if the process with `IMPORTANCE_FOREGROUND` matches current process.
return true;
}
// if (appProcess.processName.equals(appProcessName)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jrodiz do we need to get rid of this code?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had to comment out this code because the branch was not compiling the sessions test app, so this is not part of the scope for this task

// || appProcess.processName.startsWith(allowedAppProcessNamePrefix)) {
// // Returns true if the process with `IMPORTANCE_FOREGROUND` matches current process.
// return true;
// }
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ public final class NetworkRequestMetricBuilder extends AppStateUpdateHandler
private final List<PerfSession> sessions;
private final GaugeManager gaugeManager;
private final TransportManager transportManager;
private final SessionManager sessionManager;

private final NetworkRequestMetric.Builder builder = NetworkRequestMetric.newBuilder();
private final WeakReference<SessionAwareObject> weakReference = new WeakReference<>(this);
Expand Down Expand Up @@ -89,7 +90,7 @@ public static NetworkRequestMetricBuilder builder(TransportManager transportMana
* initialize them.
*/
private NetworkRequestMetricBuilder(TransportManager transportManager) {
this(transportManager, AppStateMonitor.getInstance(), GaugeManager.getInstance());
this(transportManager, AppStateMonitor.getInstance(), GaugeManager.getInstance(), SessionManager.getInstance());
}

/**
Expand All @@ -99,11 +100,13 @@ private NetworkRequestMetricBuilder(TransportManager transportManager) {
public NetworkRequestMetricBuilder(
TransportManager transportManager,
AppStateMonitor appStateMonitor,
GaugeManager gaugeManager) {
GaugeManager gaugeManager,
SessionManager sessionManager) {
super(appStateMonitor);

this.transportManager = transportManager;
this.gaugeManager = gaugeManager;
this.sessionManager = sessionManager;
sessions = Collections.synchronizedList(new ArrayList<>());

registerForAppState();
Expand Down Expand Up @@ -227,9 +230,8 @@ public NetworkRequestMetricBuilder setCustomAttributes(Map<String, String> attri
* @see PerfSession#isVerbose()
*/
public NetworkRequestMetricBuilder setRequestStartTimeMicros(long time) {
SessionManager sessionManager = SessionManager.getInstance();
PerfSession perfSession = sessionManager.perfSession();
SessionManager.getInstance().registerForSessionUpdates(weakReference);
sessionManager.registerForSessionUpdates(weakReference);

builder.setClientStartTimeUs(time);
updateSession(perfSession);
Expand Down Expand Up @@ -270,8 +272,8 @@ public long getTimeToResponseInitiatedMicros() {
public NetworkRequestMetricBuilder setTimeToResponseCompletedMicros(long time) {
builder.setTimeToResponseCompletedUs(time);

if (SessionManager.getInstance().perfSession().isVerbose()) {
gaugeManager.collectGaugeMetricOnce(SessionManager.getInstance().perfSession().getTimer());
if (sessionManager.perfSession().isVerbose()) {
gaugeManager.collectGaugeMetricOnce(sessionManager.perfSession().getTimer());
}

return this;
Expand Down Expand Up @@ -309,7 +311,7 @@ public NetworkRequestMetricBuilder setNetworkClientErrorReason() {

/** Builds the current {@link NetworkRequestMetric}. */
public NetworkRequestMetric build() {
SessionManager.getInstance().unregisterForSessionUpdates(weakReference);
sessionManager.unregisterForSessionUpdates(weakReference);
unregisterForAppState();

com.google.firebase.perf.v1.PerfSession[] perfSessions =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ public class Trace extends AppStateUpdateHandler

private final Trace parent;
private final GaugeManager gaugeManager;
private final SessionManager sessionManager;
private final String name;

private final Map<String, Counter> counterNameToCounterMap;
Expand Down Expand Up @@ -138,6 +139,7 @@ private Trace(
transportManager = parent.transportManager;
sessions = Collections.synchronizedList(new ArrayList<>());
gaugeManager = this.parent.gaugeManager;
sessionManager = this.parent.sessionManager;
}

/**
Expand All @@ -154,6 +156,14 @@ public Trace(
this(name, transportManager, clock, appStateMonitor, GaugeManager.getInstance());
}

public Trace(
@NonNull String name,
@NonNull TransportManager transportManager,
@NonNull Clock clock,
@NonNull AppStateMonitor appStateMonitor,
@NonNull GaugeManager gaugeManager) {
this(name, transportManager, clock, appStateMonitor, gaugeManager, SessionManager.getInstance());
}
/**
* Creates a Trace object with the given name. TransportManager, Clock and GaugeManager instances
* are for testing.
Expand All @@ -165,7 +175,8 @@ public Trace(
@NonNull TransportManager transportManager,
@NonNull Clock clock,
@NonNull AppStateMonitor appStateMonitor,
@NonNull GaugeManager gaugeManager) {
@NonNull GaugeManager gaugeManager,
@NonNull SessionManager sessionManager) {
super(appStateMonitor);
parent = null;
this.name = name.trim();
Expand All @@ -176,6 +187,7 @@ public Trace(
this.transportManager = transportManager;
sessions = Collections.synchronizedList(new ArrayList<>());
this.gaugeManager = gaugeManager;
this.sessionManager = sessionManager;
}

private Trace(@NonNull Parcel in, boolean isDataOnly) {
Expand All @@ -201,6 +213,7 @@ private Trace(@NonNull Parcel in, boolean isDataOnly) {
clock = new Clock();
gaugeManager = GaugeManager.getInstance();
}
sessionManager = SessionManager.getInstance();
}

/** Starts this trace. */
Expand All @@ -227,9 +240,8 @@ public void start() {

registerForAppState();

SessionManager sessionManager = SessionManager.getInstance();
PerfSession perfSession = sessionManager.perfSession();
SessionManager.getInstance().registerForSessionUpdates(sessionAwareObject);
sessionManager.registerForSessionUpdates(sessionAwareObject);

updateSession(perfSession);

Expand All @@ -250,7 +262,7 @@ public void stop() {
return;
}

SessionManager.getInstance().unregisterForSessionUpdates(sessionAwareObject);
sessionManager.unregisterForSessionUpdates(sessionAwareObject);

unregisterForAppState();
endTime = clock.getTime();
Expand All @@ -259,9 +271,9 @@ public void stop() {
if (!name.isEmpty()) {
transportManager.log(new TraceMetricBuilder(this).build(), getAppState());

if (SessionManager.getInstance().perfSession().isVerbose()) {
if (sessionManager.perfSession().isVerbose()) {
gaugeManager.collectGaugeMetricOnce(
SessionManager.getInstance().perfSession().getTimer());
sessionManager.perfSession().getTimer());
}
} else {
logger.error("Trace name is empty, no log is sent to server");
Expand Down
Loading
Loading