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
TheDashboardConfig class defines the dashboard metadata and orchestrates panel generation:
plugins/main/common/dashboards/lib/dashboard-config-service.ts:77
Layout definition
TheDashboardLayoutDefinition class specifies the grid layout and visualization placement:
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: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 thecreateDashboard helper:
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: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:Custom aggregations
Implement complex data aggregations:plugins/main/public/components/overview/mitre/dashboard/dashboard-panels.ts:349
Time range configuration
Configure default time ranges for dashboard queries:Dashboard panel service
TheDashboardPanelBuilderService automatically generates panel configurations from layout definitions:
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
Related resources
- 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