Course completion, reports and certificate issue

Process Flow for course completion and certificate issuance

  • Once a user completes a lesson the content state update (in lms service) API is called to mark the lesson as complete

  • Each lesson completed by the user has a row in the sunbird_courses.user_content_consumption cassandra table. As the user completes the lesson, the status & progress in the row gets updated

  • The LMS service generates events in the dev.coursebatch.job.request topic

  • Events from this topic are consumed by the activity-aggregate-updater job to mark the course completion. Both lesson progress and course completion events are generated in this topic

  • The activity-aggregate-updater job updates the overall course progress in the sunbird_courses.user_activity_agg cassandra table and sends an event to the dev.issue.certificate.request topic for certificate generation

  • The course-certificate-generator-v2_1 Samza job uses events from dev.issue.certificate.request topic to generate & issue the certificate to the user. The certificate issuance is also stored in the sunbird_courses.user_activity_agg cassandra table

    • In Sunbird 4.2 this samza job has been moved to a Flink job


All reports need the user cache in redis populated. This is done by the flink-dev/user-cache-updater-v2 job. The cache update can also me manually triggered by the ETLUserCacheIndexer Jenkins job

The progress exhaust report uses data from sunbird_courses.user_activity_agg to generate the report. The progress exhaust also needs the user cache to be populated, otherwise this report may be empty

The user info report will work as long as the cache is populated

For the response exhaust, the assessment-aggregator job needs to be running and stable

Usually the reports are generated using a cronjob. Use the below commands to manually run the jobs. Run it from the DP VM, as analytics user

/mount/data/analytics/scripts/ progress-exhaust
/mount/data/analytics/scripts/ response-exhaust
/mount/data/analytics/scripts/ userinfo-exhaust

FAQs if certificate is failing

  1. The certificate needs to have and issuer.url set

  2. The certificate needs to have signatoryList array with 1 child having

Last updated