10 commentaires
hmm ça sent le problème d'agrégation
si t'as plusieurs cores sur ton serveur node_cpu_seconds_total est par core
ton alerte regarde la somme de tous les cores non idle et la divise par la somme de tous les cores (idle inclus)
si un seul core spike à 100% ton agrégat sur tous les cores fera moins de 100%
ton calcul semble déjà aggreger mais t'es sûr de la division par le total incluant idle
oui c ça le piège avec node_cpu_seconds_total
faut bien diviser par le nombre de cpus
essaie avec (sum(rate(node_cpu_seconds_total{mode!="idle",instance="mon_serveur"}[5m])) by (instance) / count(node_cpu_seconds_total{mode="idle",instance="mon_serveur"}) by (instance)) * 100
ça te donnera le % d'utilisation moyenne sur tous les cores
ou un truc plus simple
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle",instance="mon_serveur"}[5m])) * 100)
ça c'est le % d'utilisation cpu moyenne globale
si tu veux détecter des spikes par core alors faut pas agréger par instance mais par cpu et instance
oui exactement l'alerte doit être par core si tu veux détecter un seul core à 100%
genre rate(node_cpu_seconds_total{mode!="idle",instance="mon_serveur",cpu="0"}[5m]) / rate(node_cpu_seconds_total{instance="mon_serveur",cpu="0"}[5m]) pour le core 0
faut faire une boucle sur les cpus ou une alerte par cpu
ok je vois mon erreur en fait je voulais la moyenne globale mais j'ai une app qui peut saturer un core unique et ça me flingue toute l'instance si je rate ça
donc je dois faire une alerte qui détecte un core unique à +80% pendant 5min
et une autre alerte pour l'utilisation cpu moyenne globale
précisément
pour le per-core spike une règle comme ça :
# prometheus rule
- alert: highcpucoreusage
expr: 100 - (rate(node_cpu_seconds_total{mode="idle"}[5m]) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "cpu core {{ $labels.instance }} ({{ $labels.cpu }}) usage is high"
description: "cpu core usage for instance {{ $labels.instance }} ({{ $labels.cpu }}) has been above 80% for 5 minutes."
ça va t'alerter sur chaque core qui dépasse le seuil
oui mais fait attention ça peut être bruyant si t'as beaucoup de cpus et des apps qui font des burst sur des cores différents
tu peux ajouter un group by (instance) ou group by (instance, job) pour agréger les alertes par machine si tu veux pas une alerte par core à chaque fois
mais si ton besoin c de capter un core unique à 100% alors la règle de user_key:2 est bien
perso j'utilise souvent topk pour identifier les N cores les plus occupés
mais pour une alerte simple la règle 100 - (rate(node_cpu_seconds_total{mode="idle"}[5m]) * 100) est nickel
juste assure-toi d'avoir les bonnes étiquettes (labels) pour l'instance et le cpu
Laisser une réponse
Vous devez être connecté pour poster un message !
salut
on a des alertes prometheus qui pètent sur des cpu spikes genre
node_cpu_seconds_totalqui monte en flèche d'un coupmais quand je regarde les graphes grafana l'utilisation cpu moyenne est genre 20%
genre ça :
sum(rate(node_cpu_seconds_total{mode!="idle", instance="mon_serveur"}[5m])) by (instance) / sum(node_cpu_seconds_total{instance="mon_serveur"}[5m]) by (instance)l'alerte est genre
cpu_usage > 0.8pour 5 minvous avez déjà eu ça ? j'ai l'impression qu'il y a un truc qui cloche avec la métrique ou la règle