Grafana is the leading open-source platform for monitoring and observability, transforming metrics, logs, and traces into actionable insights through stunning visualizations.
What is Grafana?
Grafana is a multi-platform open-source analytics and interactive visualization web application. It provides charts, graphs, and alerts for the web when connected to supported data sources. Grafana is widely used in DevOps for monitoring infrastructure, applications, and services.
Key Features:
- Universal Dashboard Create beautiful, dynamic dashboards with flexible templating
- Multiple Data Sources Connect to 150+ data sources including Prometheus, InfluxDB, Elasticsearch, MySQL, PostgreSQL, and more
- Alerting Unified alerting system with notification channels (Slack, PagerDuty, email, webhooks)
- Team Collaboration Share dashboards, create teams, and manage user permissions
- Plugin Ecosystem Extend functionality with panels, data sources, and apps
- Cloud Native Perfect for Kubernetes, Docker, and cloud environments
Why Grafana on Ubuntu?
Ubuntu LTS versions provide a stable, secure foundation for hosting Grafana. If you're starting fresh or need to set up a new Ubuntu environment for your monitoring infrastructure, check out our comprehensive guide on how to install Ubuntu 24.04 with useful tools to get your system ready.
Benefits include:
- Long-term support and security updates
- Large community and extensive documentation
- Native APT repository support from Grafana Labs
- Excellent Docker compatibility
- Perfect for both development and production environments
Installation Methods
Method 1: Install via APT Repository (Recommended)
This is the most straightforward method, providing automatic updates through Ubuntu's package manager. If you're new to working with the Ubuntu terminal or want to boost your productivity, our Ubuntu keyboard shortcuts cheatsheet can help you navigate the system more efficiently.
Step 1: Install Prerequisites
sudo apt-get install -y apt-transport-https software-properties-common wget Step 2: Add Grafana GPG Key
sudo mkdir -p /etc/apt/keyrings/ wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null Step 3: Add Grafana APT Repository
For stable releases:
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list Step 4: Update and Install Grafana
sudo apt-get update sudo apt-get install grafana Step 5: Start and Enable Grafana Service
sudo systemctl daemon-reload sudo systemctl start grafana-server sudo systemctl enable grafana-server.service Step 6: Verify Installation
sudo systemctl status grafana-server Grafana will now be running on http://localhost:3000
Method 2: Install Using Docker
Docker provides isolation and easier management for containerized deployments.
Step 1: Install Docker (if not already installed)
sudo apt-get update sudo apt-get install docker.io sudo systemctl start docker sudo systemctl enable docker Step 2: Run Grafana Container
docker run -d \ --name=grafana \ -p 3000:3000 \ -v grafana-storage:/var/lib/grafana \ grafana/grafana-oss For Persistence with Configuration:
docker run -d \ --name=grafana \ -p 3000:3000 \ -v grafana-storage:/var/lib/grafana \ -v $(pwd)/grafana.ini:/etc/grafana/grafana.ini \ -e "GF_SERVER_ROOT_URL=http://your-domain.com" \ -e "GF_SECURITY_ADMIN_PASSWORD=your-secure-password" \ grafana/grafana-oss Method 3: Install Using Docker Compose
Create a docker-compose.yml file:
version: '3.8' services: grafana: image: grafana/grafana-oss:latest container_name: grafana restart: unless-stopped ports: - '3000:3000' volumes: - grafana-storage:/var/lib/grafana - ./grafana/provisioning:/etc/grafana/provisioning environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=your-secure-password - GF_USERS_ALLOW_SIGN_UP=false - GF_SERVER_ROOT_URL=http://your-domain.com volumes: grafana-storage: Start with:
docker-compose up -d Initial Configuration
First Login
- Navigate to
http://your-server-ip:3000 - Default credentials:
- Username:
admin - Password:
admin
- Username:
- You'll be prompted to change the password immediately (highly recommended!)
Configure Your First Data Source
Example: Adding Prometheus
- Click Configuration (gear icon) → Data Sources
- Click Add data source
- Select Prometheus
- Configure:
- Name: Prometheus
- URL:
http://localhost:9090(adjust for your Prometheus instance) - Access: Server (default)
- Click Save & Test
Example: Adding InfluxDB
- Select InfluxDB as data source
- Configure:
- Query Language: Flux or InfluxQL
- URL:
http://localhost:8086 - Database: your_database_name
- User/Password: your credentials
- Click Save & Test
Creating Your First Dashboard
- Click Create (+ icon) → Dashboard
- Click Add new panel
- Select your data source
- Write your query (example for Prometheus):
rate(http_requests_total[5m]) - Customize visualization:
- Choose panel type (Graph, Gauge, Stat, Table, etc.)
- Configure legends, axes, thresholds
- Add transformations if needed
- Click Apply to save the panel
- Click Save dashboard (disk icon)
Advanced Configuration
Configure Grafana Settings
Edit the main configuration file:
sudo nano /etc/grafana/grafana.ini Important Settings:
[server] # Protocol (http, https, h2, socket) protocol = http http_port = 3000 domain = your-domain.com root_url = http://your-domain.com [security] admin_user = admin admin_password = your-secure-password secret_key = your-secret-key [users] # Disable user signup allow_sign_up = false allow_org_create = false [auth.anonymous] enabled = false [smtp] enabled = true host = smtp.gmail.com:587 user = your-email@gmail.com password = your-app-password from_address = your-email@gmail.com from_name = Grafana Restart after changes:
sudo systemctl restart grafana-server Setting Up Reverse Proxy (Nginx)
Install Nginx:
sudo apt install nginx Create Nginx Configuration:
sudo nano /etc/nginx/sites-available/grafana server { listen 80; server_name your-domain.com; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } Enable and restart:
sudo ln -s /etc/nginx/sites-available/grafana /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl restart nginx Enable HTTPS with Let's Encrypt
sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d your-domain.com Configure Alerting
Step 1: Configure Notification Channel
- Navigate to Alerting → Contact points
- Click New contact point
- Choose type (Email, Slack, PagerDuty, Webhook, etc.)
- Configure settings (e.g., Slack webhook URL)
- Test and save
Step 2: Create Alert Rule
- Edit a panel in your dashboard
- Click Alert tab
- Configure conditions:
- When: avg()
- Of: query(A, 5m, now)
- Is Above: 80
- Set evaluation interval
- Add notification channel
- Save
Popular Use Cases
Infrastructure Monitoring
Stack: Prometheus + Node Exporter + Grafana
Monitor system metrics:
- CPU, memory, disk usage
- Network traffic
- System load
- Disk I/O
For NVIDIA GPU monitoring specifically, you might want to explore specialized GPU monitoring applications for Linux/Ubuntu that integrate well with Grafana.
Import dashboard ID: 1860 (Node Exporter Full)
Kubernetes Monitoring
Stack: Prometheus + kube-state-metrics + Grafana
Monitor K8s cluster:
- Pod and container metrics
- Cluster resource usage
- Deployment status
- Ingress/service monitoring
Import dashboard ID: 15757 (Kubernetes Cluster Monitoring)
Application Performance Monitoring
Stack: Loki + Promtail + Grafana
Monitor application logs and metrics:
- Request rates and latencies
- Error rates
- Log aggregation and filtering
- Distributed tracing
Database Monitoring
Monitor MySQL, PostgreSQL, MongoDB:
- Query performance
- Connection pools
- Slow queries
- Replication status
Dashboard Best Practices
- Organize by Purpose: Create separate dashboards for different teams/services
- Use Variables: Create dynamic dashboards with template variables
- Set Appropriate Time Ranges: Default to meaningful time windows
- Add Annotations: Mark deployments and incidents
- Use Folders: Organize dashboards logically
- Enable Versioning: Track dashboard changes
- Set Refresh Intervals: Balance real-time needs with performance
- Add Documentation: Use text panels to explain metrics
Troubleshooting Common Issues
Grafana Service Won't Start
# Check logs sudo journalctl -u grafana-server -f # Check configuration sudo grafana-cli admin reset-admin-password newpassword Data Source Connection Issues
- Verify network connectivity:
telnet datasource-host port - Check firewall rules
- Verify credentials
- Check data source service logs
Performance Issues
- Reduce query time ranges
- Optimize data source queries
- Increase server resources
- Use caching where possible
- Consider query result caching
Dashboard Not Loading
- Clear browser cache
- Check browser console for errors
- Verify dashboard JSON isn't corrupted
- Check Grafana server logs
Backup and Maintenance
Backup Grafana Database
# Stop Grafana sudo systemctl stop grafana-server # Backup SQLite database sudo cp /var/lib/grafana/grafana.db /backup/grafana-$(date +%Y%m%d).db # Backup configuration sudo cp /etc/grafana/grafana.ini /backup/grafana-ini-$(date +%Y%m%d).bak # Start Grafana sudo systemctl start grafana-server Automated Backup Script
Here's a bash script to automate your Grafana backups. If you need a quick reference for bash scripting syntax and commands, check out our Bash cheat sheet for helpful tips and examples.
#!/bin/bash BACKUP_DIR="/backup/grafana" mkdir -p $BACKUP_DIR DATE=$(date +%Y%m%d_%H%M%S) # Backup database sudo cp /var/lib/grafana/grafana.db $BACKUP_DIR/grafana-$DATE.db # Backup dashboards via API curl -H "Authorization: Bearer YOUR_API_KEY" \ http://localhost:3000/api/search?type=dash-db | \ jq -r '.[] | .uid' | \ xargs -I{} curl -H "Authorization: Bearer YOUR_API_KEY" \ http://localhost:3000/api/dashboards/uid/{} > $BACKUP_DIR/dashboards-$DATE.json # Keep only last 30 days find $BACKUP_DIR -mtime +30 -delete Update Grafana
# APT method sudo apt update sudo apt upgrade grafana # Docker method docker pull grafana/grafana-oss:latest docker-compose down docker-compose up -d Security Hardening
- Change Default Credentials immediately
- Use HTTPS with valid certificates
- Configure Firewall:
sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable - Disable Anonymous Access
- Use Strong Authentication (LDAP, OAuth, SAML)
- Regular Updates Keep Grafana updated
- Limit User Permissions Use role-based access control
- Enable Audit Logging
- Use Read-Only Data Sources where possible
- Implement Rate Limiting
Monitoring Grafana Itself
Monitor your Grafana instance:
- Enable metrics endpoint in
grafana.ini:
[metrics] enabled = true - Add Grafana as Prometheus target
- Import Grafana metrics dashboard
Useful Plugins
Install plugins via CLI:
sudo grafana-cli plugins install <plugin-id> sudo systemctl restart grafana-server Recommended Plugins:
- grafana-piechart-panel: Enhanced pie charts
- grafana-worldmap-panel: Geographic data visualization
- grafana-clock-panel: Display time and date
- grafana-simple-json-datasource: Connect to custom JSON APIs
- alexanderzobnin-zabbix-app: Zabbix integration
Integration Examples
Grafana + Prometheus + Node Exporter
Complete monitoring stack setup:
# Install Node Exporter wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz tar xvfz node_exporter-1.7.0.linux-amd64.tar.gz sudo cp node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/ sudo useradd -rs /bin/false node_exporter # Create systemd service sudo tee /etc/systemd/system/node_exporter.service << EOF [Unit] Description=Node Exporter After=network.target [Service] User=node_exporter Group=node_exporter Type=simple ExecStart=/usr/local/bin/node_exporter [Install] WantedBy=multi-user.target EOF sudo systemctl start node_exporter sudo systemctl enable node_exporter Grafana with InfluxDB and Telegraf
Time-series monitoring setup:
# Install InfluxDB wget -q https://repos.influxdata.com/influxdata-archive_compat.key echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list sudo apt update && sudo apt install influxdb sudo systemctl start influxdb sudo systemctl enable influxdb # Install Telegraf sudo apt install telegraf sudo systemctl start telegraf sudo systemctl enable telegraf Performance Optimization
Query Optimization
- Use appropriate time ranges
- Limit data points returned
- Use caching strategies
- Aggregate data at source when possible
- Use recording rules in Prometheus
Server Optimization
[database] # Increase max connections max_open_conn = 300 max_idle_conn = 100 [dataproxy] # Timeout settings timeout = 30 keep_alive_seconds = 30 [rendering] # Enable concurrent render limit concurrent_render_limit = 10 Useful Links
- Official Documentation
- Grafana GitHub
- Prometheus Documentation
- InfluxDB Documentation
- How to Install Ubuntu 24.04 & useful tools
- GPU monitoring applications in Linux / Ubuntu
- Ubuntu Keyboard Shortcuts: Complete Cheatsheet
- Bash Cheat Sheet
Conclusion
Grafana on Ubuntu provides a powerful, flexible platform for monitoring and observability. Whether you're monitoring a single server or a massive Kubernetes cluster, Grafana's rich visualization capabilities, extensive data source support, and active community make it an excellent choice for DevOps teams.
Start with a simple setup using the APT repository method, connect your first data source, and gradually expand your monitoring capabilities. Remember to prioritize security, regular backups, and performance optimization as your Grafana deployment grows.
With proper configuration and best practices, Grafana becomes an indispensable tool in your observability stack, providing actionable insights that help maintain reliable, performant systems.
Top comments (0)