Alertes Prometheus foireuses sur des services instables

Posté par dominique-charles le 07/10/2024
RÉSOLU

dominique-charles

Membre depuis le 16/05/2024

actif

Salut la team SRE ! On a pas mal de services qui sont un peu flappants, genre ils tombent et remontent plusieurs fois dans la journée. Du coup nos alertes Prometheus nous spamment H24, même pour des trucs qui se réparent tout seuls en 2-3 minutes. J'ai un alert rule de base qui check si up{job="mon-service"} == 0. Comment on peut rendre ça moins bruyant mais sans louper un truc vraiment down longtemps ?

Commentaires

plegendre

Membre depuis le 26/05/2019

actif

Salut ! le classique c'est d'ajouter un FOR à ton alerte. genre for 5m. ça veut dire que l'alerte ne se déclenchera que si la condition est vraie pendant 5 minutes consécutives. ça filtre déjà pas mal de flapping rapide

dominique-charles

Membre depuis le 16/05/2024

actif

ok le FOR c'est une bonne base. mais même avec FOR 5m, si un service tombe 6 minutes, remonte 2 minutes, retombe 6 minutes, ça continue de spammer. je cherche un truc un peu plus intelligent

yimbert

Membre depuis le 17/06/2024

tu peux utiliser sum_over_time ou avg_over_time avec un threshold. par exemple, si tu veux alerter si le service est down plus de 50% du temps sur les 30 dernières minutes :


- alert: ServiceFlappingTooMuch
  expr: |
    avg_over_time(up{job="mon-service"}[30m]) < 0.5
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Service {{ $labels.job }} is flapping too much"

ça prend en compte l'historique récent

plegendre

Membre depuis le 26/05/2019

actif

bonne idée le avg_over_time ! tu peux aussi jouer sur les agrégations. si tu as plusieurs instances pour ton service, tu peux alerter si un certain pourcentage des instances sont down, pas juste une seule qui fait des siennes


# Alerte si plus de 20% des instances sont down sur un job
- alert: ServicePartiallyDown
  expr: |
    (count by (job) (up{job="mon-service"} == 0) / count by (job) (up{job="mon-service"})) > 0.2
  for: 10m
  labels:
    severity: critical

maryse14

Membre depuis le 29/05/2024

pour les services vraiment chiants qui flappent mais finissent toujours par remonter, tu peux aussi regarder predict_linear. ça te permet d'alerter si une métrique (genre up ou le nombre d'erreurs) prédit qu'elle va passer sous un seuil dans X minutes. un peu plus avancé mais ça aide pour les tendances

dominique-charles

Membre depuis le 16/05/2024

actif

wow predict_linear j'avais jamais pensé à ça c'est une piste intéressante. et l'approche avec avg_over_time est super pour les services flappants, ça me parle bien. je vais essayer ça sur nos services les plus bruyants

plegendre

Membre depuis le 26/05/2019

actif

n'oublie pas les recording rules aussi si tes expressions sont trop complexes ou si tu veux réutiliser des calculs. tu peux pré-calculer avg_over_time dans une recording rule et ensuite tes alertes sont plus simples


# Recording rule
- record: service_up_ratio:30m
  expr: |
    avg_over_time(up{job="mon-service"}[30m])

ensuite ton alerte devient :


- alert: ServiceFlappingTooMuch
  expr: service_up_ratio:30m < 0.5
  for: 5m

yimbert

Membre depuis le 17/06/2024

c'est clair les recording rules c'est la vie pour maintenir la perf de prometheus et la lisibilité des alertes

dominique-charles

Membre depuis le 16/05/2024

actif

excellent ! recording rules c'est une très bonne idée pour pas alourdir le moteur d'alerte. je vais mettre en place une combinaison de for plus long, avg_over_time via une recording rule et peut-être explorer predict_linear pour les cas critiques. un énorme merci pour toutes ces pistes c'est top !

plegendre

Membre depuis le 26/05/2019

actif

pas de souci n'hésite pas si tu as d'autres questions

dominique-charles

Membre depuis le 16/05/2024

actif

merci encore !

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