Skip to main content
The Wazuh Dashboard provides a flexible framework for creating custom dashboards that visualize security data according to your specific monitoring requirements. Custom dashboards enable you to aggregate metrics, charts, and visualizations to provide tailored views of your security posture.

Overview

Custom dashboards in Wazuh Dashboard are composed of panels that display visualizations, each querying security event data from the Wazuh indices. The dashboard framework supports:
  • Dynamic panel layouts with customizable grid positioning
  • Multiple visualization types including line charts, pie charts, histograms, and area charts
  • Real-time data queries using the OpenSearch query language
  • Interactive filtering and time range selection
  • Agent-specific views for pinned agent monitoring

Dashboard architecture

Custom dashboards are built using three core components:

Dashboard configuration

The DashboardConfig class defines the dashboard metadata and orchestrates panel generation:
Reference: plugins/main/common/dashboards/lib/dashboard-config-service.ts:77

Layout definition

The DashboardLayoutDefinition class specifies the grid layout and visualization placement:
Reference: plugins/main/common/dashboards/dashboard-definitions/overview/mitre/overview/dashboard.ts:13

Visualization definitions

Visualization definitions specify the chart type, data aggregations, and query filters:
Reference: plugins/main/public/components/overview/mitre/dashboard/dashboard-panels.ts:4

Creating a custom dashboard

Step 1: Define visualization states

Create visualization configuration functions for each panel:

Step 2: Create layout definition

Define the dashboard grid layout:

Step 3: Create dashboard configuration

Implement the dashboard configuration class:

Step 4: Register the dashboard component

Create the React component using the createDashboard helper:
Reference: plugins/main/public/components/common/dashboards/dashboard.tsx:134

Visualization types

Line chart

Temporal data visualization with trend analysis:

Pie chart

Proportional distribution of categorical data:

Histogram

Bar chart for categorical comparisons:

Area chart

Stacked temporal visualizations:
Reference: plugins/main/public/components/overview/mitre/dashboard/dashboard-panels.ts:163

Advanced customization

Adding custom filters

Implement managed filters for dynamic query modification:

Agent-specific dashboards

Create dashboards that display data for a specific agent:
The framework automatically switches between overview and agent views based on context.

Custom aggregations

Implement complex data aggregations:
Reference: plugins/main/public/components/overview/mitre/dashboard/dashboard-panels.ts:349

Time range configuration

Configure default time ranges for dashboard queries:

Dashboard panel service

The DashboardPanelBuilderService automatically generates panel configurations from layout definitions:
Reference: plugins/main/common/dashboards/lib/dashboard-config-service.ts:8

Query language

Dashboards support both Kuery and Lucene query languages:

Kuery syntax

Lucene syntax

Best practices

Performance optimization

  • Limit the number of panels per dashboard to maintain responsiveness
  • Use appropriate aggregation sizes to balance detail and performance
  • Configure reasonable default time ranges to avoid querying excessive data
  • Implement pagination for large result sets

Layout design

  • The grid system uses 48 horizontal units
  • Standard panel heights range from 12 to 16 units
  • Position related visualizations adjacent to each other
  • Place high-priority metrics in the top-left quadrant

Data accuracy

  • Specify appropriate time fields for temporal aggregations
  • Use correct field types in aggregation parameters
  • Test queries independently before integrating into dashboards
  • Validate index pattern availability

Maintainability

  • Organize visualization definitions in separate files
  • Use descriptive IDs and titles for panels
  • Document custom aggregation logic
  • Implement type safety with TypeScript interfaces

Troubleshooting

Dashboard not rendering

  • Verify the index pattern ID is correct and accessible
  • Check that all required fields exist in the index
  • Confirm the dashboard ID is unique and properly registered
  • Review browser console for configuration errors

Visualizations showing no data

  • Validate the time range includes relevant events
  • Verify aggregation field names match index schema
  • Check query syntax for errors
  • Confirm data exists for the specified filters

Layout issues

  • Ensure grid coordinates do not overlap
  • Verify total width does not exceed 48 units
  • Check that panel heights provide adequate space for content
  • Test layout on different screen resolutions
  • MITRE ATT&CK framework mapping for reference dashboard implementations
  • Dashboard renderer service for understanding the rendering pipeline
  • Data source configuration for custom data fetching logic