Technique
Requêtes MetricsQL et tableaux de bord Grafana
Pour : ingénieurs et SREPrérequis : Avoir lu la leçon 3 du parcours et connaître les bases de PromQL.
Module 7 : MetricsQL, les requêtes essentielles
Section intitulée « Module 7 : MetricsQL, les requêtes essentielles »7.1 Fonctionnalités MetricsQL utiles à l’observabilité LLM
Section intitulée « 7.1 Fonctionnalités MetricsQL utiles à l’observabilité LLM »MetricsQL est largement compatible avec PromQL : la plupart des requêtes PromQL s’exécutent sans modification. Quelques extensions sont particulièrement utiles ici :
| Fonctionnalité | Usage pour les charges LLM |
|---|---|
rate() et increase() sans extrapolation | Totaux de coût plus proches des valeurs réelles sur des compteurs peu alimentés |
Fenêtre d’analyse facultative (rate(x) utilise automatiquement le pas) | Requêtes de tableau de bord plus simples |
median_over_time, quantile_over_time | Statistiques robustes sur les scores et les nombres de tokens |
rollup_candlestick | Ouverture, plus haut, plus bas, clôture d’une série (par exemple les scores RAG) |
outliers_mad | Repère les séries qui s’écartent du groupe (par exemple un modèle parmi d’autres) |
Modèles WITH | Réutiliser des sous-expressions dans les requêtes longues |
7.2 Requêtes de coût et de tokens
Section intitulée « 7.2 Requêtes de coût et de tokens »Coût LLM horaire par modèle (USD) :
sum by (model, provider) (increase(llm_cost_usd_total[1h]))Projection du coût quotidien (extrapolée à partir des 30 dernières minutes) :
sum by (model) (rate(llm_cost_usd_total[30m])) * 86400Les 10 tenants les plus coûteux (dernières 24 heures) :
topk(10, sum by (tenant_id) (increase(llm_cost_usd_total[24h])))Ratio tokens de sortie sur tokens d’entrée (repérer les requêtes atypiques) :
sum(rate(llm_tokens_total{type='output'}[5m])) /sum(rate(llm_tokens_total{type='input'}[5m]))7.3 Requêtes de qualité RAG
Section intitulée « 7.3 Requêtes de qualité RAG »Anomalie du score de recherche : détecter la dérive d’un index
Section intitulée « Anomalie du score de recherche : détecter la dérive d’un index »Z-score du score de recherche par rapport à une référence de 7 jours (résolution horaire) :
( avg by (index_id) (rag_retrieval_score_avg) - avg_over_time(avg by (index_id) (rag_retrieval_score_avg)[7d:1h]))/stddev_over_time(avg by (index_id) (rag_retrieval_score_avg)[7d:1h])Une valeur proche de 0 signifie « comme d’habitude ». Une valeur fortement négative (par exemple inférieure à -3, à calibrer sur votre historique) signale une baisse de la qualité de recherche. Deux limites : la référence exige sept jours d’historique et un écart type proche de zéro (score très stable) rend le ratio instable. La fonction MetricsQL outliers_mad est un outil complémentaire quand vous voulez comparer les index entre eux plutôt qu’à leur propre passé.
Pression de contexte P95 par pipeline :
histogram_quantile(0.95, sum by (le, pipeline_id) ( rate(rag_context_pressure_ratio_bucket[10m]) ))Chunks abandonnés pour 100 requêtes :
sum by (pipeline_id) (rate(rag_chunks_dropped_total[5m])) /sum by (pipeline_id) (rate(llm_requests_total[5m])) * 1007.4 Requêtes de performance et de latence
Section intitulée « 7.4 Requêtes de performance et de latence »Latence de bout en bout P99 par modèle :
histogram_quantile(0.99, sum by (le, model, provider) ( rate(llm_request_duration_ms_bucket[5m]) ))TTFT P95, délai avant le premier token (time to first token, critique en streaming) :
histogram_quantile(0.95, sum by (le, model) (rate(llm_ttft_ms_bucket[5m])))Efficacité énergétique GPU, tokens de sortie par joule :
sum(rate(llm_tokens_total{type='output'}[5m])) /sum(DCGM_FI_DEV_POWER_USAGE)Module 8 : tableaux de bord Grafana, structure et panneaux
Section intitulée « Module 8 : tableaux de bord Grafana, structure et panneaux »Un tableau de bord LLM type s’organise en quatre rangées fonctionnelles qui reprennent les quatre dimensions de la taxonomie : vue d’ensemble du service (trafic, latence, erreurs), qualité RAG, coûts et tokens, infrastructure GPU.
8.1 Configuration de la source de données
Section intitulée « 8.1 Configuration de la source de données »# Source de données provisionnée (grafana/provisioning/datasources/vm.yaml)apiVersion: 1datasources: - name: VictoriaMetrics type: victoriametrics-metrics-datasource url: http://victoriametrics:8428 access: proxy isDefault: true jsonData: timeInterval: '15s'8.2 Variables de modèle
Section intitulée « 8.2 Variables de modèle »# Variable 'model' : liste des modèles actifslabel_values(llm_requests_total, model)
# Variable 'provider'label_values(llm_requests_total{model=~'$model'}, provider)
# Variable 'pipeline_id'label_values(rag_retrieval_score_avg, pipeline_id)8.3 Types de panneaux recommandés par métrique
Section intitulée « 8.3 Types de panneaux recommandés par métrique »| Métrique | Type de panneau | Options clés |
|---|---|---|
| Requêtes par minute (SLA) | Stat + sparkline | Vert au-dessus de 0, orange si dérive de plus de 20 % |
| Latence P99 | Stat + seuil | Seuils absolus selon le SLO contractuel |
| Taux d’erreur | Stat + seuil | Rouge au-dessus de 1 %, orange au-dessus de 0,5 % |
| Score de recherche sur 7 jours | Série temporelle | Courbe du score, seuil à 0,70, z-score en seconde requête |
| Pression de contexte P95 | Série temporelle + seuil | Zone rouge au-dessus de 0,85 |
| Coût cumulé par modèle | Série temporelle en aires empilées | Une couleur par modèle, unité USD |
| Distribution des tokens | Carte de chaleur ou histogramme | Fait ressortir les requêtes anormalement longues |
| Utilisation GPU | Jauge + seuil | Orange à 80 %, rouge à 95 % |
| File d’attente vLLM | Série temporelle | Alerte au-delà de 10 requêtes en attente |
| Z-score du score de recherche | Série temporelle | Seuil à calibrer (par exemple -3), ou anomaly_score si vous utilisez vmanomaly |