En essayant d’utiliser l’agent Zabbix pour surveiller mes containers LXC, j’avais des alertes CPU en permanence. Si ça vous arrive aussi, voici pourquoi, et comment je m’en suis sorti.

Débutant avec Zabbix, une fois créé un nouveau container LXC dédié sur mon Proxmox et bien suivi un tuto d’installation (celui-là), j’ai été surpris par les alertes mémoires permanentes.

Le problème de la mémoire libre avec les containers LXC

Bien évidemment le problème, connu par ailleurs, vient du fait que les commandes Linux de type free ont tendance à raconter n’importe quoi quand on les lance à l’intérieur d’un container, puisque on se retrouve avec des infos du kernel de l’hyperviseur mélangées à celles du container.

Heureusement, il existe un module Zabbix dédié pour LXC qui fonctionne plutôt bien et s’installe simplement, fait par kvaps (qu’il en soit ici remercié). Et en effet, une fois celui-ci installé, plus d’alertes mémoire.

Par contre ce sont les alertes CPU qui commencent à ce moment là, avec des valeurs délirantes.

Alors j’ai cherché un moment, et puis ça a fait tilt.

Les alertes de Load Average

Le problème vient de la manière donc sont définies les paramètres utilisateurs par le module :

UserParameter=ct.cpu.load[*],uptime | awk -F'[, ]+' '{avg1=$(NF-2); avg5=$(NF-1); avg15=$(NF)}{print $2/'$(nproc)'}'

Si vous avez (comme moi) installé les locales FR dans votre container, ça ne fonctionne pas (ou plutôt mal). Parce que les valeurs renvoyées par uptime sont localisées !

Et donc vous obtenez, par exemple :

# uptime
 16:13:49 up 10 days, 27 min,  0 users,  load average: 2,31, 2,40, 2,37

Or le module attend quelque chose sous la forme :

# uptime
 16:13:49 up 10 days, 27 min,  0 users,  load average: 2.31, 2.40, 2.37

Du coup quand l’expression régulière qui est utilisée fait sa découpe, elle obtient des choses du type :

avg1 = 2
avg5 = 31
avg15 = 2

31, c’est trop, et boum, alerte.

Ma solution

J’ai donc fait un petit bout de script (uptime_lxc.sh ) qui transforme les virgules des décimaux en points (ce qui m’a fait réviser mes cours de bash de quand j’étais petit)

1#!/bin/bash
2var="$(uptime)" && var=$(sed 's/\([0-9]\),\([0-9]\)/\1.\2/g' <<< $var) && echo $var

(attention, la première ligne est primordiale, sinon ça râle)

Et j’ai modifié la configuration de l’agent zabbix comme suit :

UserParameter=ct.cpu.load[*],/usr/local/sbin/uptime_lxc.sh | awk -F'[, ]+' '{avg1=$(NF-2); avg5=$(NF-1); avg15=$(NF)}{print $2/'$(nproc)'}'

Et voilà, retour à la normale ! Mes containers affichent maintenant leurs vraies valeurs de load average.

Crédit photo : unsplash-logoErwan Hesry