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: r(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: r(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: r(orders.created_month)
transformation: 'datetrunc month'
}
}
y_axis {
series {
field: VizFieldFull {
ref: r(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: r(products.name)
format { } // Viz Field Format Configuration
},
VizFieldFull {
label: 'Total Orders'
ref: r(orders.total_orders_count)
format { } // Viz Field Format Configuration
},
VizFieldFull {
label: 'GMV'
ref: r(orders.gmv)
format { } // Viz Field Format Configuration
},
VizFieldFull {
label: 'AOV'
ref: r(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: r(countries.name)
format { } // Viz Field Format Configuration
}
]
columns: [
VizFieldFull {
ref: r(orders.status)
format { } // Viz Field Format Configuration
}
]
values: [
VizFieldFull {
ref: r(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. |