Test Kitchen/Web schema
This page documents Test Kitchen's base schema for web. The schema includes three types of properties:
- core properties: fields describing the event itself
- interaction data: fields with custom values set by the instrument code to fit the needs of the experiment
- contextual attributes: fields describing the performer and environment of the event
This page helps you understand which properties of each type are available, so you can plan your instrumentation specification. For property descriptions and types, see the web base schema definition.
Example event
| Example event |
|---|
[
{
"action": "impression",
"action_source": "community-updates",
"action_context": "mwomen_in_red",
"agent": {
"client_platform": "mediawiki_js",
"client_platform_family": "desktop_browser",
"release_status": null
},
"dt": "2024-10-01T13:18:42.672Z",
"experiments": {
"assigned": {
"growth-experiments": "control"
},
"enrolled": [
"growth-experiments"
]
},
"http": {
"has_cookies": null,
"method": null,
"protocol": null,
"request_headers": {
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
},
"response_headers": null,
"status_code": null
},
"mediawiki": {
"database": "testwiki",
"site_content_language": "en",
"site_content_language_variant": null,
"skin": null,
"version": null
},
"meta": {
"domain": "test.wikipedia.org",
"dt": "2024-10-01T13:18:46.060Z",
"id": "1f5c1542-c60d-4edb-90a3-89c1904b71d1",
"request_id": "28ac4e36-d667-462b-bd1e-34268bebd856",
"stream": "mediawiki.product_metrics.homepage_module_interaction",
"uri": null
},
"page": {
"title": null,
"content_language": "en",
"id": null,
"is_redirect": null,
"namespace_id": null,
"namespace_name": null,
"revision_id": null,
"user_groups_allowed_to_edit": null,
"user_groups_allowed_to_move": null,
"wikidata_qid": null
},
"performer": {
"active_browsing_session_token": "74904276fea622b14739",
"can_probably_edit_page": null,
"edit_count": null,
"edit_count_bucket": "100-999 edits",
"groups": [
"sysop",
"*",
"user",
"autoconfirmed"
],
"id": null,
"is_bot": false,
"is_logged_in": true,
"is_temp": false,
"language": "en",
"language_variant": null,
"name": "Martin Urbanec (WMF)",
"pageview_id": "b60bbc9b8c4985d4f8b6",
"registration_dt": "2019-06-28T20:57:21.000Z",
"session_id": "0212f2552cd8118d4811"
},
"sample": {
"rate": 1,
"unit": "pageview"
},
"$schema": "/analytics/product_metrics/web/base/1.3.0"
}
]
|
Core properties
These properties are added automatically to every event.
$schemadtmeta.streammeta.domainmeta.idmeta.dtmeta.request_id
Instrument and experiment management
In addition, some core properties are added to events by the client to aid in instrument and experiment management. These properties are set automatically and cannot be customized. They include:
JavaScript:
experimentsassignedenrolled
instrument_name
PHP: Unsupported
Interaction data
Managed data
These properties are not manually set by your instrument but are instead managed by the client libraries (as long as you use the Instrument class[1]).
instrument_name- Reserved for the instrument ID (the one used with
getInstrument()) for instruments configured in Test Kitchen UI. funnel_event_sequence_position- 0 for the first event submitted by instrument, incremented by 1 for each subsequent event
Unmanaged data
Test Kitchen supports interaction data that you can customize to fit the needs of your instrument. You can set these properties to any meaningful value to provide the data required for your event. See the SDK docs for information about how to set these properties when submitting events.
action(required)- Examples: "click", "type", "scroll"
action_subtype- Examples: "submit" or "cancel" for click actions; "up" or "down" for scroll actions
action_context- A short (maximum of 320 characters) human-readable string to provide meaningful context for the event. JSON-stringified objects preferred (as it makes querying/analysis easier), especially for multiple key-value pairs. Given the length limit, it is not recommend to stuff large blobs of data via JSON-encoded strings into this field.
action_source- A short (maximum of 64 characters) human-readable set of words to indicate the source of the event. For example: "sidebar" or "visualeditor uploadwizard modal"
element_friendly_name- Analyst-friendly name of the UI element interacted with. For example: "donate_link"
element_id- ID of the UI element interacted with
funnel_entry_token- A randomly generated identifier for linking multiple events belonging to a (work)flow. A single session (identified by
performer.session_idmay have multiple pageviews (identified byperformer.pageview_id) which may have multiple instances offunnel_namethat are separately identified by this token. funnel_name- Analyst-friendly name such as "emergency_flow" or "add_a_link_suggestion"
Data modeling guidelines and recommendations
The most important property is action and it corresponds to the event name/type, for example: page_visit, click, impression, and form_submit. You are welcome to use other properties (action_subtype, action_source, action_context) as you want, but we recommend the following practices:
action_subtype
action_subtype is for differentiating between events with the same action (event type) for example:
- If
action: click, thenaction_subtypecould becancel,submit,skip - If
action: scroll, thenaction_subtypecould beupordown - If
action: insert(when editing with VisualEditor), thenaction_subtypecould betable,math_formula,signature, orbasic_reference.
action_source
action_source is for recording the source of the action, which is best understood through examples:
- If we had an
action: page_visitevent on every page visit, you would useaction_sourceto record referrer – e.g.none,internal,external - If we had an
action: form_submitevent on form submission, you might useaction_sourceto record how the submission happened – e.g.submit_button_clickvsenter_key_press - If we had an
action: impressionevent when a UI element is visible, you might useaction_sourceto record if the element was visible right away (above_fold) or came into view only after user scrolled down far enough (scroll) - If we had an
action: initevent when editing interface initialized, you might useaction_sourceto record if it was initiated frompageedit button orsectionedit button.
action_context
action_context is 320 (per this decision), we recommend against stuffing large amounts of data. See also: Why is data stuffing bad?
action_context is for recording useful information about the context of the event, and is usually where developers collect a few pieces of structured data and JSON-stringify it (for easy querying). For example:
- For an
action: search_resultsevent, you could recordtotal_results(int), and potentially thequery(string). - For an
action: clickevent when user clicked one of those search results, you could recordresult_position(int). - For an
action: scrollevent, you could recordpercent_scrolled(float). - For an
action: page_visitevent, you could record appearance settings such astext_size(string: small, standard, or large),page_width(string: standard or wide),page_color(string: automatic (light), automatic (dark), light, or dark), andappearance_settings_location(string: side or top).
References
Contextual attributes
Contextual attributes provide information about the performer who triggered the event and the wiki where the event occurred. The values of contextual attributes are populated automatically by Test Kitchen when the event is generated as long as they have been added to the stream configuration.
All attributes must be enabled in the instrument's event stream configuration. For more information, see Contextual attributes.
| Supported contextual attributes for JavaScript |
|---|
|
The JavaScript SDK supports these contextual attributes:[2] Included automatically:[3]
Optional:
|
| Supported contextual attributes for PHP |
|---|
|
The PHP SDK supports these contextual attributes:[4] Included automatically:[5]
Optional:
|
Code references
- ↑ Test Kitchen/SDK/JavaScript SDK#Reference
- ↑ gitlab:repos/data-engineering/metrics-platform/-/blob/main/js/src/Context.js
- ↑ gitlab:repos/data-engineering/metrics-platform/-/blob/main/js/src/ContextController.js
- ↑ gitlab:repos/data-engineering/metrics-platform/-/blob/main/php/src/StreamConfig/StreamConfig.php
- ↑ gitlab:repos/data-engineering/metrics-platform/-/blob/main/php/src/ContextController.php