Skip to content

Commit 5423a97

Browse files
committed
move log and non-fatal presistence to disk write worker
1 parent 26c8a5a commit 5423a97

File tree

5 files changed

+61
-81
lines changed

5 files changed

+61
-81
lines changed

firebase-crashlytics/src/androidTest/java/com/google/firebase/crashlytics/internal/common/SessionReportingCoordinatorTest.java

Lines changed: 25 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333

3434
import com.google.android.gms.tasks.Task;
3535
import com.google.android.gms.tasks.Tasks;
36+
import com.google.firebase.concurrent.TestOnlyExecutors;
37+
import com.google.firebase.crashlytics.internal.CrashlyticsWorker;
3638
import com.google.firebase.crashlytics.internal.metadata.LogFileManager;
3739
import com.google.firebase.crashlytics.internal.metadata.UserMetadata;
3840
import com.google.firebase.crashlytics.internal.model.CrashlyticsReport;
@@ -69,6 +71,8 @@ public class SessionReportingCoordinatorTest {
6971

7072
private SessionReportingCoordinator reportingCoordinator;
7173

74+
private CrashlyticsWorker diskWriteWorker = new CrashlyticsWorker(TestOnlyExecutors.background());
75+
7276
@Before
7377
public void setUp() {
7478
MockitoAnnotations.initMocks(this);
@@ -80,7 +84,8 @@ public void setUp() {
8084
reportSender,
8185
logFileManager,
8286
reportMetadata,
83-
idManager);
87+
idManager,
88+
diskWriteWorker);
8489
}
8590

8691
@Test
@@ -116,7 +121,8 @@ public void testFatalEvent_persistsHighPriorityEventWithAllThreadsForSessionId()
116121
}
117122

118123
@Test
119-
public void testNonFatalEvent_persistsNormalPriorityEventWithoutAllThreadsForSessionId() {
124+
public void testNonFatalEvent_persistsNormalPriorityEventWithoutAllThreadsForSessionId()
125+
throws Exception {
120126
final String eventType = "error";
121127
final String sessionId = "testSessionId";
122128
final long timestamp = System.currentTimeMillis();
@@ -126,6 +132,8 @@ public void testNonFatalEvent_persistsNormalPriorityEventWithoutAllThreadsForSes
126132
reportingCoordinator.onBeginSession(sessionId, timestamp);
127133
reportingCoordinator.persistNonFatalEvent(mockException, mockThread, sessionId, timestamp);
128134

135+
diskWriteWorker.await();
136+
129137
final boolean expectedAllThreads = false;
130138
final boolean expectedHighPriority = false;
131139

@@ -136,7 +144,7 @@ public void testNonFatalEvent_persistsNormalPriorityEventWithoutAllThreadsForSes
136144
}
137145

138146
@Test
139-
public void testNonFatalEvent_addsLogsToEvent() {
147+
public void testNonFatalEvent_addsLogsToEvent() throws Exception {
140148
long timestamp = System.currentTimeMillis();
141149

142150
mockEventInteractions();
@@ -149,14 +157,16 @@ public void testNonFatalEvent_addsLogsToEvent() {
149157
reportingCoordinator.onBeginSession(sessionId, timestamp);
150158
reportingCoordinator.persistNonFatalEvent(mockException, mockThread, sessionId, timestamp);
151159

160+
diskWriteWorker.await();
161+
152162
verify(mockEventBuilder)
153163
.setLog(CrashlyticsReport.Session.Event.Log.builder().setContent(testLog).build());
154164
verify(mockEventBuilder).build();
155165
verify(logFileManager, never()).clearLog();
156166
}
157167

158168
@Test
159-
public void testNonFatalEvent_addsNoLogsToEventWhenNoneAvailable() {
169+
public void testNonFatalEvent_addsNoLogsToEventWhenNoneAvailable() throws Exception {
160170
long timestamp = System.currentTimeMillis();
161171

162172
mockEventInteractions();
@@ -168,6 +178,8 @@ public void testNonFatalEvent_addsNoLogsToEventWhenNoneAvailable() {
168178
reportingCoordinator.onBeginSession(sessionId, timestamp);
169179
reportingCoordinator.persistNonFatalEvent(mockException, mockThread, sessionId, timestamp);
170180

181+
diskWriteWorker.await();
182+
171183
verify(mockEventBuilder, never()).setLog(any(CrashlyticsReport.Session.Event.Log.class));
172184
verify(mockEventBuilder).build();
173185
verify(logFileManager, never()).clearLog();
@@ -212,7 +224,7 @@ public void testFatalEvent_addsNoLogsToEventWhenNoneAvailable() {
212224
}
213225

214226
@Test
215-
public void testNonFatalEvent_addsSortedKeysToEvent() {
227+
public void testNonFatalEvent_addsSortedKeysToEvent() throws Exception {
216228
final long timestamp = System.currentTimeMillis();
217229

218230
mockEventInteractions();
@@ -243,6 +255,8 @@ public void testNonFatalEvent_addsSortedKeysToEvent() {
243255
reportingCoordinator.onBeginSession(sessionId, timestamp);
244256
reportingCoordinator.persistNonFatalEvent(mockException, mockThread, sessionId, timestamp);
245257

258+
diskWriteWorker.await();
259+
246260
verify(mockEventAppBuilder).setCustomAttributes(expectedCustomAttributes);
247261
verify(mockEventAppBuilder).setInternalKeys(expectedCustomAttributes);
248262
verify(mockEventAppBuilder).build();
@@ -252,7 +266,7 @@ public void testNonFatalEvent_addsSortedKeysToEvent() {
252266
}
253267

254268
@Test
255-
public void testNonFatalEvent_addsNoKeysToEventWhenNoneAvailable() {
269+
public void testNonFatalEvent_addsNoKeysToEventWhenNoneAvailable() throws Exception {
256270
final long timestamp = System.currentTimeMillis();
257271

258272
mockEventInteractions();
@@ -266,6 +280,8 @@ public void testNonFatalEvent_addsNoKeysToEventWhenNoneAvailable() {
266280
reportingCoordinator.onBeginSession(sessionId, timestamp);
267281
reportingCoordinator.persistNonFatalEvent(mockException, mockThread, sessionId, timestamp);
268282

283+
diskWriteWorker.await();
284+
269285
verify(mockEventAppBuilder, never()).setCustomAttributes(anyList());
270286
verify(mockEventAppBuilder, never()).build();
271287
verify(mockEventBuilder, never()).setApp(mockEventApp);
@@ -274,7 +290,7 @@ public void testNonFatalEvent_addsNoKeysToEventWhenNoneAvailable() {
274290
}
275291

276292
@Test
277-
public void testNonFatalEvent_addRolloutsEvent() {
293+
public void testNonFatalEvent_addRolloutsEvent() throws Exception {
278294
long timestamp = System.currentTimeMillis();
279295
String sessionId = "testSessionId";
280296
mockEventInteractions();
@@ -287,6 +303,8 @@ public void testNonFatalEvent_addRolloutsEvent() {
287303
reportingCoordinator.onBeginSession(sessionId, timestamp);
288304
reportingCoordinator.persistNonFatalEvent(mockException, mockThread, sessionId, timestamp);
289305

306+
diskWriteWorker.await();
307+
290308
verify(mockEventAppBuilder, never()).setCustomAttributes(anyList());
291309
verify(mockEventAppBuilder, never()).build();
292310
verify(mockEventBuilder, never()).setApp(mockEventApp);
@@ -417,35 +435,6 @@ public void testFatalEvent_addRolloutsToEvent() {
417435
verify(mockEventBuilder, times(2)).build();
418436
}
419437

420-
@Test
421-
public void onLog_writesToLogFileManager() {
422-
long timestamp = System.currentTimeMillis();
423-
String log = "this is a log";
424-
425-
reportingCoordinator.onLog(timestamp, log);
426-
427-
verify(logFileManager).writeToLog(timestamp, log);
428-
}
429-
430-
@Test
431-
public void onCustomKey_writesToReportMetadata() {
432-
final String key = "key";
433-
final String value = "value";
434-
435-
reportingCoordinator.onCustomKey(key, value);
436-
437-
verify(reportMetadata).setCustomKey(key, value);
438-
}
439-
440-
@Test
441-
public void onUserId_writesUserToReportMetadata() {
442-
final String userId = "testUser";
443-
444-
reportingCoordinator.onUserId(userId);
445-
446-
verify(reportMetadata).setUserId(userId);
447-
}
448-
449438
@Test
450439
public void testFinalizeSessionWithNativeEvent_createsCrashlyticsReportWithNativePayload() {
451440
byte[] testBytes = {0, 2, 20, 10};

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsCore.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@ public boolean onPreExecute(AppData appData, SettingsProvider settingsProvider)
172172
stackTraceTrimmingStrategy,
173173
settingsProvider,
174174
onDemandCounter,
175-
sessionsSubscriber);
175+
sessionsSubscriber,
176+
diskWriteWorker);
176177

177178
controller =
178179
new CrashlyticsController(
@@ -337,7 +338,7 @@ public void logException(@NonNull Throwable throwable) {
337338
*/
338339
public void log(final String msg) {
339340
final long timestamp = System.currentTimeMillis() - startTime;
340-
commonWorker.submit(() -> controller.writeToLog(timestamp, msg));
341+
diskWriteWorker.submit(() -> controller.writeToLog(timestamp, msg));
341342
}
342343

343344
public void setUserId(String identifier) {

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsLifecycleEvents.java

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -25,27 +25,4 @@ interface CrashlyticsLifecycleEvents {
2525
* @param sessionId the identifier for the new session
2626
*/
2727
void onBeginSession(@NonNull String sessionId, long timestamp);
28-
29-
/**
30-
* Called when a message is logged by the user.
31-
*
32-
* @param timestamp the timestamp of the message (in milliseconds since app launch)
33-
* @param log the log message
34-
*/
35-
void onLog(long timestamp, String log);
36-
37-
/**
38-
* Called when a custom key is set by the user.
39-
*
40-
* @param key
41-
* @param value
42-
*/
43-
void onCustomKey(String key, String value);
44-
45-
/**
46-
* Called when a user ID is set by the user.
47-
*
48-
* @param userId
49-
*/
50-
void onUserId(String userId);
5128
}

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/SessionReportingCoordinator.java

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import androidx.annotation.VisibleForTesting;
2424
import com.google.android.gms.tasks.Task;
2525
import com.google.android.gms.tasks.Tasks;
26+
import com.google.firebase.crashlytics.internal.CrashlyticsWorker;
2627
import com.google.firebase.crashlytics.internal.Logger;
2728
import com.google.firebase.crashlytics.internal.metadata.LogFileManager;
2829
import com.google.firebase.crashlytics.internal.metadata.UserMetadata;
@@ -68,7 +69,8 @@ public static SessionReportingCoordinator create(
6869
StackTraceTrimmingStrategy stackTraceTrimmingStrategy,
6970
SettingsProvider settingsProvider,
7071
OnDemandCounter onDemandCounter,
71-
CrashlyticsAppQualitySessionsSubscriber sessionsSubscriber) {
72+
CrashlyticsAppQualitySessionsSubscriber sessionsSubscriber,
73+
CrashlyticsWorker diskWriteWorker) {
7274
final CrashlyticsReportDataCapture dataCapture =
7375
new CrashlyticsReportDataCapture(
7476
context, idManager, appData, stackTraceTrimmingStrategy, settingsProvider);
@@ -77,7 +79,13 @@ public static SessionReportingCoordinator create(
7779
final DataTransportCrashlyticsReportSender reportSender =
7880
DataTransportCrashlyticsReportSender.create(context, settingsProvider, onDemandCounter);
7981
return new SessionReportingCoordinator(
80-
dataCapture, reportPersistence, reportSender, logFileManager, userMetadata, idManager);
82+
dataCapture,
83+
reportPersistence,
84+
reportSender,
85+
logFileManager,
86+
userMetadata,
87+
idManager,
88+
diskWriteWorker);
8189
}
8290

8391
private final CrashlyticsReportDataCapture dataCapture;
@@ -87,19 +95,23 @@ public static SessionReportingCoordinator create(
8795
private final UserMetadata reportMetadata;
8896
private final IdManager idManager;
8997

98+
final CrashlyticsWorker diskWriteWorker;
99+
90100
SessionReportingCoordinator(
91101
CrashlyticsReportDataCapture dataCapture,
92102
CrashlyticsReportPersistence reportPersistence,
93103
DataTransportCrashlyticsReportSender reportsSender,
94104
LogFileManager logFileManager,
95105
UserMetadata reportMetadata,
96-
IdManager idManager) {
106+
IdManager idManager,
107+
CrashlyticsWorker diskWriteWorker) {
97108
this.dataCapture = dataCapture;
98109
this.reportPersistence = reportPersistence;
99110
this.reportsSender = reportsSender;
100111
this.logFileManager = logFileManager;
101112
this.reportMetadata = reportMetadata;
102113
this.idManager = idManager;
114+
this.diskWriteWorker = diskWriteWorker;
103115
}
104116

105117
@Override
@@ -110,21 +122,6 @@ public void onBeginSession(@NonNull String sessionId, long timestampSeconds) {
110122
reportPersistence.persistReport(capturedReport);
111123
}
112124

113-
@Override
114-
public void onLog(long timestamp, String log) {
115-
logFileManager.writeToLog(timestamp, log);
116-
}
117-
118-
@Override
119-
public void onCustomKey(String key, String value) {
120-
reportMetadata.setCustomKey(key, value);
121-
}
122-
123-
@Override
124-
public void onUserId(String userId) {
125-
reportMetadata.setUserId(userId);
126-
}
127-
128125
public void persistFatalEvent(
129126
@NonNull Throwable event, @NonNull Thread thread, @NonNull String sessionId, long timestamp) {
130127
Logger.getLogger().v("Persisting fatal event for session " + sessionId);
@@ -339,8 +336,19 @@ private void persistEvent(
339336
EVENT_THREAD_IMPORTANCE,
340337
MAX_CHAINED_EXCEPTION_DEPTH,
341338
includeAllThreads);
339+
CrashlyticsReport.Session.Event finallizedEvent = addMetaDataToEvent(capturedEvent);
340+
341+
// Non-fatal case, non-fatal does not include all threads
342+
// We move to diskWriteWorker for persistence
343+
if (!includeAllThreads) {
344+
diskWriteWorker.submit(
345+
() -> {
346+
reportPersistence.persistEvent(finallizedEvent, sessionId, isHighPriority);
347+
});
348+
return;
349+
}
342350

343-
reportPersistence.persistEvent(addMetaDataToEvent(capturedEvent), sessionId, isHighPriority);
351+
reportPersistence.persistEvent(finallizedEvent, sessionId, isHighPriority);
344352
}
345353

346354
private boolean onReportSendComplete(@NonNull Task<CrashlyticsReportWithSessionId> task) {

firebase-crashlytics/src/test/java/com/google/firebase/crashlytics/internal/common/SessionReportingCoordinatorRobolectricTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import android.os.Build;
2929
import androidx.annotation.RequiresApi;
3030
import androidx.test.core.app.ApplicationProvider;
31+
import com.google.firebase.concurrent.TestOnlyExecutors;
32+
import com.google.firebase.crashlytics.internal.CrashlyticsWorker;
3133
import com.google.firebase.crashlytics.internal.metadata.LogFileManager;
3234
import com.google.firebase.crashlytics.internal.metadata.UserMetadata;
3335
import com.google.firebase.crashlytics.internal.model.CrashlyticsReport;
@@ -61,6 +63,8 @@ public class SessionReportingCoordinatorRobolectricTest {
6163

6264
private SessionReportingCoordinator reportingCoordinator;
6365

66+
private CrashlyticsWorker diskWriteWorker = new CrashlyticsWorker(TestOnlyExecutors.background());
67+
6468
@Before
6569
public void setUp() {
6670
MockitoAnnotations.initMocks(this);
@@ -72,7 +76,8 @@ public void setUp() {
7276
reportSender,
7377
logFileManager,
7478
reportMetadata,
75-
idManager);
79+
idManager,
80+
diskWriteWorker);
7681
mockEventInteractions();
7782
}
7883

0 commit comments

Comments
 (0)