Dashboard Tools Runner
The Dashboard Tools Runner enables specialized node templates used for filtering and visualizing data within a session context:
1. json-filter (Transform Node)
This node uses a JMESPath expression to extract a specific subset of JSON from its input.
Typical usage: Isolate data related to the current session, user, or any scoped variable before passing it to downstream nodes.
2. dashboard (Aggregation Node) - Legacy V1
This node aggregates the filtered input and publishes a dashboard dimension to the backend using the legacy format.
It requires the following configuration properties:
dataSourceName— a unique key identifying the data sourcelayoutConfiguration— an array describing the layout and components of the dashboard (legacy format)dashboardName— a human-readable name for the resulting dashboard
Note: This node creates dimensions with DashboardVersion="Legacy" and is compatible with ui/legacy dashboard frontend.
3. dashboard-v2 (Aggregation Node) - Next V2
This node aggregates filtered input and publishes a dashboard dimension using the Heat Next format, suitable for the modern ui/dashboard frontend.
It requires the following configuration properties:
dataSourceName— a unique key identifying the data sourcelayoutConfiguration— an object withcomponents.rowsstructure (v2 format, see layout schema)dashboardName— a human-readable name for the resulting dashboarddashboardVersion— optional, defaults to"Next"(can be"Next"or"Legacy")
Key differences from dashboard (v1):
- Payload format: Input must contain
$heat-dataservicekey with structured channel data - Layout format: Uses object structure with
components.rowsinstead of array format - Dashboard version: Creates dimensions with
DashboardVersion="Next"by default - Frontend compatibility: Designed for
ui/dashboard(notui/legacy)
Integration in a Session Template
Here’s how you can incorporate these nodes into your session template:
-
Insert a
json-filternode immediately after your data ingestion or transformation node. -
Set the
expressionfield using session-scoped variables. Example:records[?userId=='$SESSION.userId'] -
Connect a
dashboardnode to consume the filtered output. -
Provide the
dataSourceName, define thelayoutConfiguration, and specify thedashboardName.
This pipeline ensures the dashboard reflects only the data relevant to the active session.
Input Payload Requirements
V1 Dashboard (dashboard node)
To assign proper access controls, the JSON passed to the dashboard node must include a dashboardUsers field — an array of GUIDs representing users who should have access:
{
"map": {
/* widget-specific or component-specific data */
},
"dashboardUsers": ["<user-guid-1>", "<user-guid-2>"]
}map: Arbitrary data keyed by component or widget name. This structure must be compatible with your dashboard panel definitions.dashboardUsers: An array of user GUIDs granted visibility to the resulting dashboard dimension.
Note: If
dashboardUsersis omitted, the dashboard will only be visible to the runner’s internal service account.
V2 Dashboard (dashboard-v2 node)
The dashboard-v2 node requires input in the $heat-dataservice format:
{
"$heat-dataservice": {
"version": "1.0",
"realm": "optional-realm-name",
"groups": [
{
"id": "performance",
"name": "Performance Metrics"
}
],
"channels": [
{
"id": "cognitive-load",
"name": "Mental Workload",
"groupId": "performance",
"shape": "series",
"data": [
{ "timeMs": 1000, "value": 0.75 },
{ "timeMs": 2000, "value": 0.82 }
]
}
]
},
"dashboardUsers": ["<user-guid-1>", "<user-guid-2>"]
}Required fields:
$heat-dataservice: Object containing structured channel dataversion: Schema version string (e.g., “1.0”)groups: Array of channel group definitions (each withidandname)channels: Array of channel data (each withid,name,groupId,shape, anddata)
dashboardUsers: Array of user GUIDs (same as v1)
Supported channel shapes:
series: Time-series data[{timeMs: number, value: number|string|boolean}]timestamps: Point-in-time events[{timeMs: number, annotation: string}]value: Static values{value: any}events: Boolean state changes[{timeMs: number, occurred: boolean}]ranges: Time ranges[{startTimeMs: number, endTimeMs: number, durationMs: number}]
For detailed information on the $heat-dataservice format, see the Direct Ingestion documentation.
Example: Filtering with JMESPath
Below is a basic example showing how the json-filter node processes input:
Input JSON:
[
{ "userId": "u1", "score": 10 },
{ "userId": "u2", "score": 15 },
{ "userId": "u1", "score": 20 }
]JMESPath Expression:
[?userId=='u1']Filtered Output:
[
{ "userId": "u1", "score": 10 },
{ "userId": "u1", "score": 20 }
]Configuration Tips
- Use
$SESSION.*variables in JMESPath expressions for dynamic filtering. - Keep layout definitions minimal — specify only what is necessary (row/column span, widget types, etc.).
- Give dashboards meaningful names to help users distinguish between multiple visualizations.
- For v2 dashboards: Ensure your payload follows the
$heat-dataserviceformat exactly. The processor validates the structure and will fail if requirements aren’t met. - For v2 dashboards: Use the v2 layout schema with
components.rowsstructure. Component-specific requirements (e.g.,TimelineChartrequirestimelineItems) must be satisfied.
Runtime Behavior
At runtime, the Dashboard Tools Runner performs the following:
V1 Dashboard (dashboard node)
-
Evaluates the JMESPath expression against the raw payload in the
json-filternode. -
Passes the filtered data to the
dashboardnode, which:- Submits the full output payload
- Parses
dashboardUsersto define access controls - Publishes a new dashboard dimension with
DashboardVersion="Legacy"using the provided name and layout
V2 Dashboard (dashboard-v2 node)
-
Validates that the input payload contains
$heat-dataservicekey -
Validates the
$heat-dataservicepayload structure (version, groups, channels) -
Validates the v2 layout configuration structure (
components.rowsformat) -
Passes the validated data to the
dashboard-v2node, which:- Submits the full output payload
- Parses
dashboardUsersto define access controls - Publishes a new dashboard dimension with
DashboardVersion="Next"using the provided name and layout
All nodes are idempotent — re-running them will append new outputs without overwriting previously published data.