Grafana Dashboards
Grafana provides visual analytics dashboards connected to the PostgreSQL database.
Overview
Container Details
| Property | Value |
|---|---|
| Container | mediamagic-grafana |
| Port | 3200 |
| Version | Grafana 11 |
| Data Source | PostgreSQL |
Included Dashboards
Social Overview
File: grafana/dashboards/social-overview.json
Provides a high-level view of social media performance:
Panels:
- Total Followers — Sum across all platforms
- Follower Growth — Change over selected period
- Engagement Rate — Average engagement percentage
- Follower Trend — Line chart by platform
- Platform Comparison — Bar chart of metrics
- Top Posts — Table with engagement details
Post Performance
File: grafana/dashboards/post-performance.json
Detailed analysis of individual post performance:
Panels:
- Total Posts — Count in period
- Total Engagement — Likes + comments + shares
- Engagement Timeline — Time series chart
- Post Details — Sortable table with all metrics
Dashboard Variables
Both dashboards use variables for filtering:
| Variable | Type | Purpose |
|---|---|---|
$platform | Query | Filter by platform |
$timeRange | Time Range | Select date range |
Configuration Files
Data Source
yaml
# grafana/provisioning/datasources/postgres.yml
apiVersion: 1
datasources:
- name: PostgreSQL
type: postgres
url: postgres:5432
database: mediamagic_analytics
user: mediamagic
secureJsonData:
password: ${POSTGRES_PASSWORD}
jsonData:
sslmode: disable
maxOpenConns: 10
maxIdleConns: 10Dashboard Provisioning
yaml
# grafana/provisioning/dashboards/default.yml
apiVersion: 1
providers:
- name: 'default'
type: file
options:
path: /var/lib/grafana/dashboardsPanel Examples
Follower Trend (Time Series)
sql
SELECT
date as time,
platform,
count as "Followers"
FROM platform_followers
WHERE date >= $__timeFrom()
AND date <= $__timeTo()
AND ($platform = 'all' OR platform = $platform)
ORDER BY dateTop Posts (Table)
sql
SELECT
platform,
LEFT(content, 100) as "Content",
likes as "Likes",
comments as "Comments",
shares as "Shares",
engagement_rate as "Rate %"
FROM post_performance
WHERE collected_at >= $__timeFrom()
ORDER BY likes + comments + shares DESC
LIMIT 20Platform Comparison (Bar Chart)
sql
SELECT
platform,
SUM(impressions) as "Impressions",
SUM(engagement) as "Engagement"
FROM social_metrics
WHERE metric_date >= $__timeFrom()
GROUP BY platformCustom Dashboards
Creating a New Dashboard
- Log into Grafana at
http://localhost:3200 - Click "+" → Dashboard
- Add panels with PostgreSQL queries
- Save dashboard
Exporting Dashboard
- Open dashboard
- Settings (gear icon)
- JSON Model
- Copy and save to
grafana/dashboards/
Dashboard Best Practices
Use Variables
Add variables for platform and date range to make dashboards interactive.
Set Refresh Rate
Configure auto-refresh (e.g., 5 minutes) for real-time monitoring.
Organize with Rows
Group related panels into rows for better organization.
Accessing Grafana
| Environment | URL | Credentials |
|---|---|---|
| Local | http://localhost:3200 | admin / (from .env) |
| Production | https://analytics.yourdomain.com | admin / (from .env) |
Alerts (Optional)
Grafana can send alerts based on thresholds:
yaml
# Example alert rule
- name: FollowerDrop
condition:
- query: follower_count
reducer: last
evaluator: lt(1000)
notifications:
- email: alerts@example.comTroubleshooting
"No data" in panels
- Check PostgreSQL connection in Data Sources
- Verify tables have data:bash
docker compose exec postgres psql -U mediamagic -d mediamagic_analytics -c "SELECT COUNT(*) FROM social_metrics" - Check time range includes data dates
Data source connection error
- Check PostgreSQL is running:bash
docker compose ps postgres - Verify password in Grafana matches
.env - Check network connectivity between containers