Migrating Looker Dashboards to Holistics
High-level Overview
Looker Dashboard Types vs Holistics Dashboard
Looker has two types of dashboards:
- LookML Dashboard: Version-controlled dashboards defined in code, managed by LookML developers
- User-defined Dashboard: UI-based dashboards created via drag-and-drop in Personal or Shared folders
Holistics takes a unified approach with a single dashboard type that supports both UI and code editing modes. This eliminates the need to convert between different dashboard types - users can build visually and the code is automatically generated.
Component Mapping
Looker Component | Holistics Equivalent | Notes |
---|---|---|
Query Tile | Visualization Block | Created from explores/datasets |
Look-linked Tile | N/A | Holistics doesn't have standalone reports |
Text Tile | Text Block | For adding text, markdown content |
Extension Tile | N/A | For custom extensions |
Dashboard Filters | Filter Block | For filtering dashboard data |
Dashboard Settings Comparison
Feature | Looker | Holistics | Notes |
---|---|---|---|
Timezone Adjustment | ✅ | ✅ | Both platforms support |
Run on Load | ✅ | ✅ | Load data automatically on dashboard open |
Full-screen Mode | ✅ | ✅ | Expand visualizations to full screen |
Auto-refresh | ✅ | Coming soon | Automatic data refresh intervals |
Default Filter View | ✅ | N/A | Holistics uses inline filters |
Filter Panel Location | Fixed positions | Flexible | Place filters anywhere in layout |
Visualization Type Mapping
When migrating from Looker to Holistics, you'll need to map your existing visualizations to their Holistics equivalents. This table provides a comprehensive mapping between Looker visualization types and their Holistics counterparts:
Looker Visualization | Holistics Equivalent | Notes |
---|---|---|
Column Chart | Column Chart | Standard vertical bar visualization for category comparison |
Bar Chart | Bar Chart | Horizontal bar visualization for category comparison |
Line Chart | Line Chart | Ideal for time series and trend analysis |
Area Chart | Area Chart | Shows volume and cumulative values over time |
Pie Chart | Pie/Donut Chart | Visualizes part-to-whole relationships |
Scatter Plot | Scatter Chart | Shows correlation between two numeric variables |
Table | Table | Tabular data presentation with formatting options |
Single Value | KPI Metric | Displays a single metric with optional comparison |
Box Plot | ❌ Not natively supported yet | Available through Holistics Custom Chart |
Waterfall Chart | Custom Waterfall Chart | Shows sequential contribution to a final value |
Funnel Chart | Funnel Chart | Visualizes sequential process or conversion rates |
Word Cloud | Word Cloud | Text visualization with size indicating frequency |
Additional Holistics Visualizations
Holistics offers several visualization types that aren't available in Looker:
- Metric Sheet - Compact display of multiple KPIs in a grid layout
- Pivot Table - Advanced table with nested rows and columns for complex data analysis
- Gauge Chart - Visual representation of a metric within a defined range
- Bubble Chart - Enhanced scatter plot with third dimension shown by bubble size
- Radar Chart - Multi-variable data visualization on axes starting from the same point
When migrating dashboards, you'll typically map most Looker visualizations directly to their Holistics equivalents, while potentially enhancing your dashboards with these additional visualization types.
Step-by-Step Migration Tutorial
Step 1: Preparation
- Open your source Looker dashboard
- Create a new dashboard in Holistics
- List all components to migrate:
- Visualization tiles
- Text content
- Filters
- Dashboard settings
Step 2: Migrate Visualizations
For each query tile:
Dashboard your_dashboard {
title: 'Dashboard Title'
block block_name: VizBlock {
label: 'Visualization Label'
viz: ChartType { // ChartType can be BarChart, DataTable, LineChart, PieChart, ScatterPlot, Table, etc.
dataset: dataset_name
// other visualization settings
}
}
}For each text tile:
Dashboard your_dashboard {
title: 'Dashboard Title'
block t5: TextBlock {
content: @md Your markdown content here;;
}
}
Step 3: Set Up Filters
Dashboard your_dashboard {
title: 'Dashboard Title'
block block_name: VizBlock { }
block block_name: FilterBlock {
label: 'Filter Label'
type: 'field'
source: FieldFilterSource {
dataset: dataset_name
field: ref('model_name', 'field_name')
}
default {
operator: 'is'
value: []
}
}
}
Step 4: Configure Dashboard Settings
Dashboard your_dashboard {
title: "Your Dashboard Title"
description: "Dashboard description"
settings {
timezone: 'America/Los_Angeles'
autorun: false
cache_duration: 10
}
}
Step 5: Test and Validate
- Compare visualization outputs
- Verify filter functionality
- Test dashboard loading performance
- Check mobile responsiveness
- Validate user permissions
Common Migration Patterns
This section demonstrates how to migrate common dashboard components from Looker to Holistics.
1. Basic Dashboard Structure
- dashboard: sales_overview
title: "Sales Overview"
description: "Sales performance metrics and trends"
enable_viz_full_screen: true
layout: tile | static | grid | newspaper
refresh: "1 hour"
auto_run: true
width: 1500 # For layout: static dashboards
Dashboard sales_overview {
title: "Sales Overview"
description: "Sales performance metrics and trends"
settings {
autorun: true
}
view: CanvasLayout {
width: 1560 // Dashboard width in pixels
height: 1080 // Dashboard height in pixels
}
}
Note:
- Holistics uses a simpler dashboard configuration model with Canvas layout by default. While Looker supports multiple layout types (
tile
,static
,grid
,newspaper
), Holistics provides a flexible canvas where blocks can be freely positioned. - Features like refresh intervals are not currently supported.
2. Filter Configuration
- dashboard: sales_overview
crossfilter_enabled: true
filters:
- name: order_status
title: "Order Status"
type: field_filter
model: sales
explore: orders
field: orders.status
default_value: "completed"
allow_multiple_values: true
ui_config:
type: dropdown_menu
display: popover
Dashboard your_dashboard {
block status_filter: FilterBlock {
label: "Order Status"
type: "field"
source: FieldFilterSource {
dataset: orders
field: ref('orders', 'status')
}
settings {
input_type: 'multiple'
}
default {
operator: "is"
value: 'completed'
}
}
}
Note:
- Holistics filter configuration is more streamlined and has cross-filtering ability by default.
- But currently doesn't support advanced UI configurations available in Looker.
3. Visualization Elements (Cartesian Chart)
- dashboard: sales_overview
tile_size: 100
elements:
- name: monthly_sales
title: "Monthly Sales"
type: looker_column # Looker Column Chart
height: 4 # sets an element to be 400 pixels in height (when tile_size is 100)
width: 5 # sets an element to be 500 pixels in width (when tile_size is 100)
top: 7 # position the element 700 pixels from the top of the dashboard
left: 8 # position the element 800 pixels from the left of the dashboard
## QUERY PARAMETERS
model: sales
explore: orders
fields: [orders.created_month, orders.total_revenue]
fill_fields: [orders.created_month]
sorts: [orders.created_month desc]
limit: 500
Dashboard your_dashboard {
block block_name: FilterBlock { }
block monthly_sales: VizBlock {
label: "Monthly Sales"
viz: ColumnChart {
dataset: orders
x_axis {
field: VizFieldFull {
ref: ref('orders', 'created_month')
transformation: 'datetrunc month'
}
}
y_axis {
series {
field: VizFieldFull {
ref: ref('orders', 'total_revenue')
}
}
}
settings {
row_limit: 500
sort {
field_index: 0
direction: 'desc'
}
}
}
}
view: CanvasLayout {
block monthly_sales {
position: pos(800, 700, 500, 400) // position the element 800 pixels from the left of the dashboard, 700 pixels from the top, 500 pixels wide, and 400 pixels tall
}
}
}
Note: While both platforms support similar visualization capabilities, Holistics uses a more structured approach to defining chart components`.
4. Visualization Elements (Data Table)
- dashboard: sales_overview
tile_size: 100
elements:
- name: monthly_sales
title: "Monthly Sales"
type: looker_grid # Looker Data Table
height: 4 # sets an element to be 400 pixels in height (when tile_size is 100)
width: 5 # sets an element to be 500 pixels in width (when tile_size is 100)
top: 7 # position the element 700 pixels from the top of the dashboard
left: 8 # position the element 800 pixels from the left of the dashboard
## QUERY PARAMETERS
model: ecommerce
explore: orders
fields: [products.name, orders.total_orders_count, orders.gmv, orders.aov]
Dashboard your_dashboard {
block block_name: FilterBlock { }
block product_performance: VizBlock {
label: 'Product Performance'
viz: DataTable {
dataset: demo_ecommerce
fields: [
VizFieldFull {
ref: ref('products', 'name')
format { } // Viz Field Format Configuration
},
VizFieldFull {
label: 'Total Orders'
ref: ref('orders', 'total_orders_count')
format { } // Viz Field Format Configuration
},
VizFieldFull {
label: 'GMV'
ref: ref('orders', 'gmv')
format { } // Viz Field Format Configuration
},
VizFieldFull {
label: 'AOV'
ref: ref('orders', 'aov')
format { } // Viz Field Format Configuration
}
]
settings { } // Viz Settings Configuration
}
}
view: CanvasLayout {
block product_performance {
position: pos(800, 700, 500, 400) // position the element 800 pixels from the left of the dashboard, 700 pixels from the top, 500 pixels wide, and 400 pixels tall
}
}
}
5. Visualization Elements (Pivot Table)
- dashboard: sales_overview
tile_size: 100
elements:
- name: order_by_country_and_status
title: "Total Orders by Countries & Order Status"
type: looker_grid # Looker Data Table
height: 4 # sets an element to be 400 pixels in height (when tile_size is 100)
width: 5 # sets an element to be 500 pixels in width (when tile_size is 100)
top: 7 # position the element 700 pixels from the top of the dashboard
left: 8 # position the element 800 pixels from the left of the dashboard
## QUERY PARAMETERS
model: ecommerce
explore: orders
fields: [countries.name, orders.status, orders.total_orders_count]
pivots: [orders.status]
Dashboard your_dashboard {
block block_name: FilterBlock { }
block order_by_country_and_status: VizBlock {
label: 'Total Orders by Countries & Order Status'
viz: PivotTable {
dataset: demo_ecommerce
rows: [
VizFieldFull {
ref: ref('countries', 'name')
format { } // Viz Field Format Configuration
}
]
columns: [
VizFieldFull {
ref: ref('orders', 'status')
format { } // Viz Field Format Configuration
}
]
values: [
VizFieldFull {
ref: ref('orders', 'total_orders_count')
format { } // Viz Field Format Configuration
}
]
settings { } // Viz Settings Configuration
}
}
view: CanvasLayout {
block order_by_country_and_status {
position: pos(800, 700, 500, 400) // position the element 800 pixels from the left of the dashboard, 700 pixels from the top, 500 pixels wide, and 400 pixels tall
}
}
}
Note: Looker doesn't support pivot type explicitly, but it can be achieved by using looker_grid
type with pivots
parameters.
6. Text and Markdown Content
- dashboard: sales_overview
layout: tile
tile_size: 100
elements:
- name: dashboard_intro
type: text
height: 4 # sets an element to be 400 pixels in height (when tile_size is 100)
width: 5 # sets an element to be 500 pixels in width (when tile_size is 100)
top: 7 # position the element 700 pixels from the top of the dashboard
left: 8 # position the element 800 pixels from the left of the dashboard
## TEXT PARAMETERS
title_text: "Welcome"
subtitle_text: "Overview"
body_text: "
This dashboard shows:
• Daily revenue trends
• Order status breakdown
"
Dashboard your_dashboard {
block block_name: FilterBlock { }
block block_name: VizBlock { }
block dashboard_intro: TextBlock {
content: @md
# Welcome
## Overview
This dashboard shows:
* Daily revenue trends
* Order status breakdown
;;
}
view: CanvasLayout {
block dashboard_intro {
position: pos(800, 700, 500, 400) // position the element 800 pixels from the left of the dashboard, 700 pixels from the top, 500 pixels wide, and 400 pixels tall
}
}
}
Note: Holistics uses Markdown syntax for text formatting, providing a more familiar editing experience for developers.
Detailed Feature Comparison
LookML Parameter | Purpose | Support | Holistics Equivalent & Implementation |
---|---|---|---|
Dashboard Parameters | |||
dashboard | Create a dashboard. | ✅ | Using Holistics Dashboard syntax Dashboard your_dashboard { } |
title (for dashboard) | Change the way a dashboard name appears to users. | ✅ | Using title: 'Dashboard Title' |
description (for dashboard) | Add a description to a dashboard. | ✅ | Using description: 'Dashboard description' |
enable_viz_full_screen | Define whether dashboard viewers can see dashboard tiles in full-screen and expanded views. | ❌ | Users can see full-screen VizBlock by default and admins/analysts cannot control this |
extends | Base the LookML dashboard on another LookML dashboard. | ✅ | Using Holistics AML Extend |
extension | Require that the dashboard is extended by another dashboard. | ✔️ (partial) | No direct equivalent, but can create AML Func for a Dashboard |
layout | Start a section of LookML to define the elements that should go into each row of a layout: grid dashboard. | ❌ | Not supported yet, but default, our dashboard will be layout as canvas. |
elements (for rows) | Define the elements that should go into a row of a layout: grid dashboard. | ❌ | Holistics doesn't support grid layout. |
height (for rows) | Define the height of a row for a layout: grid dashboard. | ❌ | Holistics doesn't support grid layout. |
tile_size | Define the size of a tile for a layout: tile dashboard. | ❌ | Not supported yet. |
width (for dashboard) | Define the width of the dashboard for a layout: static dashboard. | ✅ | Can change both width and height of a Dashboard via view: CanvasLayout { width: 1560 height: 1080 } |
refresh (for dashboard) | Set the interval on which dashboard elements will automatically refresh. Note that the dashboard must be open in a browser window for this parameter to have an effect. This setting does not run in the background to "pre-warm" the dashboard cache. | ❌ | Not suppported yet. |
auto_run | Determine whether dashboards run automatically when initially opened or reloaded. | ✅ | By default, the Dashboard is auto-run, but users can disable it by using settings { autorun: false } |
Filter Parameters | |||
crossfilter_enabled | Enable or disable cross-filtering for a dashboard. | ✅ | Holistics support cross-filtering by default |
filters_bar_collapsed | Set the dashboard filter bar as default collapsed or expanded for a dashboard. | ❌ | Holistics doesn't have dedicated filter bar as filters can place anywhere in the dashboard |
filters_location_top | Set the dashboard filter bar location as top or right for a dashboard. | ✅ | Users can position filters anywhere in the dashboard |
filters (for dashboard) | Start a section of LookML to define dashboard filters. | ✅ | Using block block_name: FilterBlock { } |
name (for filters) | Create a filter. | ✅ | Using block block_name: FilterBlock { } |
title (for filters) | Change the way a filter name appears to users. | ✅ | Using label: 'Filter Label' |
type (for filters) | Determine the type of filter to be used. | ✅ | Using type: 'field' |
default_value | Set a default value for a filter, if desired. | ✅ | Using default { operator: 'is', value: ['value1', 'value2'] } |
allow_multiple_values | Limit users to a single filter value. | ✅ | Using settings { input_type: 'single' } |
required | Require that a filter is selected. | ❌ | Not supported yet. |
ui_config | Configure the filter controls that are available when users view a LookML dashboard. Has subparameters type, display, and options. | ❌ | Not supported yet. |
model (for filters) | Specify the model that contains the underlying field of a type: field_filter filter. | ✅ | No equivalent in Holistics |
explore (for filters) | Specify the Explore that contains the underlying field of a type: field_filter filter. | ✅ | Using dataset: dataset_name |
field | Specify the underlying field of a type: field_filter filter. | ✅ | Using field: ref('model_name', 'field_name') |
listens_to_filters | Narrow suggestions for dashboard filters of field_filter based on what the user enters for another dashboard filters of type: field_filter . | ✅ | Holistics Parrent-child filter |
Common Chart Parameters | |||
name (for elements) | Creates a new dashboard element and assigns it a name. | ✅ | Using block block_name: VizBlock { } |
title (for elements) | Changes how an element's name will appear to users. | ✅ | Using label: 'Element Label' |
type (for elements) | Determines the type of visualization to be used in the element. | ✅ | Using viz: ChartType { } |
height (for elements) | Defines the height of an element in units of tile_size. | ✅ | specify height in position: pos(left, top, width, height) inside view: CanvasLayout { } |
width (for elements) | Defines the width of an element in units of tile_size. | ✅ | specify width in position: pos(left, top, width, height) inside view: CanvasLayout { } |
top | Defines the top-to-bottom position of an element in units of tile_size. | ✅ | specify top in position: pos(left, top, width, height) inside view: CanvasLayout { } |
left | Defines the left-to-right position of an element in units of tile_size. | ✅ | specify left in position: pos(left, top, width, height) inside view: CanvasLayout { } |
row | Defines the top-to-bottom position of an element in units of rows for layout: newspaper dashboards | ❌ | Holistics doesn't support newspaper layout yet |
col | Defines the left-to-right position of an element in units of columns for layout: newspaper dashboards | ❌ | Holist ics doesn't support newspaper layout yet |
refresh (for elements) | Sets the interval at which the element will automatically refresh. | ❌ | Not supported yet |
note | Starts a section of LookML to define a note for an element. | ✅ | Using description: 'your block description or note' |
Query Parameters | |||
model | Defines the model to be used for the element's query. | ✅ | Using dataset: dataset_name |
explore (for elements) | Defines the Explore to be used for the element's query. | ✅ | Using dataset: dataset_name |
dimensions | Defines the dimensions to be used for the element's query. | ✅ | Use - x_axis with LineChart, BarChart of ColumnChart - fields: [] with DataTable - rows: [] with Pivot Table |
measures | Defines the measures to be used for the element's query. | ✅ | Use - y_axis with LineChart, BarChart of ColumnChart - fields: [] with DataTable - values: [] with Pivot Table |
sorts | Defines the sorts to be used for the element's query. | ✅ | Using sort { field_index: 0, direction: 'desc' } |
pivots | Defines the dimensions that should be pivoted for the element's query. | ✅ | Using - legend: with Cartesian Charts - columns: [] with Pivot Table |
limit | Defines the row limit to be used for the element's query. | ✅ | Using settings { row_limit: 10000 } |
column_limit | Defines the column limit to be used for the element's query. | ❌ | Not supported yet |
filters (for elements) | Defines the filters that cannot be changed for the element's query. | ✅ | Use filter { } |
listen | Defines the filters that can be changed for the element's query. | ✅ | Support via interactions: [ FilterInteraction {} ] |
query_timezone | Defines the time zone that should be used when the query is run. | ❌ | Follow Dashboard Timezone |
merged_queries | Defines a merged results query. | ❌ | Not supported yet |
hidden_fields | Specifies any fields to use in the query but hide in the chart. | ✅ | Use hidden: true inside VizFieldFull {} |
Plot Parameters for Cartesian Charts | |||
stacking | Specifies how series are stacked in the visualization. | ✅ | Using - settings { stack_series_by: 'value' } - settings { stack_series_by: 'percentage' } |
show_dropoff | Shows a dropoff marker for column charts. | ❌ | Not supported yet |
ordering | Specifies how bars or columns are ordered within groups. | ✅ | Use sort {} inside setting of a VizBlock |
column_spacing_ratio | Sets the spacing between columns. | ❌ | Not supported yet |
column_group_spacing_ratio | Sets the spacing between column groups. | ❌ | Not supported yet |
hide_legend | Hides the chart legend. | ||
legend_position | Specifies the position of the legend. | ||
limit_displayed_rows | Shows or hides rows in a visualization based on position. | ||
swap_axes | Swaps the x and y axes. | ||
interpolation | Specifies how points are connected in line and area charts. | ||
show_null_points | Shows null values in the visualization. | ||
discontinuous_nulls | Breaks the line or area at null values. | ||
cluster_points | Groups points that are close together in scatter charts. | ||
Plot Parameters for Pie and Donut Charts | |||
value_labels | Changes how individual sections of a pie chart are labeled. | ||
label_type | Customizes the format of labels that mark sections of a pie chart. | ||
inner_radius | Determines the inner radius of a pie chart (donut chart). | ||
charts_across | Specifies the number of donut charts per row. | ||
Plot Parameters for Progression Charts | |||
smoothedBars | Connects the outer edge of each bar in funnel charts. | ||
isStepped | Displays the funnel chart in stepped funnel style. | ||
orientation | Specifies whether data is drawn from rows or columns. | ||
labelScale | Specifies the size of labels on chart bars and sides. | ||
Value Parameters | |||
show_value_labels | Shows labels next to data points. | ||
show_null_labels | Shows labels for null values. | ||
label_color | Specifies the color for value labels. | ||
font_size | Sets the font size of value labels. | ||
label_rotation | Sets the rotation of value labels. | ||
label_value_format | Specifies the number format for value labels. | ||
show_totals_labels | Shows total values for stacked visualizations. | ||
hidden_series | Hides specific series from the visualization. | ||
show_silhouette | Shows a silhouette of the entire chart. | ||
totals_color | Specifies the color for total labels. | ||
Series Parameters | |||
colors | Sets the colors of chart series based on order. | ||
series_colors | Sets the colors of chart series based on series name. | ||
series_labels | Changes the way a series name appears to users. | ||
series_types | Assigns different chart types to individual series. | ||
show_view_names | Shows view names in chart labels. | ||
point_style | Specifies the style of points in line and scatter charts. | ||
series_point_styles | Sets point styles for specific series. | ||
size_by_field | Specifies a field to determine point size in scatter charts. | ||
plot_size_by_field | Enables sizing points by a field value. | ||
X-Axis Parameters | |||
x_axis_scale | Specifies the scale type for the x-axis. | ||
x_axis_reversed | Reverses the direction of the x-axis. | ||
show_x_axis_label | Shows a label on the x-axis. | ||
x_axis_label | Specifies a label for the x-axis. | ||
show_x_axis_ticks | Shows value labels on the x-axis. | ||
x_axis_gridlines | Shows gridlines from the x-axis. | ||
x_axis_label_rotation | Sets the rotation of x-axis labels. | ||
x_axis_datetime_label | Specifies a format for datetime x-axis labels. | ||
x_axis_zoom | Enables zooming on the x-axis. | ||
Y-Axis Parameters | |||
y_axis_gridlines | Shows gridlines from the y-axis. | ||
y_axis_reversed | Reverses the direction of the y-axis. | ||
reference_lines | Adds reference lines or regions to the chart. | ||
y_axis_zoom | Enables zooming on the y-axis. | ||
leftAxisLabelVisible | Shows a label on the left axis. | ||
leftAxisLabel | Specifies a label for the left axis. | ||
rightAxisLabelVisible | Shows a label on the right axis. | ||
rightAxisLabel | Specifies a label for the right axis. | ||
Text Tile Parameters | |||
title_text | Specifies a title for a text element. | ||
subtitle_text | Specifies a subtitle for a text element. | ||
body_text | Specifies body text for a text element. | ||
Single Value Parameters | |||
custom_color_enabled | Enables custom color for single value visualization. | ||
custom_color | Specifies a custom color for text in single value visualization. | ||
show_single_value_title | Shows a title with the query's value. | ||
single_value_title | Specifies a title to display with the query's value. | ||
valueFormat | Specifies the number format for the value. | ||
show_comparison | Adds comparison information to a single value element. | ||
comparison_type | Specifies how the comparison field is used. | ||
show_comparison_label | Shows a label with the comparison field. | ||
comparison_label | Specifies the label for the comparison field. | ||
comparison_reverse_colors | Reverses colors for negative/positive comparisons. | ||
Quadrant Parameters for Scatter Charts | |||
quadrants_enabled | Enables quadrant divisions in scatter charts. | ||
quadrant_properties | Configures properties for each quadrant. | ||
custom_quadrant_point_x | Sets the x-coordinate for quadrant division. | ||
custom_quadrant_point_y | Sets the y-coordinate for quadrant division. | ||
custom_quadrant_value_x | Sets the x-value for quadrant division. | ||
custom_quadrant_value_y | Sets the y-value for quadrant division. |