RousselTMLEARNING

Observabilité

Analyser les profils dans Grafana : flame graphs, comparaisons et diagnostics

Méthode d'analyse des profils dans Grafana : Profiles Drilldown, flame graph et top table, comparaison de deux périodes (diff), profils mémoire et verrous, cas concrets de diagnostic.

1. Une méthode en quatre étapes #

Du symptôme à la ligne de code.

Méthode #

  1. Partir d'un symptôme : CPU élevé sur un dashboard, latence p99 dégradée, OOMKilled.
  2. Choisir le bon type de profil : CPU pour la consommation, wall clock pour la latence, inuse_space pour une fuite, alloc_space pour la pression du GC, mutex/block pour la contention.
  3. Réduire le périmètre par labels (service_name, pod, endpoint) et par plage de temps.
  4. Lire la top table triée par self time, puis le flame graph pour comprendre d'où viennent les appels.

2. Comparer deux périodes #

La fonction diff.

Avant / après #

La vue Comparison (diff flame graph) superpose deux sélections : la référence (baseline) et la comparaison. Les fonctions en rouge consomment plus, celles en vert moins. C'est l'outil idéal pour :

  • comparer une version N et N+1 (label version) ;
  • comparer un pic de CPU à une période normale ;
  • comparer deux régions ou deux types d'instances.
Bonne Pratique : Ajoutez systématiquement un label version (commit ou tag) à vos profils : chaque déploiement devient comparable en un clic.

3. Cas concrets #

Ce que l'on trouve vraiment.

Exemples fréquents #

SymptômeProfilDécouverte typique
CPU élevéprocess_cpuExpression régulière compilée à chaque appel, sérialisation JSON par réflexion
GC très actifalloc_spaceConcaténations de chaînes dans une boucle, slices non pré-allouées
Mémoire qui croît sans fininuse_spaceCache sans éviction, goroutines bloquées qui retiennent des objets
Latence élevée, CPU baswall, block, mutexVerrou global, pool de connexions trop petit
Coût cloudprocess_cpu agrégé sur tout le parcUne bibliothèque de logs coûte 15 % du CPU total
// Avant : compilée à chaque appel (visible dans le flame graph : regexp.Compile)
func isValid(s string) bool { return regexp.MustCompile(`^[A-Z]{3}-\d+$`).MatchString(s) }

// Après : compilée une fois
var ref = regexp.MustCompile(`^[A-Z]{3}-\d+$`)
func isValid(s string) bool { return ref.MatchString(s) }

Des profils dans les dashboards #

Le panneau Flame graph de Grafana peut être placé dans un dashboard à côté des métriques CPU du service. On peut aussi tracer une série issue des profils (par exemple le CPU d'une fonction donnée) pour suivre l'effet d'une optimisation dans le temps.

Articles liés

Le profiling continu avec Grafana Pyroscope : pourquoi et comment

Le quatrième signal de l'observabilité : ce qu'est le profiling continu, les types de profils (CPU, mémoire, …

Architecture et déploiement de Grafana Pyroscope

Les composants de Pyroscope (distributor, ingester, querier, store-gateway, compactor), le stockage objet, le…

Instrumenter ses applications pour Pyroscope : SDK, Alloy et eBPF

Envoyer des profils à Pyroscope depuis Go, Java, Python et Node.js avec les SDK, collecter les points pprof a…

Pour aller plus loin