Prometheus alerte sur la cardinalité quand un service crash en boucle

anais67 14/06/2025
RÉSOLU
anais67
Auteur
Avatar de anais67
anais67
Auteur

salut les pros de l'op

on a un microservice qui fait des siennes en prod, il crash en boucle depuis ce matin. le souci c'est que prometheus hurle à cause de la cardinalité. notre règle d'alerte pour les pods down (kube_pod_status_phase{phase="Failed"}) génère des milliers de timeseries nouvelles à chaque crash car le pod a un nouveau nom à chaque fois. du coup prometheus galère, ça bouffe le storage et le query engine. comment vous gérez ça ?


# règle d'alerte simplifiée
ALERT PodFailed
  IF kube_pod_status_phase{phase="Failed"} == 1
  FOR 5m
  LABELS {
    severity = "warning"
  }
  ANNOTATIONS {
    summary = "Pod {{ $labels.pod }} failed to start",
    description = "Pod {{ $labels.pod }} in namespace {{ $labels.namespace }} has been in a failed state for more than 5 minutes."
  }

on est sur k8s avec un prometheus en mode centralisé, pas de sidecar

14/06/2025 à 01:47

6 commentaires

lucas-hernandez
Membre Actif
Avatar de lucas-hernandez
lucas-hernandez
Membre Actif

salut

classique. le problème c'est que le label pod c'est le nom du pod qui inclut un hash ou un uuid. ce que tu veux c'est alerter sur le déploiement ou le service qui est derrière, pas chaque instance de pod qui échoue. essaie de regrouper par deployment ou owner.name

14/06/2025 à 23:45
tmartineau
Membre
Avatar de tmartineau
tmartineau
Membre

exactement ce que dit l'autre. utilise kube_pod_owner pour mapper les pods à leurs contrôleurs (deployment, replicaset). tu peux faire un count sur les pods failed par owner_name. ça réduit drastiquement la cardinalité et tu as une alerte par déploiement défectueux

15/06/2025 à 21:21
anais67
Auteur
Avatar de anais67
anais67
Auteur

ah ok je vois l'idée. donc au lieu de kube_pod_status_phase je ferais un truc avec kube_pod_owner ? mais comment je lie les deux pour avoir le statut failed ?

16/06/2025 à 17:49
lucas-hernandez
Membre Actif
Avatar de lucas-hernandez
lucas-hernandez
Membre Actif

tu peux utiliser un join genre group_left. un truc comme ça :


sum by (owner_name, namespace) (
  kube_pod_status_phase{phase="Failed"} * on (pod, namespace) group_left(owner_name)
  kube_pod_owner{owner_kind="Deployment"}
)

ça te donne le nombre de pods failed par déploiement. tu peux ensuite mettre un threshold là-dessus

17/06/2025 à 14:34
jacques95
Membre
Avatar de jacques95
jacques95
Membre

ouais et même plus simple si tu veux juste alerter quand un seul pod fail et pas spammer, tu peux faire un count over time sur un laps de temps plus long, ça lisse le bruit et tu captes les vrais problèmes récurrents sans créer 50k timeseries temporaires

18/06/2025 à 10:15
anais67
Auteur
Avatar de anais67
anais67
Auteur

j'ai testé la query avec group_left et c exactement ça qu'il me fallait ! maintenant j'ai une métrique agrégée par deployment, ça gère la cardinalité et l'alerte est plus pertinente. j'ai pu virer les vieilles alerts. merci un max !

19/06/2025 à 08:42

Laisser une réponse

Vous devez être connecté pour poster un message !

Rejoindre la communauté

Recevoir les derniers articles gratuitement en créant un compte !

S'inscrire