Canvas Workpads
Canvas is Kibana's presentation and infographic tool. Unlike dashboards which focus on interactivity and exploration, Canvas creates pixel-perfect, styled layouts with live data for wall-mounted displays, executive reports, and branded presentations.
Canvas vs Dashboards
| Feature | Dashboards | Canvas |
|---|---|---|
| Primary purpose | Interactive exploration | Presentation & display |
| Layout | Grid-based, auto-flowing | Pixel-perfect, absolute positioning |
| Styling | Limited (standard themes) | Full control (CSS, colors, fonts) |
| Data connection | Visualizations + data views | Expressions, SQL, Elasticsearch |
| Interactivity | Filters, drilldowns | Limited (click actions) |
| Auto-refresh | Yes | Yes (slideshow mode) |
| Best for | Analysis, monitoring | TV displays, reports, infographics |
Opening Canvas
- Go to Canvas in the navigation menu (under Analytics)
- Click "Create workpad"
- Choose:
- Blank workpad: Start from scratch
- Sample workpads: Pre-built examples (if sample data loaded)
- Import workpad: Upload a JSON file
The Canvas Interface
┌──────────────────────────────────────────────────────────────┐
│ Workpad Name [+Page] [▶ Fullscreen] [Save] [⋯] │
├──────┬───────────────────────────────────────────────────────┤
│ │ ┌──────────────────────────────────────────────────┐ │
│ E │ │ │ │
│ l │ │ │ │
│ e │ │ Canvas Page │ │
│ m │ │ │ │
│ e │ │ [Live Data Element] │ │
│ n │ │ │ │
│ t │ │ [Chart] [Image] │ │
│ s │ │ │ │
│ │ └──────────────────────────────────────────────────┘ │
├──────┤ ┌────┐ ┌────┐ ┌────┐ │
│ Style│ │ P1 │ │ P2 │ │ P3 │ ← Page thumbnails │
└──────┘ └────┘ └────┘ └────┘ │
└──────────────────────────────────────────────────────────────┘
Key Areas
- Toolbar (top): Add elements, controls, page management
- Elements panel (left): Add new elements to the page
- Canvas area (center): The workpad page with absolute positioning
- Style panel (left/right): Configure selected element styling
- Page thumbnails (bottom): Navigate between pages
Workpad Settings
Page Size
Configure the workpad dimensions:
Presets:
- US Letter (1920 × 1080) → Standard HD display
- A4 Portrait (842 × 1191) → PDF reports
- Custom → Any dimensions
Common sizes for displays:
- 1920 × 1080 → Full HD TV/monitor
- 3840 × 2160 → 4K display
- 1080 × 1920 → Vertical display/kiosk
Background
Set page background:
Options:
- Solid color: #1a1a2e (dark theme)
- Gradient: Linear from #16213e to #0f3460
- Image: Upload background image
Auto-Refresh
Settings → Auto-refresh interval
Recommended:
- Real-time displays: 10-30 seconds
- Office dashboards: 1-5 minutes
- Reports: No auto-refresh
Adding Elements
Element Types
Click "Add element" in the toolbar:
| Element | Description | Use Case |
|---|---|---|
| Metric | Single number, big display | KPIs on wall displays |
| Chart | Area, bar, line, pie, etc. | Data visualization |
| Data table | Tabular data | Detailed breakdowns |
| Markdown | Formatted text | Titles, descriptions |
| Image | Static or dynamic image | Logos, icons |
| Shape | Rectangle, circle, etc. | Decorative elements |
| Progress | Progress indicator | Goal tracking |
| Dropdown filter | Interactive filter | User selection |
| Time filter | Time range control | Date selection |
Adding a Metric Element
- Click "Add element" → "Metric"
- A metric element appears on the canvas
- Click the element to select it
- Configure in the right panel:
Data tab:
Data source: Elasticsearch SQL
Query: SELECT SUM(taxful_total_price) AS revenue
FROM "kibana_sample_data_ecommerce"
Display tab:
Label: "Total Revenue"
Format: Currency ($)
Font size: 48px
Color: #00ff88
Adding a Chart Element
- Click "Add element" → "Chart"
- Choose chart type (area, bar, line, pie, etc.)
- Configure data source:
Data source: Elasticsearch SQL
Query:
SELECT category.keyword AS category,
SUM(taxful_total_price) AS revenue
FROM "kibana_sample_data_ecommerce"
GROUP BY category.keyword
ORDER BY revenue DESC
LIMIT 5
Chart settings:
Type: Horizontal bar
X-axis: revenue
Y-axis: category
Colors: Custom palette
Data Sources
Canvas supports multiple data sources for elements.
Elasticsearch SQL
The most common data source:
-- Simple count
SELECT COUNT(*) AS total_orders
FROM "kibana_sample_data_ecommerce"
-- Aggregation with grouping
SELECT manufacturer.keyword AS brand,
COUNT(*) AS order_count,
SUM(taxful_total_price) AS revenue,
AVG(taxful_total_price) AS avg_order
FROM "kibana_sample_data_ecommerce"
GROUP BY manufacturer.keyword
ORDER BY revenue DESC
LIMIT 10
-- Time-based query
SELECT HISTOGRAM(order_date, INTERVAL 1 DAY) AS day,
COUNT(*) AS orders,
SUM(taxful_total_price) AS revenue
FROM "kibana_sample_data_ecommerce"
GROUP BY day
ORDER BY day
-- Filtered query
SELECT COUNT(*) AS error_count
FROM "filebeat-*"
WHERE level = 'error'
AND @timestamp > NOW() - INTERVAL 1 HOUR
Timelion
Time-series expression language:
.es(index=kibana_sample_data_ecommerce,
timefield=order_date,
metric=sum:taxful_total_price)
.title("Revenue Over Time")
.label("Revenue")
.color(#00ff88)
Static Data (Demo Data)
For prototyping or static labels:
{
"type": "datatable",
"columns": [
{ "name": "metric", "type": "string" },
{ "name": "value", "type": "number" }
],
"rows": [
{ "metric": "Revenue", "value": 125430 },
{ "metric": "Orders", "value": 4675 },
{ "metric": "Customers", "value": 2341 }
]
}
Expressions
Canvas uses an expression language under the hood. Every element is defined by an expression.
Viewing an Element's Expression
- Select an element
- Click "Expression editor" (bottom of the page, code icon)
- See the raw expression:
filters
| essql
query="SELECT SUM(taxful_total_price) AS revenue FROM \"kibana_sample_data_ecommerce\""
| math "revenue"
| metric "Total Revenue"
metricFont={font size=48 family="'Open Sans', Helvetica, Arial, sans-serif"
color="#00ff88" align="center" lHeight=60}
labelFont={font size=18 family="'Open Sans', Helvetica, Arial, sans-serif"
color="#FFFFFF" align="center"}
| render
Expression Building Blocks
SOURCES (data retrieval)
essql → Elasticsearch SQL query
esdocs → Raw Elasticsearch documents
timelion → Timelion expressions
demodata → Sample static data
filters → Current workpad filters
TRANSFORMS (data manipulation)
math → Mathematical operations
mapColumn → Transform column values
filterrows → Filter data rows
sort → Sort results
head → First N rows
tail → Last N rows
columns → Select/rename columns
DISPLAY (rendering)
metric → Big number display
plot → Charts (line, bar, area, etc.)
pie → Pie chart
table → Data table
markdown → Markdown text
image → Image display
shape → Geometric shapes
progress → Progress bar
render → Final render step
Custom Expression Examples
Metric with conditional color:
filters
| essql
query="SELECT COUNT(*) AS errors
FROM \"filebeat-*\"
WHERE level = 'error'
AND @timestamp > NOW() - INTERVAL 1 HOUR"
| math "errors"
| if {math "errors" | gt 100}
then={metric "Critical Errors"
metricFont={font size=60 color="#ff4444"}}
else={metric "Errors"
metricFont={font size=60 color="#00ff88"}}
| render
Formatted number:
filters
| essql query="SELECT SUM(taxful_total_price) AS revenue
FROM \"kibana_sample_data_ecommerce\""
| math "revenue"
| formatnumber "$ 0,0.00"
| markdown "## Revenue\n**{{}}"
font={font size=36 color="#ffffff" align="center"}
| render
Styling Elements
Positioning
Click an element and use the position controls:
Position:
X: 100 (pixels from left)
Y: 50 (pixels from top)
Size:
Width: 400
Height: 200
Rotation: 0°
Layer:
Bring forward / Send backward
Element Styling
Background:
- Color: #1a1a2e
- Opacity: 80%
- Border: 1px solid #333
- Border radius: 8px
Shadow:
- X offset: 2px
- Y offset: 4px
- Blur: 8px
- Color: rgba(0,0,0,0.5)
Padding:
- Top/Bottom/Left/Right: 16px
Typography
Font:
- Family: 'Inter', 'Open Sans', 'Helvetica'
- Size: 14px - 72px
- Weight: Normal / Bold
- Color: #ffffff
- Alignment: Left / Center / Right
- Line height: 1.4
CSS Support
Canvas elements support custom CSS for advanced styling:
/* Apply to element via custom CSS option */
.canvasElement {
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
transition: transform 0.2s ease;
}
.canvasElement:hover {
transform: scale(1.02);
}
Multi-Page Workpads
Adding Pages
- Click "+ Add page" at the bottom
- Each page is like a slide in a presentation
- Pages can have different backgrounds and layouts
Page Navigation
In edit mode: Click page thumbnails at the bottom
In fullscreen: Arrow keys or auto-advance
Auto-advance settings:
Interval: 10 seconds per page
Transition: Fade / Slide
Organizing Pages
Typical multi-page workpad:
Page 1: Executive Summary
- Key KPIs (revenue, orders, customers)
- Overall trend line
- Company logo
Page 2: Sales Detail
- Revenue by category
- Top products
- Geographic breakdown
Page 3: Operations
- System health
- Error rates
- Response times
Page 4: Customer Insights
- New vs returning
- Cohort analysis
- Customer satisfaction
Fullscreen and Kiosk Mode
Entering Fullscreen
- Click the "Fullscreen" button (▶) in the toolbar
- Workpad fills the entire screen
- All toolbars and navigation are hidden
- Data continues to refresh based on auto-refresh settings
Kiosk Mode via URL
Access Canvas directly in kiosk mode for TV displays:
# Standard Canvas URL
https://kibana.example.com/app/canvas#/workpad/abc123/page/1
# Kiosk mode (no Kibana chrome)
https://kibana.example.com/app/canvas#/workpad/abc123/page/1?__fullScreen=true
Setting Up a Wall Display
1. Create workpad sized to your display (e.g., 1920 × 1080)
2. Configure auto-refresh (30 seconds)
3. Set up multi-page auto-advance (10 seconds per page)
4. Open in browser fullscreen mode (F11)
5. Set browser to auto-start on boot
Linux auto-start:
chromium --kiosk "https://kibana:5601/app/canvas#/workpad/abc123?__fullScreen=true"
Workpad Templates
Creating a Template
Build a workpad and export it for reuse:
- Build your workpad with layout and styling
- Use placeholder data sources
- Export: Click "..." → "Share" → "Download as JSON"
- Save the JSON file as your template
Importing a Template
- Go to Canvas → "Create workpad"
- Click "Import workpad"
- Select your JSON template
- Modify data sources to point to your indices
Template Structure
{
"id": "workpad-template-001",
"name": "Operations Dashboard Template",
"width": 1920,
"height": 1080,
"pages": [
{
"id": "page-1",
"style": {
"background": "#1a1a2e"
},
"elements": [
{
"id": "element-1",
"type": "metric",
"expression": "filters | essql query=\"...\" | math ...",
"position": { "left": 50, "top": 30, "width": 400, "height": 200 }
}
]
}
]
}
Practical Examples
Example 1: NOC Wall Display
Network Operations Center display for monitoring:
Page layout (1920 × 1080):
┌────────────────────────────────────────────────────────┐
│ [Logo] Network Operations Center [Clock/Date] │
├────────┬────────┬────────┬────────┬────────────────────┤
│ Active │ Error │ Avg │ Uptime │ │
│ Users │ Rate │ Resp. │ │ Traffic │
│ 1,234 │ 0.3% │ 145ms │ 99.98% │ Over Time │
│ │ │ │ │ (area chart) │
├────────┴────────┴────────┤ │ │
│ │ │ │
│ Top Error Endpoints ├────────┴────────────────────┤
│ /api/checkout 45 │ │
│ /api/search 23 │ Server Health Map │
│ /api/payment 12 │ (table with colors) │
│ │ │
└──────────────────────────┴─────────────────────────────┘
Data sources:
- Metric elements: essql queries with 30s refresh
- Area chart: Timelion for time series
- Error table: essql with ORDER BY count DESC
Key metric expression:
filters
| essql query="SELECT COUNT(DISTINCT clientip) AS active
FROM \"filebeat-*\"
WHERE @timestamp > NOW() - INTERVAL 5 MINUTE"
| math "active"
| metric "Active Users"
metricFont={font size=60 color="#00ff88" align="center"}
labelFont={font size=16 color="#888888" align="center"}
| render
Example 2: Executive Revenue Report
Multi-page branded report:
Page 1: Cover Page
- Company logo (image element)
- Report title (markdown)
- Date range (time filter value)
- Generated timestamp
Page 2: Revenue Overview
- Total Revenue metric
- Revenue trend (area chart)
- Revenue by region (horizontal bar)
- vs. Previous period comparison
Page 3: Product Performance
- Top 10 products table
- Category breakdown (pie chart)
- Product revenue trend per category
Page 4: Customer Insights
- Unique customers metric
- Revenue per customer metric
- Geographic distribution (if map data available)
Example 3: Real-Time Sales Counter
Minimal display for retail environments:
Layout (1080 × 1920, vertical):
┌────────────────────┐
│ │
│ TODAY'S SALES │
│ │
│ $47,832.00 │
│ ↑ 12% vs yday │
│ │
│ ──────────── │
│ │
│ ORDERS: 423 │
│ │
│ ──────────── │
│ │
│ [Progress bar] │
│ 84% of target │
│ │
│ ──────────── │
│ │
│ TOP PRODUCT: │
│ Premium Shirt │
│ ($2,340) │
│ │
└────────────────────┘
Auto-refresh: 10 seconds
Tips and Best Practices
Design Tips
✅ Design for the target screen size and resolution
✅ Use high-contrast colors for readability at distance
✅ Keep fonts large (48px+ for metrics, 24px+ for labels)
✅ Use consistent color coding (green=good, red=bad)
✅ Limit to 6-8 data elements per page
❌ Don't overcrowd pages (whitespace is good)
❌ Don't use small text on wall displays
❌ Don't use light colors on light backgrounds
❌ Don't show unnecessary decoration
Performance Tips
✅ Use essql with specific queries (no SELECT *)
✅ Limit result sets (LIMIT 10)
✅ Use appropriate refresh intervals (not too frequent)
✅ Optimize Elasticsearch queries for speed
❌ Don't query all indices when one suffices
❌ Don't refresh every second (5-10s minimum)
❌ Don't use complex aggregations without caching
Maintainability
✅ Use descriptive element names
✅ Group related elements on the same page
✅ Document data sources in a markdown element
✅ Export backups of important workpads regularly
✅ Use templates for consistent branding
❌ Don't hardcode dates in queries (use NOW() and intervals)
❌ Don't rely on Canvas for complex analysis (use dashboards)
Common Issues
"No data" on elements
Causes:
- SQL query error → Check expression editor for errors
- Wrong index name → Verify index exists
- Time range → Ensure data falls within query timeframe
Fix: Open expression editor, test the query step by step.
Elements overlap incorrectly
Fix: Use layer ordering:
- Right-click element → "Send to back" / "Bring to front"
- Or use the layer controls in the position panel
Workpad doesn't auto-refresh
Fix:
- Check auto-refresh is enabled (Settings icon)
- Ensure the
filtersfunction is at the start of expressions - Verify Kibana can reach Elasticsearch
Summary
In this chapter, you learned:
- ✅ How Canvas differs from dashboards (presentation vs exploration)
- ✅ Creating workpads with custom dimensions and backgrounds
- ✅ Adding and configuring elements (metrics, charts, markdown)
- ✅ Using Elasticsearch SQL and expressions for data
- ✅ Styling elements with positioning, colors, and CSS
- ✅ Building multi-page workpads with auto-advance
- ✅ Setting up fullscreen and kiosk mode for displays
- ✅ Practical examples for NOC displays, reports, and retail
Next: Setting up alerts and rules to be notified when conditions change!