ExESDBDashboard
Advanced Dashboard Package for EventStore Cluster Monitoring
ExESDBDashboard provides composable, real-time dashboard components for monitoring and managing EventStore clusters in Phoenix applications. Features both basic cluster monitoring and an advanced admin dashboard with comprehensive analytics.
Features
🏢 Advanced Admin Dashboard
- Multi-tab Interface: Overview, Streams, Performance, and Logs tabs
- Real-time Monitoring: Live updates via Phoenix PubSub
- Dark Mode Support: Toggle between light and dark themes
- Responsive Design: Works on desktop, tablet, and mobile devices
- Stream Analytics: Monitor stream activity, event counts, and top performers
- Performance Metrics: Track response time, throughput, error rates, and resource usage
- System Logs: View and filter system logs by level (error, warning, info, debug)
- Auto-refresh: Configurable automatic data refresh with pause/resume controls
📊 Basic Cluster Dashboard
- Cluster Health: Real-time health status with visual indicators
- Node Management: Monitor connected nodes and their status
- Store Statistics: Track EventStore instances and their metrics
- Stream Counts: View total streams across all stores
- Subscription Monitoring: Track active subscriptions
🎨 Styling & UI
- Professional Design: Modern, clean interface with consistent theming
- CSS Custom Properties: Easily customizable colors and styling
- Mobile-first: Responsive grid layouts and touch-friendly controls
- Accessibility: Proper focus states and semantic HTML
- Animation: Smooth transitions and loading states
Installation
From Local Path (Development)
Add ex_esdb_dashboard to your list of dependencies in mix.exs:
def deps do
[
{:ex_esdb_dashboard, path: "../beam-campus/ex-esdb-dashboard/package"},
{:phoenix_live_view, "~> 0.18.0"}, # Required
{:ex_esdb_gater, "~> 0.1.0"} # For cluster integration
]
endFrom Hex (When Published)
def deps do
[
{:ex_esdb_dashboard, "~> 0.1.0"}
]
endQuick Start
1. Add Routes to Your Phoenix Router
# lib/my_app_web/router.ex
defmodule MyAppWeb.Router do
use MyAppWeb, :router
import ExESDBDashboard # Import dashboard routing macro
# ... your other routes
scope "/admin" do
pipe_through :browser
dashboard_routes() # Adds /cluster, /admin routes
end
endThis adds the following routes:
/admin/- Basic cluster dashboard (ClusterLive)/admin/cluster- Basic cluster dashboard (ClusterLive)/admin/admin- Advanced admin dashboard (AdminLive)
2. Include Dashboard CSS
Option A: Import in your app.scss
// assets/css/app.scss
@import "../deps/ex_esdb_dashboard/priv/static/css/dashboard.css";Option B: Copy CSS file to your assets
cp deps/ex_esdb_dashboard/priv/static/css/dashboard.css assets/css/Then include it in your CSS build process.
3. Configure PubSub (Optional)
For real-time updates, ensure Phoenix.PubSub is configured in your application:
# lib/my_app/application.ex
children = [
{Phoenix.PubSub, name: MyApp.PubSub},
# ... other children
]Usage Examples
Individual Components
You can mount individual dashboard components instead of using the routing macro:
# In your router
live "/cluster-status", ExESDBDashboard.ClusterLive
live "/admin-dashboard", ExESDBDashboard.AdminLiveEmbedding Components
Embed dashboard components in your existing LiveViews:
defmodule MyAppWeb.AdminLive do
use MyAppWeb, :live_view
def render(assigns) do
~H"""
<div class="admin-page">
<h1>System Administration</h1>
<!-- Embed cluster status widget -->
<.live_component
module={ExESDBDashboard.ClusterStatus}
id="cluster-status"
/>
<!-- Your other admin content -->
</div>
"""
end
endCustom Styling
Override CSS custom properties to match your app's theme:
/* In your app.css */
:root {
--dashboard-primary: #your-brand-color;
--dashboard-success: #your-success-color;
--dashboard-warning: #your-warning-color;
--dashboard-danger: #your-error-color;
}
/* Dark mode overrides */
@media (prefers-color-scheme: dark) {
:root {
--dashboard-bg: #1a1a1a;
--dashboard-white: #2d2d2d;
/* ... other dark mode colors */
}
}API Reference
Main Module Functions
# Get cluster data programmatically
ExESDBDashboard.get_cluster_data()
# => %{nodes: [...], stores: [...], total_streams: 42, cluster_health: :healthy}
# Individual data functions
ExESDBDashboard.cluster_health() # => :healthy | :degraded | :unhealthy
ExESDBDashboard.cluster_nodes() # => [%{name: :node1, status: :connected, ...}]
ExESDBDashboard.cluster_stores() # => [%{id: "store1", stream_count: 10, ...}]
ExESDBDashboard.total_streams() # => 42Component References
# Get LiveView component modules
ExESDBDashboard.cluster_live_component() # => ExESDBDashboard.ClusterLive
ExESDBDashboard.admin_live_component() # => ExESDBDashboard.AdminLive
ExESDBDashboard.cluster_status_component() # => ExESDBDashboard.ClusterStatusAdvanced Features
Real-time Updates
The dashboard subscribes to PubSub topics for real-time updates:
"cluster_health_updates"- Health status changes"cluster_lifecycle_events"- Node joins/leaves, store changes"system_events"- General system events"connection_status"- Connection state changes
Publish to these topics from your application:
# Broadcast health updates
Phoenix.PubSub.broadcast(
MyApp.PubSub,
"cluster_health_updates",
{:cluster_health_update, :healthy}
)
# Broadcast system events
Phoenix.PubSub.broadcast(
MyApp.PubSub,
"system_events",
{:system_event, %{type: "backup_completed", message: "Database backup finished"}}
)Performance Monitoring
The admin dashboard includes performance metrics tracking:
- Response Time: Average API response time
- Throughput: Requests/events per second
- Error Rate: Percentage of failed operations
- Memory Usage: Current memory consumption
- Trend Indicators: Up/down/stable trends for each metric
Log Monitoring
System logs with filtering capabilities:
- Filter by log level (all, error, warning, info, debug)
- Real-time log streaming
- Formatted timestamps and structured display
- Color-coded log levels
Configuration
Environment Variables
# config/config.exs
config :ex_esdb_dashboard,
# Update interval for auto-refresh (milliseconds)
update_interval: 5_000,
# Maximum number of log entries to keep
max_log_entries: 100,
# Maximum number of activity entries
max_activity_entries: 20,
# PubSub module to use
pubsub: MyApp.PubSubTheme Customization
The dashboard uses CSS custom properties for easy theming:
:root {
/* Primary colors */
--dashboard-primary: #2563eb;
--dashboard-success: #059669;
--dashboard-warning: #d97706;
--dashboard-danger: #dc2626;
/* Background colors */
--dashboard-bg: #f9fafb;
--dashboard-white: #ffffff;
--dashboard-border: #e5e7eb;
/* Text colors */
--dashboard-gray-dark: #374151;
--dashboard-gray: #6b7280;
/* Layout */
--dashboard-radius: 0.5rem;
--dashboard-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);
}Requirements
- Elixir: >= 1.12
- Phoenix: >= 1.6
- Phoenix LiveView: >= 0.18
- ExESDBGater: For cluster integration (optional)
Host Application Requirements
Your Phoenix application must have:
- Phoenix LiveView configured and running
- Phoenix.PubSub configured (for real-time updates)
- ExESDBGater.System started in supervision tree (for cluster data)
Development
Setup
git clone https://github.com/beam-campus/ex-esdb-dashboard.git
cd ex-esdb-dashboard/package
mix deps.get
mix testRunning Tests
mix test
mix test --coverBuilding Documentation
mix docs
open doc/index.htmlContributing
- Fork the repository
-
Create your feature branch (
git checkout -b feature/amazing-feature) -
Commit your changes (
git commit -m 'Add amazing feature') -
Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
License
This project is licensed under the MIT License - see the LICENSE file for details.
Changelog
v0.2.0 (2025-08-16)
- ✨ NEW: Advanced Admin Dashboard with multi-tab interface
- ✨ NEW: Dark mode support with theme toggle
- ✨ NEW: Stream analytics and performance monitoring
- ✨ NEW: System logs with filtering capabilities
- ✨ NEW: Real-time updates via PubSub integration
- ✨ NEW: Responsive design for mobile devices
- ✨ NEW: Auto-refresh with pause/resume controls
- 🎨 Enhanced CSS styling with custom properties
- 🎨 Professional UI design with animations
- 📱 Mobile-first responsive layout
- ♿ Improved accessibility and focus management
v0.1.0 (Initial Release)
- 📊 Basic cluster dashboard (ClusterLive)
- 🏥 Cluster health monitoring
- 🖥️ Node status tracking
- 🗄️ Store statistics display
- 📈 Stream and subscription counts
- 🎨 Basic CSS styling
Support
For questions, issues, or contributions:
- GitHub Issues: Report bugs or request features
- Documentation: View full documentation
- Community: Join the Elixir EventSourcing community discussions