Elixir Dashboard - Setup Guide
View SourceThis Phoenix LiveView application provides real-time performance monitoring for slow endpoints and database queries during development.
Quick Start
# Install dependencies
mix deps.get
# Start the server
./start.sh
# Or manually
PHX_SERVER=true iex -S mix phx.server
Then visit: http://localhost:4000
What You'll See
The dashboard provides three main views:
1. Homepage (/)
Landing page with links to all monitoring dashboards
2. Slow Endpoints (/dev/performance/endpoints)
- Real-time table of slowest API endpoints (>100ms)
- Auto-refreshes every 5 seconds
- Color-coded by severity:
- 🟢 Green: 100-200ms
- 🟡 Yellow: 200-500ms
- 🟠 Orange: 500-1000ms
- 🔴 Red: >1000ms
3. Slow Queries (/dev/performance/queries)
- Real-time list of slowest SQL queries (>50ms)
- Shows query text, parameters, and originating endpoint
- Auto-refreshes every 5 seconds
- Color-coded by severity:
- 🟢 Green: 50-100ms
- 🟡 Yellow: 100-200ms
- 🟠 Orange: 200-500ms
- 🔴 Red: >500ms
How It Works
Telemetry Events Monitored
The dashboard attaches to Phoenix's built-in telemetry events:
[:phoenix, :endpoint, :stop]- Captures HTTP endpoint timings[app, :repo, :query]- Captures Ecto database query timings
Architecture
ElixirDashboard.Application
├── ElixirDashboardWeb.Telemetry
├── Phoenix.PubSub
├── PerformanceMonitor.Supervisor
│ └── PerformanceMonitor.Store (GenServer)
└── ElixirDashboardWeb.EndpointData Flow
- Request arrives → Phoenix emits
[:phoenix, :endpoint, :stop]event - TelemetryHandler captures the event and stores path in process dictionary
- Database queries triggered during request emit
[app, :repo, :query]events - TelemetryHandler captures queries and correlates with request path
- Store GenServer maintains top 100 slowest entries for each category
- LiveView polls Store every 5 seconds and updates the UI
Testing
Generate Slow Endpoints
You can test the dashboard by creating artificial delays in your endpoints:
# In your controller
def show(conn, _params) do
Process.sleep(150) # Simulate slow endpoint
render(conn, :show)
endGenerate Slow Queries
If you have Ecto in your app:
# In your context
def list_users do
Process.sleep(60) # Simulate slow query
Repo.all(User)
endRun Tests
mix test
Configuration
Adjust Performance Thresholds
Edit lib/elixir_dashboard_web/performance_monitor/telemetry_handler.ex:
# Line 33: Endpoint threshold (default: 100ms)
if duration_ms > 100 do
Store.add_slow_endpoint(...)
end
# Line 46: Query threshold (default: 50ms)
if duration_ms > 50 do
Store.add_slow_query(...)
endAdjust Data Retention
Edit lib/elixir_dashboard_web/performance_monitor/store.ex:
# Line 4: Maximum items to keep (default: 100)
@max_items 100Adjust Auto-Refresh Rate
Edit the LiveView files:
# In lib/elixir_dashboard_web/live/performance_live/endpoints.ex
# Line 9: Refresh interval (default: 5000ms = 5 seconds)
:timer.send_interval(5000, self(), :refresh)Using with Your Phoenix App
To integrate this dashboard into your existing Phoenix application:
Option 1: Copy the Performance Monitor Module
Copy these files to your app:
lib/your_app_web/performance_monitor/
├── store.ex
├── telemetry_handler.ex
└── supervisor.ex
lib/your_app_web/live/performance_live/
├── endpoints.ex
└── queries.exThen:
Add the supervisor to your application:
# In lib/your_app/application.ex children = [ # ... your existing children YourAppWeb.PerformanceMonitor.Supervisor ]Attach telemetry handlers:
# In lib/your_app/application.ex, in start/2 if Mix.env() == :dev do YourAppWeb.PerformanceMonitor.TelemetryHandler.attach() endAdd routes:
# In lib/your_app_web/router.ex if Mix.env() == :dev do scope "/dev/performance", YourAppWeb.PerformanceLive do pipe_through :browser live "/endpoints", Endpoints, :index live "/queries", Queries, :index end end
Option 2: Run as Standalone (Current Setup)
Run this dashboard as a separate application alongside your main app. Benefits:
- No code changes to your main app
- Clean separation of concerns
- Easy to remove when not needed
Environment-Specific Behavior
Development
- Telemetry handlers attached
- All monitoring features active
- LiveReload enabled
- Debug logging enabled
Test
- Telemetry handlers NOT attached
- Server doesn't start by default
- Minimal logging
Production
- Telemetry handlers NOT attached
- Dashboard routes not available
- Zero overhead
Troubleshooting
No data appearing?
- Make sure the server started with
PHX_SERVER=true - Verify telemetry handlers are attached (dev environment)
- Check that your requests/queries exceed the thresholds
- Look for error messages in the console
Can't access the dashboard?
- Verify the server is running on port 4000
- Check that routes are configured correctly
- Ensure you're in development mode (
MIX_ENV=dev)
Queries not correlating with endpoints?
The correlation uses the process dictionary to link queries to their triggering request. This works for:
- ✅ Synchronous queries in the same process
- ❌ Async queries in different processes (will show "N/A (Background Process)")
Advanced Usage
Clear Data Programmatically
# In IEx
ElixirDashboardWeb.PerformanceMonitor.Store.clear_all()Inspect Data
# Get all slow endpoints
endpoints = ElixirDashboardWeb.PerformanceMonitor.Store.get_slow_endpoints()
# Get all slow queries
queries = ElixirDashboardWeb.PerformanceMonitor.Store.get_slow_queries()Detach Telemetry Handlers
# In IEx
ElixirDashboardWeb.PerformanceMonitor.TelemetryHandler.detach()Contributing
This dashboard was designed based on the specifications in 01.md. To extend it:
- Add new telemetry events to
telemetry_handler.ex - Create new LiveView pages for visualization
- Extend the Store GenServer with new data types
- Add new routes in
router.ex
License
Companion tool for New Relic Elixir Agent development.