Skip to content

Commit 6ec9ceb

Browse files
committed
feat: add debug error params
1 parent 65b3b8a commit 6ec9ceb

File tree

6 files changed

+141
-1
lines changed

6 files changed

+141
-1
lines changed

Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1466,6 +1466,7 @@ private void trackEventI(AdjustEvent event) {
14661466
updateActivityStateI(now);
14671467

14681468
PackageBuilder eventBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now);
1469+
eventBuilder.internalState = internalState;
14691470
ActivityPackage eventPackage = eventBuilder.buildEventPackage(event, internalState.isInDelayedStart());
14701471
packageHandler.addPackage(eventPackage);
14711472

@@ -2105,6 +2106,7 @@ public static boolean deleteSessionPartnerParameters(Context context) {
21052106
private void transferSessionPackageI(long now) {
21062107
PackageBuilder builder = new PackageBuilder(adjustConfig, deviceInfo, activityState,
21072108
sessionParameters, now);
2109+
builder.internalState = internalState;
21082110
ActivityPackage sessionPackage = builder.buildSessionPackage(internalState.isInDelayedStart());
21092111
packageHandler.addPackage(sessionPackage);
21102112
packageHandler.sendFirstPackage();
@@ -2369,6 +2371,7 @@ private void setPushTokenI(String token) {
23692371

23702372
long now = System.currentTimeMillis();
23712373
PackageBuilder infoPackageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now);
2374+
infoPackageBuilder.internalState = internalState;
23722375

23732376
ActivityPackage infoPackage = infoPackageBuilder.buildInfoPackage(Constants.PUSH);
23742377
packageHandler.addPackage(infoPackage);
@@ -2393,6 +2396,7 @@ private void gdprForgetMeI() {
23932396

23942397
long now = System.currentTimeMillis();
23952398
PackageBuilder gdprPackageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now);
2399+
gdprPackageBuilder.internalState = internalState;
23962400

23972401
ActivityPackage gdprPackage = gdprPackageBuilder.buildGdprPackage();
23982402
packageHandler.addPackage(gdprPackage);
@@ -2427,6 +2431,7 @@ private void disableThirdPartySharingI() {
24272431

24282432
long now = System.currentTimeMillis();
24292433
PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now);
2434+
packageBuilder.internalState = internalState;
24302435

24312436
ActivityPackage activityPackage = packageBuilder.buildDisableThirdPartySharingPackage();
24322437
packageHandler.addPackage(activityPackage);
@@ -2457,6 +2462,7 @@ private void trackThirdPartySharingI(final AdjustThirdPartySharing adjustThirdPa
24572462
long now = System.currentTimeMillis();
24582463
PackageBuilder packageBuilder = new PackageBuilder(
24592464
adjustConfig, deviceInfo, activityState, sessionParameters, now);
2465+
packageBuilder.internalState = internalState;
24602466

24612467
ActivityPackage activityPackage =
24622468
packageBuilder.buildThirdPartySharingPackage(adjustThirdPartySharing);
@@ -2480,6 +2486,7 @@ private void trackMeasurementConsentI(final boolean consentMeasurement) {
24802486
long now = System.currentTimeMillis();
24812487
PackageBuilder packageBuilder = new PackageBuilder(
24822488
adjustConfig, deviceInfo, activityState, sessionParameters, now);
2489+
packageBuilder.internalState = internalState;
24832490

24842491
ActivityPackage activityPackage =
24852492
packageBuilder.buildMeasurementConsentPackage(consentMeasurement);
@@ -2500,6 +2507,7 @@ private void trackAdRevenueI(String source, JSONObject adRevenueJson) {
25002507
long now = System.currentTimeMillis();
25012508

25022509
PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now);
2510+
packageBuilder.internalState = internalState;
25032511

25042512
ActivityPackage adRevenuePackage = packageBuilder.buildAdRevenuePackage(source, adRevenueJson);
25052513
packageHandler.addPackage(adRevenuePackage);
@@ -2515,6 +2523,7 @@ private void trackAdRevenueI(AdjustAdRevenue adjustAdRevenue) {
25152523
long now = System.currentTimeMillis();
25162524

25172525
PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now);
2526+
packageBuilder.internalState = internalState;
25182527

25192528
ActivityPackage adRevenuePackage = packageBuilder.buildAdRevenuePackage(adjustAdRevenue, internalState.isInDelayedStart());
25202529
packageHandler.addPackage(adRevenuePackage);
@@ -2529,6 +2538,7 @@ private void trackSubscriptionI(final AdjustPlayStoreSubscription subscription)
25292538
long now = System.currentTimeMillis();
25302539

25312540
PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now);
2541+
packageBuilder.internalState = internalState;
25322542

25332543
ActivityPackage subscriptionPackage = packageBuilder.buildSubscriptionPackage(subscription, internalState.isInDelayedStart());
25342544
packageHandler.addPackage(subscriptionPackage);
@@ -2588,6 +2598,8 @@ private void verifyPurchaseI(final AdjustPurchase purchase, final OnPurchaseVeri
25882598

25892599
long now = System.currentTimeMillis();
25902600
PackageBuilder packageBuilder = new PackageBuilder(adjustConfig, deviceInfo, activityState, sessionParameters, now);
2601+
packageBuilder.internalState = internalState;
2602+
25912603
ActivityPackage verificationPackage = packageBuilder.buildVerificationPackage(purchase, callback);
25922604
if (verificationPackage == null) {
25932605
logger.warn("Purchase verification aborted because verification package is null");
@@ -2926,6 +2938,7 @@ private void disableThirdPartySharingForCoppaEnabledI() {
29262938
long now = System.currentTimeMillis();
29272939
PackageBuilder packageBuilder = new PackageBuilder(
29282940
adjustConfig, deviceInfo, activityState, sessionParameters, now);
2941+
packageBuilder.internalState = internalState;
29292942

29302943
ActivityPackage activityPackage =
29312944
packageBuilder.buildThirdPartySharingPackage(adjustThirdPartySharing);

Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityPackage.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ public class ActivityPackage implements Serializable {
3232
new ObjectStreamField("suffix", String.class),
3333
new ObjectStreamField("callbackParameters", (Class<Map<String,String>>)(Class)Map.class),
3434
new ObjectStreamField("partnerParameters", (Class<Map<String,String>>)(Class)Map.class),
35+
new ObjectStreamField("errorCount", int.class),
36+
new ObjectStreamField("firstErrorMessage", String.class),
37+
new ObjectStreamField("lastErrorMessage", String.class),
38+
new ObjectStreamField("waitBeforeSendTimeSeconds", double.class),
3539
};
3640

3741
private transient int hashCode;
@@ -61,6 +65,10 @@ public class ActivityPackage implements Serializable {
6165
private String installVersion;
6266
private Boolean googlePlayInstant;
6367
private Boolean isClick;
68+
private int errorCount;
69+
private String firstErrorMessage;
70+
private String lastErrorMessage;
71+
private double waitBeforeSendTimeSeconds;
6472

6573
public String getPath() {
6674
return path;
@@ -226,6 +234,35 @@ public String getFailureMessage() {
226234
return Util.formatString("Failed to track %s%s", activityKind.toString(), suffix);
227235
}
228236

237+
public int getErrorCount() {
238+
return errorCount;
239+
}
240+
241+
public String getFirstErrorMessage() {
242+
return firstErrorMessage;
243+
}
244+
245+
public String getLastErrorMessage() {
246+
return lastErrorMessage;
247+
}
248+
249+
public double getWaitBeforeSendTimeSeconds() {
250+
return waitBeforeSendTimeSeconds;
251+
}
252+
253+
public void setWaitBeforeSendTimeSeconds(double waitSeconds) {
254+
waitBeforeSendTimeSeconds = waitSeconds;
255+
}
256+
257+
public void addError(String errorMessage) {
258+
errorCount++;
259+
if (firstErrorMessage == null) {
260+
firstErrorMessage = errorMessage;
261+
} else {
262+
lastErrorMessage = errorMessage;
263+
}
264+
}
265+
229266
private void writeObject(ObjectOutputStream stream) throws IOException {
230267
stream.defaultWriteObject();
231268
}
@@ -240,6 +277,10 @@ private void readObject(ObjectInputStream stream) throws ClassNotFoundException,
240277
suffix = Util.readStringField(fields, "suffix", null);
241278
callbackParameters = Util.readObjectField(fields, "callbackParameters", null);
242279
partnerParameters = Util.readObjectField(fields, "partnerParameters", null);
280+
errorCount = Util.readIntField(fields, "errorCount", 0);
281+
firstErrorMessage = Util.readStringField(fields, "firstErrorMessage", null);
282+
lastErrorMessage = Util.readStringField(fields, "lastErrorMessage", null);
283+
waitBeforeSendTimeSeconds = Util.readDoubleField(fields, "waitBeforeSendTimeSeconds", 0.0);
243284
}
244285

245286
@Override
@@ -256,6 +297,10 @@ public boolean equals(Object other) {
256297
if (!Util.equalString(suffix, otherActivityPackage.suffix)) return false;
257298
if (!Util.equalObject(callbackParameters, otherActivityPackage.callbackParameters)) return false;
258299
if (!Util.equalObject(partnerParameters, otherActivityPackage.partnerParameters)) return false;
300+
if (!Util.equalInt(errorCount, otherActivityPackage.errorCount)) return false;
301+
if (!Util.equalString(firstErrorMessage, otherActivityPackage.firstErrorMessage)) return false;
302+
if (!Util.equalString(lastErrorMessage, otherActivityPackage.lastErrorMessage)) return false;
303+
if (!Util.equalsDouble(waitBeforeSendTimeSeconds, otherActivityPackage.waitBeforeSendTimeSeconds)) return false;
259304
return true;
260305
}
261306

@@ -270,6 +315,10 @@ public int hashCode() {
270315
hashCode = Util.hashString(suffix, hashCode);
271316
hashCode = Util.hashObject(callbackParameters, hashCode);
272317
hashCode = Util.hashObject(partnerParameters, hashCode);
318+
hashCode = 37 * hashCode + errorCount;
319+
hashCode = Util.hashString(firstErrorMessage, hashCode);
320+
hashCode = Util.hashString(lastErrorMessage, hashCode);
321+
hashCode = Util.hashDouble(waitBeforeSendTimeSeconds, hashCode);
273322
}
274323
return hashCode;
275324
}

Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public class PackageBuilder {
4141
AdjustAttribution attribution;
4242
Map<String, String> extraParameters;
4343
Boolean isClick;
44+
ActivityHandler.InternalState internalState;
4445

4546
private class ActivityStateCopy {
4647
int eventCount = -1;
@@ -1321,6 +1322,19 @@ private ActivityPackage getDefaultActivityPackage(ActivityKind activityKind) {
13211322
}
13221323

13231324
private void injectFeatureFlagsWithParameters(Map<String, String> parameters) {
1325+
1326+
PackageBuilder.addBoolean(parameters, "event_buffering_enabled", adjustConfig.eventBufferingEnabled);
1327+
PackageBuilder.addBoolean(parameters, "send_in_background_enabled", adjustConfig.sendInBackground);
1328+
1329+
if (internalState != null) {
1330+
PackageBuilder.addBoolean(parameters, "offline_mode_enabled", internalState.offline);
1331+
if (internalState.isInForeground()) {
1332+
PackageBuilder.addBoolean(parameters, "foreground", true);
1333+
} else {
1334+
PackageBuilder.addBoolean(parameters, "background", true);
1335+
}
1336+
}
1337+
13241338
if (adjustConfig.coppaCompliantEnabled) {
13251339
PackageBuilder.addLong(parameters, "ff_coppa", 1);
13261340
}
@@ -1374,6 +1388,14 @@ public static void addLong(Map<String, String> parameters, String key, long valu
13741388
PackageBuilder.addString(parameters, key, valueString);
13751389
}
13761390

1391+
public static void addDouble(Map<String, String> parameters, String key, double value) {
1392+
if (value < 0.0) {
1393+
return;
1394+
}
1395+
String valueString = Double.toString(value);
1396+
PackageBuilder.addString(parameters, key, valueString);
1397+
}
1398+
13771399
private static void addDateInMilliseconds(Map<String, String> parameters, String key, long value) {
13781400
if (value <= 0) {
13791401
return;

Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageHandler.java

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ public class PackageHandler implements IPackageHandler,
4242
private ILogger logger;
4343
private BackoffStrategy backoffStrategy;
4444
private BackoffStrategy backoffStrategyForInstallSession;
45+
private boolean isRetrying;
46+
private long retryStartedAtTimeMilliSeconds;
47+
private double totalWaitTimeSeconds;
4548

4649
@Override
4750
public void teardown() {
@@ -77,7 +80,8 @@ public PackageHandler(IActivityHandler activityHandler,
7780
this.logger = AdjustFactory.getLogger();
7881
this.backoffStrategy = AdjustFactory.getPackageHandlerBackoffStrategy();
7982
this.backoffStrategyForInstallSession = AdjustFactory.getInstallSessionBackoffStrategy();
80-
83+
this.isRetrying = false;
84+
this.totalWaitTimeSeconds = 0.0;
8185

8286
init(activityHandler, context, startsSending, packageHandlerActivityPackageSender);
8387

@@ -146,6 +150,13 @@ public void run() {
146150
return;
147151
}
148152

153+
if (!isRetrying) {
154+
isRetrying = true;
155+
retryStartedAtTimeMilliSeconds = System.currentTimeMillis();
156+
}
157+
158+
writePackageQueueI();
159+
149160
if (activityHandler != null) {
150161
activityHandler.finishedTrackingActivity(responseData);
151162
}
@@ -182,8 +193,11 @@ public void run() {
182193
double waitTimeSeconds = waitTimeMilliSeconds / 1000.0;
183194
String secondsString = Util.SecondsDisplayFormat.format(waitTimeSeconds);
184195

196+
totalWaitTimeSeconds += waitTimeSeconds;
197+
185198
logger.verbose("Waiting for %s seconds before retrying the %d time", secondsString, retries);
186199
scheduler.schedule(runnable, waitTimeMilliSeconds);
200+
responseData.activityPackage.setWaitBeforeSendTimeSeconds(responseData.activityPackage.getWaitBeforeSendTimeSeconds() + waitTimeSeconds);
187201
}
188202

189203
// interrupt the sending loop after the current request has finished
@@ -232,6 +246,13 @@ private void initI() {
232246
}
233247

234248
private void addI(ActivityPackage newPackage) {
249+
if (isRetrying) {
250+
long now = System.currentTimeMillis();
251+
double waitSeconds = totalWaitTimeSeconds - (now - retryStartedAtTimeMilliSeconds) / 1000.0;;
252+
newPackage.setWaitBeforeSendTimeSeconds(waitSeconds);
253+
}
254+
PackageBuilder.addLong(newPackage.getParameters(), "enqueue_size", packageQueue.size());
255+
235256
packageQueue.add(newPackage);
236257
logger.debug("Added package %d (%s)", packageQueue.size(), newPackage);
237258
logger.verbose("%s", newPackage.getExtendedString());
@@ -256,6 +277,13 @@ private void sendFirstI() {
256277
Map<String, String> sendingParameters = generateSendingParametersI();
257278

258279
ActivityPackage firstPackage = packageQueue.get(0);
280+
281+
PackageBuilder.addLong(sendingParameters, "retry_count", firstPackage.getErrorCount());
282+
PackageBuilder.addString(sendingParameters, "first_error", firstPackage.getFirstErrorMessage());
283+
PackageBuilder.addString(sendingParameters, "last_error", firstPackage.getLastErrorMessage());
284+
PackageBuilder.addDouble(sendingParameters, "wait_total", totalWaitTimeSeconds);
285+
PackageBuilder.addDouble(sendingParameters, "wait_time", firstPackage.getWaitBeforeSendTimeSeconds());
286+
259287
activityPackageSender.sendActivityPackage(firstPackage,
260288
sendingParameters,
261289
this);
@@ -277,7 +305,13 @@ private Map<String, String> generateSendingParametersI() {
277305
}
278306

279307
private void sendNextI() {
308+
isRetrying = false;
309+
retryStartedAtTimeMilliSeconds = 0;
310+
280311
if (packageQueue.isEmpty()) {
312+
// at this point, the queue has been emptied
313+
// reset total_wait in this moment to allow all requests to populate total_wait
314+
totalWaitTimeSeconds = 0.0;
281315
return;
282316
}
283317

Adjust/sdk-core/src/main/java/com/adjust/sdk/Util.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,15 @@ public static long readLongField(ObjectInputStream.GetField fields, String name,
320320
}
321321
}
322322

323+
public static double readDoubleField(ObjectInputStream.GetField fields, String name, double defaultValue) {
324+
try {
325+
return fields.get(name, defaultValue);
326+
} catch (Exception e) {
327+
getLogger().debug(fieldReadErrorMessage, name, e.getMessage());
328+
return defaultValue;
329+
}
330+
}
331+
323332
public static boolean equalObject(Object first, Object second) {
324333
if (first == null || second == null) {
325334
return first == null && second == null;

Adjust/sdk-core/src/main/java/com/adjust/sdk/network/ActivityPackageSender.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.adjust.sdk.AdjustSigner;
1111
import com.adjust.sdk.Constants;
1212
import com.adjust.sdk.ILogger;
13+
import com.adjust.sdk.PackageBuilder;
1314
import com.adjust.sdk.ResponseData;
1415
import com.adjust.sdk.TrackingState;
1516
import com.adjust.sdk.Util;
@@ -106,6 +107,8 @@ public ResponseData sendActivityPackageSync(final ActivityPackage activityPackag
106107
boolean retryToSend;
107108
ResponseData responseData;
108109
do {
110+
addErrorParameters(activityPackage, sendingParameters);
111+
109112
responseData =
110113
ResponseData.buildResponseData(activityPackage, sendingParameters);
111114

@@ -117,6 +120,12 @@ public ResponseData sendActivityPackageSync(final ActivityPackage activityPackag
117120
return responseData;
118121
}
119122

123+
private void addErrorParameters(ActivityPackage activityPackage, Map<String, String> sendingParameters) {
124+
PackageBuilder.addLong(sendingParameters, "error_count", activityPackage.getErrorCount());
125+
PackageBuilder.addString(sendingParameters, "first_error", activityPackage.getFirstErrorMessage());
126+
PackageBuilder.addString(sendingParameters, "last_error", activityPackage.getLastErrorMessage());
127+
}
128+
120129
private boolean shouldRetryToSend(final ResponseData responseData) {
121130
if (!responseData.willRetry) {
122131
logger.debug("Will not retry with current url strategy");
@@ -255,6 +264,8 @@ private void remoteError(Throwable throwable, String description, ResponseData r
255264
responseData.message = finalMessage;
256265

257266
responseData.willRetry = true;
267+
268+
responseData.activityPackage.addError(finalMessage);
258269
}
259270

260271
private String errorMessage(final Throwable throwable,
@@ -364,6 +375,8 @@ private DataOutputStream configConnectionForPOST(final HttpsURLConnection connec
364375
activityPackageParameters,
365376
sendingParameters);
366377

378+
logger.debug("Post body: %s", postBodyString);
379+
367380
if (postBodyString == null) {
368381
return null;
369382
}

0 commit comments

Comments
 (0)