25 Aug 2026 10:06 AM - edited 26 Aug 2026 08:01 PM
By default, user sessions in the new RUM Experience (Experience Vitals) are identified by a generated ID rather than a meaningful user name. This article explains how to capture a user name from the page using a CSS selector, verify the capture, and then use OpenPipeline® processing rules to map that value to the user identifier field so it appears in the User and sessions view.
Note: This configuration applies only to newly ingested data. Existing sessions are not retroactively updated.
In this part, you configure the application in Experience Vitals to read the user name from the page using a CSS selector and store it as an event property.
username.#root > div > header > div > p. This tells Dynatrace which DOM element to read.innerText. This extracts the visible text content of the matched element.Tip: To verify the selector before saving, open your browser's developer tools, go to the Console tab, and run document.querySelector('YOUR_SELECTOR').innerText. If the correct user name appears, the selector is valid.
Before setting up OpenPipeline, confirm that the event property arrives in Dynatrace by querying for it in a Notebook.
In Dynatrace, go to Notebooks and open a new notebook.
Add a DQL tile and run the following query, replacing username with the property key you configured in Part 1:
fetch user.events
| filter isNotNull(event_properties.username)
| fieldsAdd event_properties.username
Confirm that the event_properties.username column is populated with the expected user names.Note: From the image, you can see that it also captured additional text, "Hi, " that you may not want. Do not worry, as we can create a clean up rule later.
If the column is empty, go back to Part 1 and verify the CSS selector and the innerText processing step are configured correctly. Generate new user actions in the monitored application (for example, load a page while signed in) and then re-run the query.
In this part, you create an OpenPipeline pipeline under User events and add a DQL processing rule to map the captured property to the user.identifier field.
Map user name.Set user identifier from username.isNotNull(event_properties.username)
fieldsAdd user.identifier = event_properties.username
Note: If your CSS selector captures additional text alongside the user name—for example, a greeting prefix such as "Hi, Priya", use replaceString to strip the unwanted text: fieldsAdd user.identifier = replaceString(event_properties.username, "Hi, ", "")
OpenPipeline uses the default pipeline unless a routing rule sends data to a specific pipeline. In this part, you create a routing rule that directs the relevant user events through the pipeline you created in Part 3.
Change user names.matchesValue(frontend.name, "Your App Name")
After completing Parts 1–4, generate new user sessions by interacting with the monitored application while signed in. Then confirm the user name appears in Experience Vitals.
Note: Only sessions ingested after the pipeline and routing rule were published display the mapped user name. Earlier sessions retain the generated identifier.
You can also verify with DQL:
fetch user.sessions, from: now()-2h
| fields
user.identifier,
dt.rum.session.id,
frontend.name,
dt.rum.application.type
| filter isNotNull(user.identifier)
| limit 100
The event_properties.username column is empty/null in the Notebook query.
The event property is captured but user.identifier is still empty/Anonymous after setting up the pipeline.
Sessions show the user name in DQL but not in the Experience Vitals UI.
If this article did not resolve your issue, open a support case and include:
event_properties.username.user.identifier.Additional resources:
@Aaron_Schultz I know this is more a question for the PM, but since the CSS capturing is there, why did they not keep the option to capture user tags in the same way as it was in RUM classic?
@Julius_Loman My apologies, but unfortunately, I do not have an answer to that. Someone else would have to answer that question.
Hi! Good review.
We would like to share a reflection, after the appropriate permissions were granted, we were able to verify that the information is stored and displayed correctly. As a result of this work, a question has arisen regarding the functional and architectural approach behind this capability, and we would appreciate understanding your perspective and the recommended best practices. From our point of view, the user information was already available within the events through the field: event_properties.username To transform this value into a User Identifier that can subsequently be used within the session experience, we needed to:
We understand that user.identifier is a normalized attribute and is considered sensitive, which is why it requires specific data governance and access control mechanisms. However, we would like to better understand the functional motivation behind this separation between the Event Properties reported by the application and the standardized User Identifier used by Dynatrace. This question becomes particularly relevant when comparing this model with the previous approach based on User Tags. In our RUM Classic environment, user identification can be configured in a relatively straightforward manner using either a CSS selector or a JavaScript expression against the monitored application. By contrast, achieving an equivalent result under the new model has required incorporating several additional components related to property capture, OpenPipeline, routing, enrichment, and permissions. While we understand that this approach may provide advantages in terms of standardization, data governance, privacy, and future analytical capabilities, from an operational perspective it represents a significant increase in configuration and maintenance complexity. This consideration is especially important in our case, as we are planning the migration of several hundred RUM applications to Grail. Therefore, we would like to understand whether:
Our objective is to better understand the design philosophy behind this capability so that we can define a sustainable, efficient, and scalable migration strategy for the large number of applications that we need to adapt over the coming months.