Tableaux de bord Grafana
Créez et gérez des tableaux de bord Grafana prêts pour la production pour une observabilité complète du système.
Objectif
Concevoir des tableaux de bord Grafana efficaces pour surveiller les applications, l'infrastructure et les métriques métier.
Quand les utiliser
- Visualiser les métriques Prometheus
- Créer des tableaux de bord personnalisés
- Implémenter des tableaux de bord SLO
- Surveiller l'infrastructure
- Suivre les KPI métier
Principes de conception des tableaux de bord
1. Hiérarchie de l'information
┌─────────────────────────────────────┐
│ Métriques critiques (Grands chiffres)│
├─────────────────────────────────────┤
│ Tendances clés (Série temporelle) │
├─────────────────────────────────────┤
│ Métriques détaillées (Tableaux/Cartes de chaleur) │
└─────────────────────────────────────┘
2. Méthode RED (Services)
- Rate - Requêtes par seconde
- Errors - Taux d'erreur
- Duration - Latence/temps de réponse
3. Méthode USE (Ressources)
- Utilization - % de temps où la ressource est occupée
- Saturation - Longueur de queue/temps d'attente
- Errors - Nombre d'erreurs
Structure du tableau de bord
Tableau de bord de surveillance API
{
"dashboard": {
"title": "API Monitoring",
"tags": ["api", "production"],
"timezone": "browser",
"refresh": "30s",
"panels": [
{
"title": "Request Rate",
"type": "graph",
"targets": [
{
"expr": "sum(rate(http_requests_total[5m])) by (service)",
"legendFormat": "{{service}}"
}
],
"gridPos": { "x": 0, "y": 0, "w": 12, "h": 8 }
},
{
"title": "Error Rate %",
"type": "graph",
"targets": [
{
"expr": "(sum(rate(http_requests_total{status=~\"5..\"}[5m])) / sum(rate(http_requests_total[5m]))) * 100",
"legendFormat": "Error Rate"
}
],
"alert": {
"conditions": [
{
"evaluator": { "params": [5], "type": "gt" },
"operator": { "type": "and" },
"query": { "params": ["A", "5m", "now"] },
"type": "query"
}
]
},
"gridPos": { "x": 12, "y": 0, "w": 12, "h": 8 }
},
{
"title": "P95 Latency",
"type": "graph",
"targets": [
{
"expr": "histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, service))",
"legendFormat": "{{service}}"
}
],
"gridPos": { "x": 0, "y": 8, "w": 24, "h": 8 }
}
]
}
}
Référence : Voir assets/api-dashboard.json
Types de panneaux
1. Panneau Stat (Valeur unique)
{
"type": "stat",
"title": "Total Requests",
"targets": [
{
"expr": "sum(http_requests_total)"
}
],
"options": {
"reduceOptions": {
"values": false,
"calcs": ["lastNotNull"]
},
"orientation": "auto",
"textMode": "auto",
"colorMode": "value"
},
"fieldConfig": {
"defaults": {
"thresholds": {
"mode": "absolute",
"steps": [
{ "value": 0, "color": "green" },
{ "value": 80, "color": "yellow" },
{ "value": 90, "color": "red" }
]
}
}
}
}
2. Graphique de série temporelle
{
"type": "graph",
"title": "CPU Usage",
"targets": [
{
"expr": "100 - (avg by (instance) (rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)"
}
],
"yaxes": [
{ "format": "percent", "max": 100, "min": 0 },
{ "format": "short" }
]
}
3. Panneau tableau
{
"type": "table",
"title": "Service Status",
"targets": [
{
"expr": "up",
"format": "table",
"instant": true
}
],
"transformations": [
{
"id": "organize",
"options": {
"excludeByName": { "Time": true },
"indexByName": {},
"renameByName": {
"instance": "Instance",
"job": "Service",
"Value": "Status"
}
}
}
]
}
4. Carte de chaleur
{
"type": "heatmap",
"title": "Latency Heatmap",
"targets": [
{
"expr": "sum(rate(http_request_duration_seconds_bucket[5m])) by (le)",
"format": "heatmap"
}
],
"dataFormat": "tsbuckets",
"yAxis": {
"format": "s"
}
}
Variables
Variables de requête
{
"templating": {
"list": [
{
"name": "namespace",
"type": "query",
"datasource": "Prometheus",
"query": "label_values(kube_pod_info, namespace)",
"refresh": 1,
"multi": false
},
{
"name": "service",
"type": "query",
"datasource": "Prometheus",
"query": "label_values(kube_service_info{namespace=\"$namespace\"}, service)",
"refresh": 1,
"multi": true
}
]
}
}
Utiliser les variables dans les requêtes
sum(rate(http_requests_total{namespace="$namespace", service=~"$service"}[5m]))
Alertes dans les tableaux de bord
{
"alert": {
"name": "High Error Rate",
"conditions": [
{
"evaluator": {
"params": [5],
"type": "gt"
},
"operator": { "type": "and" },
"query": {
"params": ["A", "5m", "now"]
},
"reducer": { "type": "avg" },
"type": "query"
}
],
"executionErrorState": "alerting",
"for": "5m",
"frequency": "1m",
"message": "Error rate is above 5%",
"noDataState": "no_data",
"notifications": [{ "uid": "slack-channel" }]
}
}
Provisionnement des tableaux de bord
dashboards.yml :
apiVersion: 1
providers:
- name: "default"
orgId: 1
folder: "General"
type: file
disableDeletion: false
updateIntervalSeconds: 10
allowUiUpdates: true
options:
path: /etc/grafana/dashboards
Modèles courants de tableaux de bord
Tableau de bord infrastructure
Panneaux clés :
- Utilisation CPU par nœud
- Utilisation mémoire par nœud
- I/O disque
- Trafic réseau
- Nombre de pods par namespace
- État du nœud
Référence : Voir assets/infrastructure-dashboard.json
Tableau de bord base de données
Panneaux clés :
- Requêtes par seconde
- Utilisation du pool de connexions
- Latence des requêtes (P50, P95, P99)
- Connexions actives
- Taille de la base de données
- Décalage de réplication
- Requêtes lentes
Référence : Voir assets/database-dashboard.json
Tableau de bord application
Panneaux clés :
- Taux de requêtes
- Taux d'erreur
- Temps de réponse (percentiles)
- Utilisateurs/sessions actifs
- Taux de hit du cache
- Longueur de queue
Bonnes pratiques
- Commencez par des modèles (tableaux de bord communautaires Grafana)
- Utilisez une nomenclature cohérente pour les panneaux et les variables
- Groupez les métriques connexes en lignes
- Définissez les plages de temps appropriées (par défaut : 6 dernières heures)
- Utilisez des variables pour la flexibilité
- Ajoutez des descriptions de panneaux pour le contexte
- Configurez les unités correctement
- Définissez des seuils significatifs pour les couleurs
- Utilisez des couleurs cohérentes sur les tableaux de bord
- Testez avec différentes plages de temps
Tableau de bord en tant que code
Provisionnement Terraform
resource "grafana_dashboard" "api_monitoring" {
config_json = file("${path.module}/dashboards/api-monitoring.json")
folder = grafana_folder.monitoring.id
}
resource "grafana_folder" "monitoring" {
title = "Production Monitoring"
}
Provisionnement Ansible
- name: Deploy Grafana dashboards
copy:
src: "{{ item }}"
dest: /etc/grafana/dashboards/
with_fileglob:
- "dashboards/*.json"
notify: restart grafana
Compétences connexes
prometheus-configuration- Pour la collecte de métriquesslo-implementation- Pour les tableaux de bord SLO