What is Grafana?
Grafana is an open-source visualization platform that turns metrics data into beautiful, actionable dashboards.
Grafana + Prometheus Stack
┌──────────┐ ┌────────────┐ ┌─────────┐
│ Targets │────▶│ Prometheus │────▶│ Grafana │
│(exporters)│ │ (collect) │ │(visualize)│
└──────────┘ └────────────┘ └─────────┘
Installing Grafana
With Docker
docker run -d \
--name grafana \
-p 3000:3000 \
-v grafana_data:/var/lib/grafana \
-e "GF_SECURITY_ADMIN_PASSWORD=admin123" \
grafana/grafana:latestDocker Compose (Full Stack)
version: "3.8"
services:
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin123
volumes:
- grafana_data:/var/lib/grafana
depends_on:
- prometheus
node-exporter:
image: quay.io/prometheus/node-exporter:latest
ports:
- "9100:9100"
pid: host
volumes:
- "/:/host:ro,rslave"
command:
- "--path.rootfs=/host"
volumes:
prometheus_data:
grafana_data:Connecting Prometheus
- Open Grafana at
http://localhost:3000 - Login with admin / admin123
- Navigate to Configuration → Data Sources
- Click Add data source → Prometheus
- Set URL:
http://prometheus:9090 - Click Save & Test
Building Dashboards
Panel Types
| Panel | Best For |
|---|---|
| Time Series | Metrics over time (CPU, memory, requests) |
| Stat | Single value with thresholds |
| Gauge | Current value with min/max |
| Bar Chart | Comparisons across categories |
| Table | Detailed data with multiple columns |
| Heatmap | Distribution patterns over time |
| Logs | Log entries from Loki |
Creating a Dashboard
- Click + → Dashboard → Add visualization
- Select Prometheus data source
- Enter PromQL query
- Configure visualization options
- Set title and description
- Save the dashboard
Example Panels
CPU Usage:
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)Memory Usage:
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100Disk I/O:
rate(node_disk_read_bytes_total[5m])
rate(node_disk_written_bytes_total[5m])Network Traffic:
rate(node_network_receive_bytes_total{device="eth0"}[5m])
rate(node_network_transmit_bytes_total{device="eth0"}[5m])HTTP Request Rate:
sum(rate(http_requests_total[5m])) by (status_code)Error Rate:
sum(rate(http_requests_total{status_code=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) * 100Dashboard Variables
Variables make dashboards dynamic and reusable.
# Variable: instance
Type: Query
Query: label_values(node_cpu_seconds_total, instance)
# Use in panels:
node_memory_MemTotal_bytes{instance="$instance"}
Importing Community Dashboards
Grafana has thousands of pre-built dashboards:
- Go to Dashboards → Import
- Enter dashboard ID from grafana.com
- Select data source
- Click Import
Popular Dashboard IDs
| ID | Dashboard | Purpose |
|---|---|---|
| 1860 | Node Exporter Full | System metrics |
| 3662 | Prometheus Stats | Prometheus self-monitoring |
| 12740 | Kubernetes Cluster | K8s overview |
| 14031 | Docker Monitoring | Container metrics |
Alerting in Grafana
# Alert rule example
- alert: HighErrorRate
condition: B
data:
- refId: A
queryType: range
expr: sum(rate(http_requests_total{status=~"5.."}[5m]))
- refId: B
queryType: classic_condition
conditions:
- evaluator:
type: gt
params: [0.05]
reducer:
type: last
for: 5m
annotations:
summary: Error rate above 5%Summary
You've learned:
- Installing Grafana and connecting Prometheus
- Building custom dashboards with various panel types
- Writing PromQL queries for common metrics
- Using variables for dynamic dashboards
- Importing community dashboards
- Setting up Grafana alerting
Next Steps
Next, we'll set up comprehensive alerting strategies and incident response workflows.