grafana-dashboards

Par wshobson · agents

Créez et gérez des dashboards Grafana de production pour la visualisation en temps réel des métriques système et applicatives. À utiliser pour construire des dashboards de monitoring, visualiser des métriques ou créer des interfaces d'observabilité opérationnelle.

npx skills add https://github.com/wshobson/agents --skill grafana-dashboards

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

  1. Commencez par des modèles (tableaux de bord communautaires Grafana)
  2. Utilisez une nomenclature cohérente pour les panneaux et les variables
  3. Groupez les métriques connexes en lignes
  4. Définissez les plages de temps appropriées (par défaut : 6 dernières heures)
  5. Utilisez des variables pour la flexibilité
  6. Ajoutez des descriptions de panneaux pour le contexte
  7. Configurez les unités correctement
  8. Définissez des seuils significatifs pour les couleurs
  9. Utilisez des couleurs cohérentes sur les tableaux de bord
  10. 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étriques
  • slo-implementation - Pour les tableaux de bord SLO

Skills similaires