Skip to content

Commit b2bb0ca

Browse files
authored
[MBL-19563][Student] Add retry parameter to Pendo submission analytics (#3420)
## Summary Adds a "Retry" parameter to all Pendo submission tracking events (both SUCCEEDED and FAILED) to distinguish between first-time submission attempts and retry attempts after failures. This enables product managers to accurately analyze submission success rates and understand whether high failure counts include multiple retry attempts from the same user. ## Changes - Added `RETRY` constant to `AnalyticsParamConstants` in canvas-api-2 library - Updated all 13 submission analytics events in `SubmissionWorker` to include retry parameter: - Value = 1 if `retryCount > 0` (retry attempt) - Value = 0 if `retryCount == 0` (first attempt) - Leverages existing `retryCount` field from `CreateSubmissionEntity` added in MBL-19546 ## Events Updated All submission analytics events now include the retry parameter: - `SUBMIT_MEDIARECORDING_SUCCEEDED` / `FAILED` (3 events) - `SUBMIT_FILEUPLOAD_SUCCEEDED` / `FAILED` (2 events) - `SUBMIT_TEXTENTRY_SUCCEEDED` / `FAILED` (2 events) - `SUBMIT_URL_SUCCEEDED` / `FAILED` (2 events) - `SUBMIT_STUDIO_SUCCEEDED` / `FAILED` (2 events) - `SUBMIT_ANNOTATION_SUCCEEDED` / `FAILED` (2 events) ## Test Plan ### Manual Testing 1. Create an assignment requiring any submission type (text, file, URL, etc.) 2. As a student, submit to the assignment 3. Verify submission succeeds and check Pendo analytics event includes `retry: 0` 4. Simulate a network failure during submission (airplane mode or network throttling) 5. Retry the submission after the failure 6. Verify the retry attempt includes `retry: 1` in the Pendo analytics event ### Verification - Pendo analytics events for successful first-time submissions should have `retry: 0` - Pendo analytics events for retry attempts (after WorkManager retries) should have `retry: 1` - All 13 submission events should include the retry parameter refs: MBL-19563 affects: Student release note: Improved analytics tracking for submission attempts to better distinguish between first attempts and retries - [ ] Dark/light mode testing - N/A (analytics only, no UI changes) - [ ] Landscape/tablet testing - N/A (analytics only, no UI changes) - [ ] Accessibility testing - N/A (analytics only, no UI changes) - [ ] Product approval - Not required (analytics enhancement) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
1 parent 5c1cd61 commit b2bb0ca

File tree

2 files changed

+14
-0
lines changed
  • apps/student/src/main/java/com/instructure/student/mobius/common/ui
  • libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/utils

2 files changed

+14
-0
lines changed

apps/student/src/main/java/com/instructure/student/mobius/common/ui/SubmissionWorker.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ class SubmissionWorker @AssistedInject constructor(
249249
putString(AnalyticsParamConstants.ATTEMPT, submission.attempt.toString())
250250
submission.mediaType?.let { putString(AnalyticsParamConstants.MEDIA_TYPE, it) }
251251
submission.mediaSource?.let { putString(AnalyticsParamConstants.MEDIA_SOURCE, it) }
252+
putInt(AnalyticsParamConstants.RETRY, if (submission.retryCount > 0) 1 else 0)
252253
})
253254

254255
showCompleteNotification(
@@ -272,6 +273,7 @@ class SubmissionWorker @AssistedInject constructor(
272273
putString(AnalyticsParamConstants.ATTEMPT, submission.attempt.toString())
273274
submission.mediaType?.let { putString(AnalyticsParamConstants.MEDIA_TYPE, it) }
274275
submission.mediaSource?.let { putString(AnalyticsParamConstants.MEDIA_SOURCE, it) }
276+
putInt(AnalyticsParamConstants.RETRY, if (submission.retryCount > 0) 1 else 0)
275277
})
276278
Result.failure()
277279
}
@@ -281,6 +283,7 @@ class SubmissionWorker @AssistedInject constructor(
281283
putString(AnalyticsParamConstants.ATTEMPT, submission.attempt.toString())
282284
submission.mediaType?.let { putString(AnalyticsParamConstants.MEDIA_TYPE, it) }
283285
submission.mediaSource?.let { putString(AnalyticsParamConstants.MEDIA_SOURCE, it) }
286+
putInt(AnalyticsParamConstants.RETRY, if (submission.retryCount > 0) 1 else 0)
284287
})
285288
return Result.failure()
286289
}
@@ -387,6 +390,7 @@ class SubmissionWorker @AssistedInject constructor(
387390
}).onSuccess { attachment ->
388391
analytics.logEvent(AnalyticsEventConstants.SUBMIT_FILEUPLOAD_SUCCEEDED, Bundle().apply {
389392
putString(AnalyticsParamConstants.ATTEMPT, submission.attempt.toString())
393+
putInt(AnalyticsParamConstants.RETRY, if (submission.retryCount > 0) 1 else 0)
390394
})
391395
updateFileProgress(
392396
submission.id,
@@ -409,6 +413,7 @@ class SubmissionWorker @AssistedInject constructor(
409413
}.onFailure {
410414
analytics.logEvent(AnalyticsEventConstants.SUBMIT_FILEUPLOAD_FAILED, Bundle().apply {
411415
putString(AnalyticsParamConstants.ATTEMPT, submission.attempt.toString())
416+
putInt(AnalyticsParamConstants.RETRY, if (submission.retryCount > 0) 1 else 0)
412417
})
413418
runBlocking {
414419
handleFileError(submission, index, attachments, it?.message)
@@ -669,21 +674,25 @@ class SubmissionWorker @AssistedInject constructor(
669674
Assignment.SubmissionType.ONLINE_TEXT_ENTRY.apiString -> {
670675
analytics.logEvent(AnalyticsEventConstants.SUBMIT_TEXTENTRY_SUCCEEDED, Bundle().apply {
671676
putString(AnalyticsParamConstants.ATTEMPT, submission.attempt.toString())
677+
putInt(AnalyticsParamConstants.RETRY, if (submission.retryCount > 0) 1 else 0)
672678
})
673679
}
674680
Assignment.SubmissionType.ONLINE_URL.apiString -> {
675681
analytics.logEvent(AnalyticsEventConstants.SUBMIT_URL_SUCCEEDED, Bundle().apply {
676682
putString(AnalyticsParamConstants.ATTEMPT, submission.attempt.toString())
683+
putInt(AnalyticsParamConstants.RETRY, if (submission.retryCount > 0) 1 else 0)
677684
})
678685
}
679686
Assignment.SubmissionType.BASIC_LTI_LAUNCH.apiString -> {
680687
analytics.logEvent(AnalyticsEventConstants.SUBMIT_STUDIO_SUCCEEDED, Bundle().apply {
681688
putString(AnalyticsParamConstants.ATTEMPT, submission.attempt.toString())
689+
putInt(AnalyticsParamConstants.RETRY, if (submission.retryCount > 0) 1 else 0)
682690
})
683691
}
684692
Assignment.SubmissionType.STUDENT_ANNOTATION.apiString -> {
685693
analytics.logEvent(AnalyticsEventConstants.SUBMIT_ANNOTATION_SUCCEEDED, Bundle().apply {
686694
putString(AnalyticsParamConstants.ATTEMPT, submission.attempt.toString())
695+
putInt(AnalyticsParamConstants.RETRY, if (submission.retryCount > 0) 1 else 0)
687696
})
688697
}
689698
}
@@ -724,21 +733,25 @@ class SubmissionWorker @AssistedInject constructor(
724733
Assignment.SubmissionType.ONLINE_TEXT_ENTRY.apiString -> {
725734
analytics.logEvent(AnalyticsEventConstants.SUBMIT_TEXTENTRY_FAILED, Bundle().apply {
726735
putString(AnalyticsParamConstants.ATTEMPT, submission.attempt.toString())
736+
putInt(AnalyticsParamConstants.RETRY, if (submission.retryCount > 0) 1 else 0)
727737
})
728738
}
729739
Assignment.SubmissionType.ONLINE_URL.apiString -> {
730740
analytics.logEvent(AnalyticsEventConstants.SUBMIT_URL_FAILED, Bundle().apply {
731741
putString(AnalyticsParamConstants.ATTEMPT, submission.attempt.toString())
742+
putInt(AnalyticsParamConstants.RETRY, if (submission.retryCount > 0) 1 else 0)
732743
})
733744
}
734745
Assignment.SubmissionType.BASIC_LTI_LAUNCH.apiString -> {
735746
analytics.logEvent(AnalyticsEventConstants.SUBMIT_STUDIO_FAILED, Bundle().apply {
736747
putString(AnalyticsParamConstants.ATTEMPT, submission.attempt.toString())
748+
putInt(AnalyticsParamConstants.RETRY, if (submission.retryCount > 0) 1 else 0)
737749
})
738750
}
739751
Assignment.SubmissionType.STUDENT_ANNOTATION.apiString -> {
740752
analytics.logEvent(AnalyticsEventConstants.SUBMIT_ANNOTATION_FAILED, Bundle().apply {
741753
putString(AnalyticsParamConstants.ATTEMPT, submission.attempt.toString())
754+
putInt(AnalyticsParamConstants.RETRY, if (submission.retryCount > 0) 1 else 0)
742755
})
743756
}
744757
}

libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/utils/Analytics.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ object AnalyticsParamConstants {
196196
const val MEDIA_SOURCE = "media_source"
197197
const val MEDIA_TYPE = "media_type"
198198
const val ATTEMPT = "attempt"
199+
const val RETRY = "retry"
199200

200201
//todo filters
201202
const val FILTER_PERSONAL_TODOS = "filter_personal_todos"

0 commit comments

Comments
 (0)