Traçage de série chronologiques de données avec Gnuplot

Gazette Linux n°126 — Mai 2006

Ron Peterson

Article paru dans le n°126 de la Gazette Linux de mai 2006.

Traduction française par Deny .

Relecture de la traduction française par Joëlle Cornavin .

Article publié sous Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Table des matières
1. Introduction
2. Préparation de quelques données
3. Traçage des données
4. Conclusion

1. Introduction

Les bons administrateurs système journalisent énormément. Beaucoup des informations que nous collectons se composent de séries chronologiques de données : un ensemble de valeurs numériques associées à une séquence de valeurs discrètes de temps.

Il existe une grande quantité d'outils pour aider l'administrateur système diligent à surveiller ces données visuellement lorsqu'elles sont collectées. Bon nombre d'entre elles sont construites à l'aide de l'excellent outil RRDTool de Tobias Oetiker. Quelques exemples notables comprennent Cacti, Cricket et Smokeping. Il y en a beaucoup d'autres.

Tout cela convient tant que vous savez ce que vous voulez surveiller. Cependant, il se peut que vous ne souhaitiez parfois effectuer qu'une brève visualisation ad hoc. Comme vous pouvez le supposer, la plupart des systèmes Linux offrent une myriade d'outils de visualisation (par exemple, Grace et Gri). Dans cet article, je vous présenterai Gnuplot>, en me concentrant plus particulièrement sur la façon de tracer des séries chronologiques de données.


2. Préparation de quelques données

Gnuplot sans données n'est pas complet. Pour argumenter ou au moins dans le but de donner matière à discuter pour la suite de cet article, j'inclue la ligne suivante dans le fichier crontab de mon système :


*/1 * * * * root /bin/cat /proc/loadavg 2>&1 | /usr/bin/logger -p local3.info -t CRON-LOADAVG

Si comme moi, vous avez configuré le fichier syslog.conf comme ci-dessous :


local3.*  /var/log/cron.log

...alors vous trouverez tous les messages de type facility local3 dans leur propre fichier spécial. Du fait que nous demandons au programme logger de tracer toutes nos données de charge moyenne, il sera facile d'extraire ces informations du reste du désordre de notre fichier journal. Un simple grep CRON-LOADAVG /var/log/cron.log > load.dat.1 devrait convenir. Voici à quoi devrait ressembler le fichier obtenu :



Mar 19 00:30:02 ahost CRON-LOADAVG: 0.40 0.78 1.19 11/296 3690
Mar 19 00:31:01 ahost CRON-LOADAVG: 3.54 1.55 1.41 4/311 3997
Mar 19 00:32:01 ahost CRON-LOADAVG: 2.68 1.59 1.43 2/278 4142

À présent extrayons seulement les données que nous voulons :



cat load.dat.1 | tr -s ' ' ' ' | cut -d' ' -f1,2,3,6 > load.dat.2

La commande de conversion tr remplace les espaces multiples par un seul espace, de sorte que nous pouvons nous attendre à un comportement plus cohérent de la commande cut. Dans ce cas, la commande de conversion tr est superflue, mais je pense néanmoins que c'est une bonne habitude à prendre. Avec un peu de chance, voici à quoi ressemblent nos données :



Mar 19 00:30:02 0.40
Mar 19 00:31:01 3.54
Mar 19 00:32:01 2.68
...

C'est presque parfait. Malheureusement, comme notre exemple tiré de gnuplot s'attendra à deux colonnes d'entrée délimitées par un espace, nous devons remplacer les espaces délimitant les composants d'horodatage par un autre caractère, comme un trait d'union.



perl -pe 's/(.*?)\s(.*?)\s(.*)/$1-$2-$3/;' load.dat.2 > load.dat.3

Comme ce n'est pas un article sur Perl, je ne vous ennuierai pas avec les détails sur le rôle de cette commande. Cependant, pour l'intérêt pédagogique, je pense qu'il est utile d'expliquer parfois les rouages. Voici à quoi ressemblent nos données à présent :



Mar-19-00:30:02 0.40
Mar-19-00:31:01 3.54
Mar-19-00:32:01 2.68


3. Traçage des données

En premier lieu, je vous donnerai un aperçu, puis j'expliquerai en détail. Créez un fichier avec le contenu suivant, en excluant les numéros de lignes. Appelez-le plot-load.conf. Modifiez la plage de dates dans la ligne 6 pour inclure l'étendue de vos données.


1  set terminal png size 1200,800
2  set xdata time
3  set timefmt "%b-%d-%H:%M:%S"
4  set output "load.png"
5  # time range must be in same format as data file
6  set xrange ["Mar-25-00:00:00":"Mar-26-00:00:00"]
7  set yrange [0:50]
8  set grid
9  set xlabel "Date\\nTime"
10 set ylabel "Load"
11 set title "Load Averages"
12 set key left box
13 plot "load.dat.3" using 1:2 index 0 title "ahost" with lines

Si vous exécutez la commande suivante, vous devriez obtenir un fichier appelé load.png. Utilisez votre afficheur d'images favori pour l'examiner. J'espère que rien de trop alarmant ne s'affiche.



cat plot-load.conf | gnuplot

La première ligne de notre commande gnuplot indique de créer un fichier PNG et donne ses dimensions. PNG n'est qu'un format parmi la myriade de formats de sortie possibles. La deuxième ligne indique que notre axe X représente des données temporelles. La troisième ligne utilise une spécification de format de date standard (reportez-vous à man date) pour indiquer à quoi ressemblent les données d'horodatage de notre fichier de données. Nous devons employer le même format dans la ligne 6, où nous indiquons l'heure de début et l'heure de fin de notre graphe. Vous pouvez omettre ceci, mais je pense qu'il est utile d'ancrer les points finaux, en particulier en traçant des sources de données multiples dans un seul graphe. La ligne 7 fixe les limites de traçage de notre axe Y.

La ligne 13 mérite un peu plus d'attention. Le nom de notre source de données s'affiche en premier lieu. L'option using 1:2 signifie extraire des donnnées des colonnes 1 et 2 de notre source de données. L'option index 0 signifie utiliser le premier ensemble de données dans le fichier. Les ensembles de données sont délimitées par des paires d'enregistrements vides. Notre fichier était simple. Il ne comportait que les col1 et col2 de l'ensemble de données zéro dans le pseudo fichier de données suivant :



# data set zero
col1 col2 col3 col4
col1 col2 col3 col4
col1 col2 col3 col4


# data set one
col1 col2 col3 col4
col1 col2 col3 col4
col1 col2 col3 col4
col1 col2 col3 col4


# data set two
col1 col2 col3 col4
col1 col2 col3 col4
col1 col2 col3 col4

En supposant que nous ayons des ensembles de données multiples dans un seul fichier (peut-être souhaitons-nous comparer les moyenns de charge d'hôtes multiples), un moyen de combiner ces données dans un seul graphe serait de développer la ligne 13 comme suit :


plot "load.dat.3" using 1:2 index 0 title "ahost" with lines, \
plot "load.dat.3" using 1:2 index 1 title "bhost" with lines, \
plot "load.dat.3" using 1:2 index 2 title "chost" with lines

4. Conclusion

Il est utile de savoir comment déployer rapidement quelques traçages de séries chronologiques, mais Gnuplot offre des capacités bien plus étendues que ce à quoi j'ai fait allusion dans cet article. J'espère vous avoir donné envie d'en apprendre encore plus.

Ron Peterson est administrateur de réseau et systèmes au Mount Holyoke College, dans les collines riantes de l'ouest du Massachusetts. Il aime enseigner à ses trois petits enfants l'influence néfaste des codecs propriétaires des contenus multimédia pendant qu'ils regardent ensemble les dessins animés de Homestar Runner.