Problem
The send_composite_outcome Celery task currently produces minimal log output. On success, only the generic Celery trace log is emitted — no context about what grade was sent, to whom, or for which user/course/assignment.
Current log output (on success):
Task lms.djangoapps.lti_provider.tasks.send_composite_outcome[<task-id>] succeeded in 2.3s: None
This makes it difficult to:
- Confirm which grade value was actually sent to the LTI consumer
- Identify which user or course/assignment was involved
- Diagnose failures without external timestamps (e.g., checking Canvas directly)
Suggested Improvements
Add structured log statements inside send_composite_outcome (and related tasks) that include:
- User identifier — whose grade is being sent (user ID or anonymized ID)
- Course and usage key — which course/assignment triggered the passback
- Grade value — the score being submitted (e.g.,
0.85)
- LTI outcome URL — the endpoint on the consumer side receiving the grade
- Result on failure — HTTP status code, response body, or exception detail
Expected Benefit
Operators and support teams can confirm grade passback without needing Canvas-side investigation. Failures become immediately diagnosable from logs alone.
Files Likely Involved
lms/djangoapps/lti_provider/tasks.py
lms/djangoapps/lti_provider/outcomes.py
Problem
The
send_composite_outcomeCelery task currently produces minimal log output. On success, only the generic Celery trace log is emitted — no context about what grade was sent, to whom, or for which user/course/assignment.Current log output (on success):
This makes it difficult to:
Suggested Improvements
Add structured log statements inside
send_composite_outcome(and related tasks) that include:0.85)Expected Benefit
Operators and support teams can confirm grade passback without needing Canvas-side investigation. Failures become immediately diagnosable from logs alone.
Files Likely Involved
lms/djangoapps/lti_provider/tasks.pylms/djangoapps/lti_provider/outcomes.py