1.0.92
D2L Supported Marts, Event Filter Refinements, Enrollment Info
Release Date
March 2, 2026
Key Features
This release focuses on the following features:
Member institutions with D2L Brightspace as an LMS will now have UDP data marts
Canvas impersonation events and duplicate events are removed from all marts
Section enrollment fields added to
mart_generalmarts.
D2L Brightspace
Implementing D2L Brightspace support for UDP Marts will have no noticeable change for Canvas schools. The schema of the marts are identical for both D2L and Canvas institutions.
Under the hood, we leverage Jinja to template the SQL queries based on the source LMS. In the source code repository, users will notice the following Jinja templating statements in the SQL files:
/* SQL for Canvas LMS */
{% if lms == 'canvas' %}
/* SQL logic to execute */
/* SQL for Brightspace LMS */
{% elif lms == 'brightspace' %}
/* SQL logic to execute */
{% endif %}We add an LMS tag to each tenant in the config and orchestration scripts for the data marts. This ensures the correct SQL logic executes for each tenant. The SQL logic will look different between the canvas and brightspace blocks in the files; however, the output schema is identical for each file, regardless of LMS.
The majority of the data differences between Brightspace and Canvas reside in the Caliper events. The context side of the marts aligns better between the two LMSes because we map both to the UCDM before creating the data marts.
Event Filter Refinements
Admins in Canvas can impersonate other users to test features and behavior in the LMS based on different personas. Clicks in Canvas by an admin impersonating another user generate Caliper events, just as "real" user events do. Previously, we did not check for impersonation events, and this can result in overcounting of activity for a particular user in a course.
Impersonation events have not been excluded from all marts. We don't expect this change to have a significant impact on reporting or existing analytics; it seems to be an edge case compared to the usual volume of Caliper events. However, we are propagating this logic change to data from January 1, 2021, onward.
Impersonation events in Canvas Caliper events are identified when a non-null value of real_user_id in the actor.extensions JSON block occurs. A null value here signifies the actor ID matches the "real" person clicking around Canvas. We employ the following logic to ensure only real user events are kept:
Furthermore, we discovered instances in our logic where aggregations could include the same event twice. We've added logic to make sure the DISTINCT keyword is used in the mart_helper event tables for accurate aggregations.
Similar to the possiblity of duplicate events in aggregations, we noticed some tool names that can be duplicated based on different URL values in the Caliper events. We've added extra logic to make sure tool names align more accurately.
Section Enrollment Fields
The DSS team received feedback that extra section enrollment information in the mart_general marts (lms_tool and lti_tool, specifically) would be useful for analytics and reporting. There is now a struct field called all_section_enrollments that has the following fields nested inside:
udp_course_section_idlms_course_section_idsis_course_section_idrolerole_statusenrollment_statuscreated_date
This struct field can be expanded and queried for the cases when a student is enrolled in multiple sections of the same course_offering.
Last updated